pytest参数化的类方法执行顺序

时间:2018-09-05 08:17:56

标签: python pytest

例如,我有一个像这样的pytest文件:

@pytest.mark.parametrize("param",[1,2])
class TestTest():
    def test_1(self, param):
        pass
    def test_2(self,param):
        pass

当我将其作为输出运行时,我得到:

test_tmp.py::TestTest::test_1[1]
test_tmp.py::TestTest::test_1[2]
test_tmp.py::TestTest::test_2[1]
test_tmp.py::TestTest::test_2[2]

这不是我期望的顺序。有没有一种方法可以按此顺序运行测试:

test_tmp.py::TestTest::test_1[1]
test_tmp.py::TestTest::test_2[1]
test_tmp.py::TestTest::test_1[2]
test_tmp.py::TestTest::test_2[2]

例如使用第一个参数运行所有类方法,然后使用第二个参数运行。

2 个答案:

答案 0 :(得分:0)

您无需在py.test中编写类:

@pytest.mark.parametrize("param",[1,2])
def test_1(param):
    pass

@pytest.mark.parametrize("param",[1,2])
def test_2(param):
    pass

将按所需顺序运行测试。

答案 1 :(得分:0)

在您的情况下,我们正在谈论将不同参数应用于不同测试的顺序。 Pytest使用所有参数运行每个测试,然后执行下一个测试,依此类推。

如果出于某种原因需要使用相同的参数运行两个测试,然后再使用其他参数运行它们,依此类推,我认为这意味着实际上这只是一个带有参数的复杂测试,您不应编写作为两个单独的pytest测试。

通常,您可以使用pytest-ordering自己订购测试。 或在pytest hook

中自己实现相同的功能
pytest_collection_modifyitems(session, config, items)

(重新排列项目)。

但是,这种糟糕的做法是期望测试将以某种特定的顺序运行。 他们应该是无国籍和独立的。 毕竟将来可能需要并行测试执行或使用测试的某些子集。 无论如何,如果测试取决于执行顺序,那么它们将很难维护。

如果您只需要一些有序的结果,请使用报告工具(例如yandex allure)。