Python 在测试类中参数化测试时维护测试执行顺序

Python 在测试类中参数化测试时维护测试执行顺序,python,pytest,Python,Pytest,我正试图将我的测试参数化,如下所示 @pytest.mark.parametrize("a,b", test_data) class TestClass(): def test_A(self,a,b): # Some Code .. pass def test_B(self,a,b): # Some Code .. pass def test_C(self,a,b): # Some Code

我正试图将我的测试参数化,如下所示

@pytest.mark.parametrize("a,b", test_data)
class TestClass():
    def test_A(self,a,b):
        # Some Code ..
        pass
    def test_B(self,a,b):
        # Some Code ..
        pass
    def test_C(self,a,b):
        # Some Code ..
        pass
for data in test_data:
    a,b = data
    def test_A(a,b):
        # Some Code ..
        pass
    def test_B(a,b):
        # Some Code ..
        pass
    def test_C(a,b):
        # Some Code ..
        pass
我希望我的测试像测试步骤一样按顺序执行,例如

test_A
test_B
test_C
test_A
test_B
test_C
....
他们被执行的顺序是

test_A
test_A
...
test_B
test_B
...
test_C
test_C
我尝试过的另一种选择是将测试放入for循环,如下所示

@pytest.mark.parametrize("a,b", test_data)
class TestClass():
    def test_A(self,a,b):
        # Some Code ..
        pass
    def test_B(self,a,b):
        # Some Code ..
        pass
    def test_C(self,a,b):
        # Some Code ..
        pass
for data in test_data:
    a,b = data
    def test_A(a,b):
        # Some Code ..
        pass
    def test_B(a,b):
        # Some Code ..
        pass
    def test_C(a,b):
        # Some Code ..
        pass

这给了我所需的顺序,但测试名称在所有迭代中都保持不变,因此在报告中会产生问题。

我最终能够使用pytest\u generate\u tests钩子实现这一点

def pytest_generate_tests(metafunc):
    argvalues = []
    for data in metafunc.cls.data:
        items = data.items()
        argnames = [x[0] for x in items]
        argvalues.append(([x[1] for x in items]))
    metafunc.parametrize(argnames, argvalues, scope="class"

class TestClass:
    data = [{'attr_1': 'val_1_1', 'attr_2': 'val_1_2'}, {'attr_1': 'val_2_1', 'attr_2': 'val_2_2'}]

    def test_A(self, attr_1, attr_2)
    ...

    def test_B(self, attr_1, attr_2)
    ...

    def test_B(self, attr_1, attr_2)
    ...

好的单元测试不应该关心顺序。pytest可以做安装/拆卸风格的事情。一般来说,我同意,但总有特定的要求。我的测试在某种意义上是独立的,如果B在a之前执行,或者C在B之前执行,这都无关紧要。唯一的要求是A、B和C都应首先对1组数据执行,然后对第二组数据执行。为什么需要按特定顺序运行它们?因为对于每个输入参数,需要在UUT中进行一些配置,这是一项耗时的工作。所以我只想为每一组Datapytest装置做一次。