python接口自动化测试随笔-生活工作点滴测试基础课

接口测试基础篇(史上最详细)

2019-07-10  本文已影响166人  6780441d2bcc
接口测试基础篇

有很多小伙伴想要基础版本,从0到1,今天它来了~

用十个特别简单的案例,让你清晰的从0到1接触到接口测试

最好自己动手去写一遍这十个案例,光看是不行的

从刚开始特别简单的案例,到最后略有难度的接口小案例,让你快速清晰的学习接口!


对于接口测试,很多同学可能会说接口真的有测试的必要吗?我只把功能测试好了不就ok了吗?

答案当然是否定的,接口测试的重要性如下:

image
那么接口提测的标准是什么呢?
首先对于接口文档的要求如下:
接口名称
接口类型
输入参数
  1. 每个参数名;
  2. 每个参数类型;
  3. 每个参数业务含义;
  4. 每个是否可空;
  5. 每个字段长度(可选,一般需要提供,有严格要求的字段需特别注明);

接口通用基本要求:
  1. 返回json字段信息,不可出现 关键字类型,如 object,interface,public,java等各类语言代码中关键字类型
  2. 涉及金额等信息时应采取加密方式,后端需进行校验,防止通过接口拦截造成损失
  3. HTTPS方式传输
  4. 请求方式,一般获取数据是get,提交表单是post
  5. 信息存取可采取对称加密和非对称加密的结合(可选,也可选一种)
  6. 接口进行手机号正则验证,字符串和上传文件图片等提前规划大小限制
  7. 检查数据正确性,每个接口从数据存取数据等是否正确,是否在正确的数据库表取数据等
  8. 为空等验证一定要做,正确状态码和错误状态码一定全部记录下来,状态码代表的意思等

以上是小白自己总结和平常工作整理的,如有不对请大家指正,希望和大家一起学习进步,共同成长,谢谢


接下来用几个特别简单的案例,来接触学习接口测试之旅吧

如果你是第一次接触开发语言也不要紧,多写多思考,没有人天生就会写代码,都是慢慢学习出来的,在这里python环境如何搭建等就不在累述了,网上能搜到很多如何安装资料


建议如下:
  1. 使用最新的python版本进行学习
  2. 代码一定要多写多练多思考
  3. 学习心得,两个点第一点,多去思考,第二点多敲

准备开始吧,接口用特别简单容易理解的几种案例,带你对接口测试有一个简单的了解
环境:python3.7版本
系统:w7
工具:PyCharm
python官方文档:https://www.python.org/


在接口测试之初呢小白也是懵懵懂懂,接下来开始和小白一起学习研究接口测试吧~

1.第一个案例(发送一个get请求)

# coding=utf-8
import requests

# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送get请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
print(status)
# 请求的内容
j = r.json()

print(j)

输出结果如下:


image

2.第二个案例(发送一个post请求)

# 请求的链接
url = 'http://suggest.taobao.com/sug'

# post请求以字典格式传入
data = {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}

# 发送post请求
r = requests.post(url, data)

# 请求的状态码 200代表成功
status = r.status_code
print(status)

# 请求的内容
print(r.content)

输出结果如下:


image

(接口只返回了一个b,这里只需要明白遇到post接口怎么去请求就好了~)


3.第三个案例(进行接口状态码断言)

# coding=utf-8
import requests

# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)

# 请求的状态码 200代表成功
status = r.status_code

# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('用例测试通过')
else:
    print('测试不通过')
print(status)
# 请求的内容
j = r.json()
print(j)

输出结果如下:


image

4.第四个案例(进行接口内容断言-正常情况)

# coding=utf-8
import requests

# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('用例测试通过')
else:
    print('测试不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
if '裤子女夏' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果如下:


image

5.第五个案例(进行接口内容断言-异常情况)
在这里修改了上面的 裤子女夏 修改为 裤子女夏1

# coding=utf-8
import requests

# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
# 裤子女夏  增加了一个1
if '裤子女夏1' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果如下:


image

6.第六个案例(接口的小封装-接口和逻辑代码分开控制-~)
增加config.py主要存放接口

# coding=utf-8

# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'http://suggest.taobao.com'
# 假装是登录接口 baseurl=于楼上
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

# 假装是注冊接口
url_register = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

# 假装是首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

增加testapi.py

# coding=utf-8
import requests
# 引入config配置接口的文件
import config

# 发送请求 使用config.来调用想要的接口 调用首页接口
r = requests.get(config.url_home)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
# 裤子女夏  增加了一个1
if '裤子女夏1' in str(j):
    print('存在此数据')
else:
    print('不存在此数据')
print(j)

输出结果如下:


image

用心的同学已经发现了,这样的话每次接口变了链接等,只需要修改config文件即可 不用去逻辑代码里面去找了


7.第七个案例(接口的小封装-接口和逻辑代码分开控制-~)

不知道有没有同学发现,如果是post接口的话,参数还是需要在逻辑代码单独写吗?

接下来咱们解决这个事情~~,参数也进行分离化

config.py进行修改如下

# coding=utf-8

# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'http://suggest.taobao.com'
# 假装是登录接口
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

# 假装是注冊接口 假装是post请求 拼接成字典格式,通过吗,通过key value的形式获取
# 注册接口是key  链接是value
url_register = {'注册接口': baseurl + '/sug', 'parmras': {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}}

# 假装是首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'

testapi.py 修改如下

# coding=utf-8
import requests
# 引入config配置接口的文件
import config

# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
    print('状态码校验过')
else:
    print('状态码校验不通过')
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)

输出结果:


image

总结:用到了 字典 的小知识点,还用到了引用包的小知识点,不会的同学 可以评论区留言,或者加qq群一起学习讨论
另外网上有很多基础知识~一搜一堆的!!


8.第八个案例(接口的小封装-执行多个接口~)

这次只需要修改testapi.py即可 代码如下:

# coding=utf-8
import requests
# 引入config配置接口的文件
import config


# 测试注册接口的函数
def test_register():
    # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
    r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    # 输出状态码
    print(status)
    # 因为展示测试的接口没有json,所以只能输出content啦~
    print(r.content)


# 测试登录接口的函数
def test_login():
    # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
    r = requests.post(config.url_login)
    # 请求的状态码 200代表成功
    status = r.status_code
    # 进行接口的状态码断言,等于200则认为通过,不是200不通过
    if status == 200:
        print('状态码校验过')
    else:
        print('状态码校验不通过')
    # 输出状态码
    print(status)
    # 因为展示测试的接口没有json,所以只能输出content啦~
    print(r.json())
    # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
    expected = '裤子男夏季'
    # 将接口返回的信息转为字符串类型,in 是判断接口的返回值里面 存不存在 预期结果的值,存在就通过 不存在就不通过
    if expected in str(r.json()):
        print('断言通过')
    else:
        print('断言不通过')


# 调用执行测试接口
test_register()
print('执行了 测试注册接口的函数')
# 调用执行登录接口
test_login()
print('执行了 测试登录接口的函数')

总结:本次使用函数体的小知识点,和调用函数的小知识,如果感觉到自己不会学习赶紧去补充下自己的知识吧~
输出结果如下:


image

9.第九个案例(接口的小封装-增加)

本次引用unittest测试框架,进行断言

testapi.py修改如下

# coding=gbk
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
from applet import HMLRunner

"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""


# 创建一个类型,执行用例的类,继承unittest的testcase类
class Testcase(unittest.TestCase):

    # 测试注册接口的函数
    def test_register(self):
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        # 因为展示测试的接口没有json,所以只能输出content啦~
        print(r.content)
        print(r.text)

    # 测试登录接口的函数
    def test_login(self):
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.post(config.url_login)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)

        print(r.json())
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '裤子男夏季'
        # 获取接口的返回信息
        j = r.json()
        # 输出接口的返回信息
        print(j)
        # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
        # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
        self.assertEqual(expected, j['result'][1][0])
        print(r.text)


if __name__ == '__main__':
    import time

    # 定义测试用例的目录为当前目录
    test_dir = './'
    # 加载测试用例,根据文件路径 执行test开头的py文件
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
    # 按照一定的格式获取当前的时间
    now = time.strftime("%Y-%m-%d %H-%M-%S")

    # 定义报告存放路径 目前是存在运行的当前目录
    filename = now + 'test_result.html'
    # 打开file文件流
    fp = open(filename, "wb")
    # 定义测试报告

    runner = HMLRunner.HTMLTestRunner(stream=fp,
                                      title=u"测试报告(史无前例)",
                                      description=u"测试用例执行情况,qq群:234922431")
    # 运行测试
    runner.run(discover)
    # 关闭报告文件
    fp.close()


执行结果如下:


image

看到 Ran 2 tests in 0.212s
意思是执行了两个用例,用时0.212秒


10.第十个案例(没有测试报告是没有灵魂的~加一个测试报告)

注意事项:本次使用HTMLTestRunner,生成测试报告,这个是需要自己安装的哦~

HTMLTestRunner下载地址:https://pypi.org/project/HTMLTestRunner/

如果你不想下载可以加qq群:来拿HTMLTestRunner文件哦

也给你准备了网盘的下载链接:https://pan.baidu.com/s/1jpV98BTJ7iYutbpjJDeY6w

提取码:u8ps

testapi.py代码修改如下

# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
# 引入HTMLTestRunner生成测试报告
import HTMLTestRunner

"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""
# coding=gbk
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
from applet import HMLRunner

"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""


# 创建一个类型,执行用例的类,继承unittest的testcase类
class Testcase(unittest.TestCase):

    # 测试注册接口的函数
    def test_register(self):
        # 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
        r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)
        # 因为展示测试的接口没有json,所以只能输出content啦~
        print(r.content)
        print(r.text)

    # 测试登录接口的函数
    def test_login(self):
        # 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
        r = requests.post(config.url_login)
        # 请求的状态码 200代表成功
        status = r.status_code
        # 使用unittest的断言
        self.assertEqual(200, r.status_code)
        # 输出状态码
        print(status)

        print(r.json())
        # 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
        expected = '裤子男夏季'
        # 获取接口的返回信息
        j = r.json()
        # 输出接口的返回信息
        print(j)
        # 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
        # j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
        self.assertEqual(expected, j['result'][1][0])
        print(r.text)


if __name__ == '__main__':
    import time

    # 定义测试用例的目录为当前目录
    test_dir = './'
    # 加载测试用例,根据文件路径 执行test开头的py文件
    discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
    # 按照一定的格式获取当前的时间
    now = time.strftime("%Y-%m-%d %H-%M-%S")

    # 定义报告存放路径 目前是存在运行的当前目录
    filename = now + 'test_result.html'
    # 打开file文件流
    fp = open(filename, "wb")
    # 定义测试报告

    runner = HMLRunner.HTMLTestRunner(stream=fp,
                                      title=u"测试报告(史无前例)",
                                      description=u"测试用例执行情况,qq群:234922431")
    # 运行测试
    runner.run(discover)
    # 关闭报告文件
    fp.close()

展示效果如下:

image
image
总结:可能会遇到的小问题:如果是unittest运行的话,不会执行if name == 'main':下面的代码,所以要执行当前整个类才行,alt+shift+f10 选择当前py文件执行就能生成测试报告了~

qq群:234922431
欢迎热爱学习进步的同学,共同成长进步


如果你感觉很简单没有难度,接下来我准备了接口测试实战

框架支持如下功能:

接口自动化测试实战

这是一个从0到1的过程,一步一步搭建的测试接口框架,本教程从开始写框架的思路,和实现过程深入解析,并且深入到了每个相关的的各个细节,不论你是刚入门的菜鸟,还是一个懂编码经验的工程师,相信本系列的文章都会对你有所帮助。
你即可以学到从0到1搭建自动化的编码思想,也可以改变成一个接口自动化工具,在需要的时候可以自己更改代码和维护。

你可以收获什么?

1.完善python基础和编程思
2.有一个设计测试框架思维
3.提升自己能力,在也不怕面试没有编码经验
4.一个可以拿出手的项目,简历中的一个亮点
5.干货分享相比搜索到各种知识,这篇文章或许略有难度,但收获一定是你想不到的

快来学习吧,点击开启新的学习篇章:https://www.jianshu.com/p/57e4d0750e87
公众号:关注我为你分享更多测试干货,原创干货,和自动化实战等项目开源

image
快来学习吧,点击开启新的学习篇章:https://www.jianshu.com/p/57e4d0750e87

转载注明出处

上一篇下一篇

猜你喜欢

热点阅读