什么是脚手架
比如在测试用例运行之前 需要准备测试数据。类似JMeter中的 setUp 线程组,teardown线程组,分别表示用例执行之前 之后的操作。
pytest 内置一些方法可以支持用例运行之前,以及用例执行之后的相关操作,这些操作我们称为 “脚手架”。
使用脚手架
https://docs.pytest.org/en/7.1.x/how-to/fixtures.html
import pytest@pytest.fixture(scope='function',autouse=True)def f():print("每个测试用例运行之前的操作f()")yield # 固定print("每个用例运行之后执行的代码f()")def test_a():print('现在开始执行 test_a')def test_b():print('现在开始执行 test_b')
- @pytest.fixture(scope=’function’,autouse=True) 这个是pytest 内置的功能
- scope=’function’ 表示是函数级别 可以控制每个测试函数执行之前以及执行之后的操作。
- autouse = True 表示可以自动加载
- 函数中定义
yield是关键字- 执行之前的操作 都放在yield 关键字上面
- 执行之后的操作 都放在yield 关键字下面。
执行可以看到对应的效果。
API 应用场景
在做新丰商城的 搜索接口测试过程中,前提条件是需要有个token, 在测试这个单接口的时候。 主要是针对搜索的字段进行测试。
这个接口测试的重点是 针对 搜索的关键字进行测试,前提用户已经成功登录并且有token,所以在做这个接口测试之前需要将 token值准备好。
这个场景中就可以使用到 pytest的脚手架功能
testcases/test_xf_each_api.py
'''新丰商城 单接口测试'''import pytestfrom common.utils import generate_phoneimport requeststestdata={"token":""}base_url = "http://49.233.108.117:28019"# 注册,登录使用的是同一个手机号码 定义变量phone = generate_phone()#scope="module" 模块级别, 整个python文件运行之前和之后的操作 整个文件运行之前生成1个token@pytest.fixture(scope="module",autouse=True)def token():# 脚手架中注册并登录一个账号# 注册用户url = base_url+"/api/v1/user/register"body_data = {"loginName": phone,"password": "123456"}# 发送请求requests.post(url,json=body_data)# 登录用户url = base_url + "/api/v1/user/login"body_data = {"loginName": phone,"passwordMd5": "E10ADC3949BA59ABBE56E057F20F883E"}r = requests.post(url, json=body_data)# 设置 token# 提取变量值 tokentestdata["token"] = r.json()["data"]# 运行之前的所有操作print("已经成功获取一个token值",r.json()["data"])yieldsearch_data=['iphone','小米','华为']@pytest.mark.parametrize("key",search_data)def test_search(key):url = base_url+'/api/v1/search'header={"token": testdata["token"]}query_data={"keyword":key}# 搜索条件为 iphoner = requests.get(url, params=query_data, headers=header)# 断言# 所有搜索结果中都包含iphone# 拿到所有的商品信息allgoods = r.json()["data"]["list"]# 循环所有商品的时候for good in allgoods:# 拿到每个商品的名称goodname = good["goodsName"]print('商品的名称', goodname) # 因为返回结果中有大小写字母混合的场景。使用字符串转换大写方法assert key.upper() in goodname.upper() # upper 将字符串转为大写
运行,可以看到 在这个py 运行之前获取到token值。
可以发现这个接口中搜索中文 结果匹配并不满意。
总结
pytest中主要支持5种脚手架
- session 所有测试用例执行前后
- package 每个包中测试用例执行前后
- module 每个py文件 测试用例执行前后
- class 每个类 测试用例执行前后
- function 每个测试用例 测试用例执行前后
附件
代码
demo.zip
