Pytest框架下,有什么好的方法整体循环执行测试用例,并每轮都传入不一样的值

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机制来实现您的需求。具体步骤如下:

  1. 定义一个pytest_generate_tests函数,该函数会在测试用例生成之前被调用,在函数中我们可以动态地生成测试用例。
  2. pytest_generate_tests函数中,使用yield语句动态生成测试参数。
  3. 在测试方法上使用pytest.fixture装饰器定义一个参数,该参数会接收pytest_generate_tests函数中生成的参数。
  4. 测试方法中使用该fixture参数作为输入。

下面是一个示例代码:

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_addtest_station_search方法会按照您期望的顺序执行。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^