Python接口自动化测试之之request
一、Python 之 request
主要方法解析 requests 是 python 实现的最简单易用的 HTTP 库,requests 库7 个主要方法:
举例:普通接口测试的接口之间没有关联性,所以直接定义变量去发起get、post 请求即可。
其中 POST 的请求常用的分为 json 和 formdata,两种方式请求的参数方式如截图所示;需要鉴权的,需要导入 auth 包,然后跟在请求方法后面。
1.url: 请求地址
2.data:字典,字节序列或文件对象,作为 Request 的内容
3.json: JSON 格式的数据,作为 Request 的内容
4.headers: 字典, HTTP 定制头
5.cookie: 字典或 CooKiJar, Request 中的 cookie
6.auth: 元祖,支持 HTTP 认证功能
7.files: 字典类型,传输文件
8.timeout: 设定超时时间,秒为单位
9.proxies: 字典类型,设定访问代理服务器,可以增加登录认证
10.allow_redirects: True/False,默认为 True,重定向开关
11.stream: True/False,默认为 True,获取内容立即下载开关
12.verity: True/False 默认 Ture,认证 ssl 证书开关
13.cert: 本地 ssl 证书路径
Response 返回方法详解:
1.response.status_code #返回的 http 响应状态码
2.response.content #返回的是 bytes 型也就是二进制的数据
3.response.headers # 返回的 http 请求头
4.response.json() # 返回响应中的 Json 数据
5.response.url # 返回 url
6.response.encoding # 返回响应的编码格式
7.response.cookies # 返回响应中的 cookie
8.response.text #返回的是 Unicode 型的数据。---文本
Session 详解:
对于需要前后接口依赖的接口测试,比如从上一个请求中获取token 用作下一个接口请求的参数去提交的话,用上面一种方法明显不合适,按照上面的方法需要定义很多变量,然后根据依赖去添加到对应的请求参数里,下面这种方法,使用session 会话的方式,贯穿前后,只要添加了一次,所有请求都能用到。(这里由于项目没有必要用到cookis,所以就放了个content-type和User-Agent)
import json
import warnings
import requests, unittest
class TestCase_auto003(unittest.TestCase):
def setUp(self) -> None:
# 解决错误 ResourceWarning: Enable tracemalloc to get the object allocation traceback
warnings.simplefilter('ignore', ResourceWarning)
self.s = requests.session()
# dict = json.dumps({"mobile": "18673844852", "pwd": "123456"})
# header = {"Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Content-Type": "application/json",
# "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}
# rsp = self.s.post('http://192.168.1.173:28082/register/login/pws', data=dict, headers=header)
# self.s.headers['Cookies'] = rsp.headers['Cookies']
self.s.headers['User-Agent'] = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Mobile Safari/537.36"
self.s.headers['Content-Type'] = "application/json"
def testcase_auto001(self):
dict = json.dumps({"mobile": "18673844852", "pwd": "123456"})
rsp = self.s.post('http://192.168.1.173:28082/register/login/pws', data=dict)
print(rsp.text)
self.assertEqual(200, rsp.status_code, msg='pass')
def testcase_auto002(self):
dict = json.dumps({"bid": 96497, "uid": 96497})
rsp = self.s.post('http://192.168.1.173:28082/versions/dynamic/personal', data=dict)
print(rsp.text)
if rsp.status_code == 200:
print("pass")
else:
print("fail")
def tearDown(self) -> None:
pass
if __name__ == "__main__":
unittest.main()
解释:
1.这个是 cynthia 缺陷管理系统,登录的时候需要拿到响应里的cookie 作为下一个请求的 cookie,不然登录不上。
2.所以在 unittest 结构中,可以把登录操作放到 setup 里面,类似UI 自动化一样,登录放在初始化中。
3.在 setup 中把响应的 cookie 值,加入到请求的里面去了,同时添加了浏览器UA。
4.参数可以复用,从头到尾请求的变量都是 rsp,body 里的参数都是dict,编写简单方便。
1.定义一个变量 s 等于 requests 的 session 会话,后面都用这个s 的会话去发起请求。
2.定义一个变量等于 rsp 等于 s 去发起请求的结果。
3.s 会话请求的头文件中 cookie 需要添加 tokenid,不然登录不上,这个id 在rsp响应信息里。
4.因为响应信息是 json 字典格式,所以要添加到请求头里需要按照截图格式。
5.如果需要在字典中添加字段或者内容,按照截图的格式s.headers[‘xxx’]=“xxx”,如果字典中有这个 key:value,那么 value 值会直接更新,没有这个key 那么则会添加这个 key:value 到字典。
接口实战
使用 session 添加 token 到头文件中 在公司实际项目中,调接口首先需要获取 token,要先调用获取token 的请求,然后拿到 token 值之后,在后面接口中添加到头文件中。
![](https://img2022.cnblogs.com/blog/2264590/202204/2264590-20220427145239864-584078771.png)
self.session.headers.update({"token":rsp.json()['data']['token']})
通过在setup初始化方法中调用获取token,来拿到token的值,然后添加到整个session的 head 中去,后续请求中都不需要额外添加 head 了。
使用 ddt 对接口测试用例做参数化
ddt 数据驱动测试 首先 pip list ddt,安装第三方库,在代码最上方导入库中的data from ddt import ddt,data,在测试类前面声明 ddt,用@ddt
1、在测试用例前声明使用 data,用@data
运行结果中该用例执行了两次,分别输出的 test1 和 test2。
2、data 用法读取文件:
此方法需要解包,故需要用到 unpack 方法,在测试用例前声明@unpack 即可
解释
1:定义一个读取文件的方法,定义一个 list 数组,使用file 函数的open 方法,读取文件名为“txt1”的文件,以 read 的形式,编码格式为 utf-8,以for 循环的方式一直循环读取每一行,以\n 换行符为一行结尾,以逗号分隔每一个参数,最后返回data 值以便下方直接调用。
2:上面写了读取方法之后,在测试用例前,直接使用该方法即可,@data(*readfile())这种形式,接着使用@unpack 解包的方法即可。
三、request+unittest+HTMLTestRunner 生成测试报告
按照上述的方法编写好测试用例后,结合 unittest 框架生成报告的HTMLTestRunner来生成接口测试报告。
四、总结
这一篇教程只是接口测试中的小试牛刀,后续还有太多需要学习的,requests 库也不光可以用来做接口测试,包括爬虫之类的也是可以的,技术之路上永无止境,我们测试人员也需要多多努力。