fixture的解释(chatgpt的解释,我直接抄过来的):
在 Pytest 中,Fixture 是一种用来为测试函数提供初始化数据、执行某些操作、进行测试后的清理等工作的装置。Fixture 可以被定义在测试模块或者测试文件中,也可以跨越多个测试模块或者测试文件进行共享。Fixture 能够大大简化测试用例编写的工作量,提高测试用例的可维护性、可读性、可重复性和可扩展性。
使用 Fixture 的过程中,我们需要定义一个返回测试数据或者测试环境的函数,并且给这个函数打上 @pytest.fixture 装饰器,Pytest 会自动将这个函数作为一个 Fixture 来运行。我们可以使用这个 Fixture 名称来注入测试函数中的参数中,这样测试函数就能够使用 Fixture 返回的数据或者环境了。我们也可以在测试函数中使用 Fixture 函数返回的上下文管理器,来确保测试数据的生命周期,例如在测试前的数据初始化和测试后的数据清理等操作。
1.利用fixture读取测试数据文件并返回数据
# 利用fixture读取测试数据文件并返回数据
@pytest.fixture(scope="module")
def api_data():
with open("test_fixture_token.yaml",'r',encoding='utf-8') as f:
data = yaml.safe_load(f)
return data
2.使用fixture来传递token
# 使用 api_data Fixture 来获取 token
# 获取token,使用fixture来将获取到的token进行参数传递
# 使用fixture来传递token
@pytest.fixture()
def token(api_data):
# 使用 api_data Fixture 来进行测试
# 这里读取yaml文件的时候为什么要带上[0]呢
# 因为yaml文件返回的数据类型时列表,列表里面又包含字典。根据列表的读取特性,获取下标索引。所以这里就是[0]
url = api_data['login'][0]['request']['url']
method = api_data['login'][0]['request']['method']
data = api_data['login'][0]['request']['data']
r = requests.request(url=url,method=method,json=data)
return r.json()['data']['token']
3.测试用例
# 测试用例
def test_get_all_holiday(api_data,token):
# 获取接口参数
url = api_data['holiday'][0]["request"]["url"]
method = api_data['holiday'][0]["request"]["method"]
data = api_data['holiday'][0]["request"]["data"]
# 替换 header 中的 token
# 由于日常工作中token一般是作为header传入的,所以我们这里需要将获取到的token,传入到header里面去。最后整体调用header
template_token2 = Template(api_data['holiday'][0]["request"]["header"]['token'])
api_data['holiday'][0]["request"]["header"]['token'] = template_token2.safe_substitute({"token":"{0}".format(token)})
headers = api_data['holiday'][0]["request"]["header"]
# 发送请求并验证响应结果
r = requests.request(url=url, method=method, json=data, headers=headers)
print(r.json())
# return r.json()
4.yaml文件内容
login:
- name: 登录并返回token
request:
method: post
url: http://登录接口
data:
account: pos
password: 2
header:
expect:
code: 0
holiday:
- name: 使用token
request:
method: post
url: http://使用到token的接口
data:
startTime:
endTime:
currPage: 1
pageSize: 10
unitId:
header:
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Length: str(68)
Content-Type: application/json;charset=UTF-8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
# 将token的值使用参数化,方便我们后面替换它
token: $token
5.整体代码
import requests
from string import Template
import pytest
import yaml
# 利用fixture读取测试数据文件并返回数据
@pytest.fixture(scope="module")
def api_data():
with open("test_fixture_token.yaml",'r',encoding='utf-8') as f:
data = yaml.safe_load(f)
return data
# 使用 api_data Fixture 来获取 token
# 获取token,使用fixture来将获取到的token进行参数传递
# 使用fixture来传递token
@pytest.fixture()
def token(api_data):
# 使用 api_data Fixture 来进行测试
# 这里读取yaml文件的时候为什么要带上[0]呢
# 因为yaml文件返回的数据类型时列表,列表里面又包含字典。根据列表的读取特性,获取下标索引。所以这里就是[0]
url = api_data['login'][0]['request']['url']
method = api_data['login'][0]['request']['method']
data = api_data['login'][0]['request']['data']
r = requests.request(url=url,method=method,json=data)
return r.json()['data']['token']
# 测试用例
def test_get_all_holiday(api_data,token):
# 获取接口参数
url = api_data['holiday'][0]["request"]["url"]
method = api_data['holiday'][0]["request"]["method"]
data = api_data['holiday'][0]["request"]["data"]
# 替换 header 中的 token
# 由于日常工作中token一般是作为header传入的,所以我们这里需要将获取到的token,传入到header里面去。最后整体调用header
template_token2 = Template(api_data['holiday'][0]["request"]["header"]['token'])
api_data['holiday'][0]["request"]["header"]['token'] = template_token2.safe_substitute({"token":"{0}".format(token)})
headers = api_data['holiday'][0]["request"]["header"]
# 发送请求并验证响应结果
r = requests.request(url=url, method=method, json=data, headers=headers)
print(r.json())
# return r.json()
if __name__ == '__main__':
pytest("-v","-s","test_ai_union_token.py")
7.来看看chatgpt的解释:
在这个代码中,api_data 是一个 Fixture,它是用来读取测试数据的。为什么要使用 Fixture 呢?主要是因为 Fixture 可以在测试运行之前和之后自动运行一些代码,来帮助我们进行测试的前置和后置操作,例如读取测试数据、初始化测试环境、清理测试数据等。
在这个例子中,api_data 用来读取测试数据,这是一个很常见的 Fixture 的使用场景。因为测试数据通常比较多,而且需要被多个测试函数共享,所以我们把读取测试数据的代码放到一个 Fixture 中,然后在需要使用测试数据的测试函数中通过参数注入这个 Fixture,来方便地使用测试数据。这样做的好处是,我们可以将测试数据和测试函数分离,使得测试代码更加清晰和易于维护。
6.总结
这段代码为什么没有使用parametrize来达到参数化呢,其实fixture也可以达到参数化的效果。两者达到的效果都一样。喜欢用什么就用。至与这里如果要使用parametrize的话似乎比较麻烦,我也不知道怎么去处理。不过我还是更喜欢上面这种方法。省事。
方法一传送入口:https://blog.csdn.net/weixin_42619126/article/details/130034294?spm=1001.2014.3001.5502
读取和写入的方法来达到token传递:https://blog.csdn.net/weixin_42619126/article/details/123342715?spm=1001.2014.3001.5502