什么是脚手架
比如在测试用例运行之前 需要准备测试数据。类似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 pytest
from common.utils import generate_phone
import requests
testdata={
"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
# 提取变量值 token
testdata["token"] = r.json()["data"]
# 运行之前的所有操作
print("已经成功获取一个token值",r.json()["data"])
yield
search_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
}
# 搜索条件为 iphone
r = 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