Pytest框架下,有什么好的方法整体循环执行测试用例,并且每轮都传入不一样的值吗?比如:
@pytest.mark.parametrize('a', [1, 2])
class TestStreamData:
def test_station_add(self, a):
response = requests.post(url, headers=headers, data=json.dumps(a))
assert response.json()['code'] == 200
def test_station_search(self):
response = requests.get(url, headers=headers)
assert response.json()['code'] == 200
对上面测试类想一轮传入1,然后顺序执行test_station_add和test_station_search;然后第二轮传入2,再执行一遍test_station_add和test_station_search。
对测试类使用@pytest.mark.parametrize('a', [1, 2])
显然不符合要求,执行结果变成了test_station_add、test_station_add、test_station_search、test_station_search。
所以各位大能有什么好的方法吗,感激不尽!
通过repeat和conftest可以实现
【以下回答由 GPT 生成】
您可以使用pytest_generate_tests
钩子函数结合pytest的fixture机制来实现您的需求。具体步骤如下:
pytest_generate_tests
函数,该函数会在测试用例生成之前被调用,在函数中我们可以动态地生成测试用例。pytest_generate_tests
函数中,使用yield
语句动态生成测试参数。pytest.fixture
装饰器定义一个参数,该参数会接收pytest_generate_tests
函数中生成的参数。下面是一个示例代码:
import pytest
def pytest_generate_tests(metafunc):
if 'a' in metafunc.fixturenames:
for i in range(1, 3): # 生成 1 到 2 的数字
metafunc.parametrize('a', [i], indirect=True)
@pytest.fixture
def a(request):
return request.param
class TestStreamData:
def test_station_add(self, a):
# 使用传入的参数 a 进行测试
assert a > 0 # 示例断言
def test_station_search(self, a):
# 使用传入的参数 a 进行测试
assert a < 3 # 示例断言
在这个例子中,pytest_generate_tests
函数会在测试用例生成之前被调用,并且每次生成一个新的参数'a
',通过yield
语句将其传递给测试方法。然后在测试方法中,使用a
作为输入进行对应的测试操作。
这样,您就可以实现整体循环执行测试用例,并且每轮都传入不同的值。每轮执行时,test_station_add
和test_station_search
方法会按照您期望的顺序执行。