循环测试函数时如何让Pytest识别迭代次数

How to get Pytest to identify iteration number when looping test function

我正在使用 pytest 进行我正在做的测试。

我想多次执行相同的测试,同时更改种子输入。这使测试变量随机化,我认为这是个好主意。这样,如果测试失败,我可以使用相同的种子输入在不同的环境中轻松地重新创建相同的测试以查看失败的原因:

def test_foo():
    for i in range(0, 10):
        foo = random_foo('something', seed = i)

        assert subject_value(foo) == expected_value(foo)

但是,如果测试失败,Pytest 不会告诉我发生 AssertionError 时 i 的值,这使得调试几乎不可能。有什么办法可以成功做到这一点?或者这是糟糕的测试代码结构,在这种情况下,还有更好的方法吗?

该测试代码结构称为 子测试。在您的情况下,循环的每次迭代都应该是一个新的子测试。

您可能正在寻找 subtests plugin

import subtests

def test_foo():
    for i in range(10):
        with subtests.test(msg="seed", i=i):  # Add what you need to see here.
            foo = random_foo('something', seed=i)

            assert subject_value(foo) == expected_value(foo)

注意标准库 unittest.TestCase class already has 支持使用 with self.subTest() 的子测试(自 Python 3.4)。 Pytest 也可以 运行 这些标准测试用例。


此外,如果您对随机测试输入特别感兴趣,您可能会对 Hypothesis.

感兴趣