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

标签 python testing pytest random-seed

我正在使用 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.TestCasealready has支持使用 with self.subTest() 进行子测试(自 Python 3.4 起)。 Pytest 也可以运行这些标准测试用例。


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

关于python - 循环测试函数时如何让Pytest识别迭代次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58148428/

相关文章:

ruby-on-rails - 为什么这个 Rails Controller 测试失败了?

grails - Grails 插件服务与 GORM 的集成测试应该有效吗?

python - 我们可以在 pytest 的 setup_module() 或 setup_class 中打印命令行参数吗?

python - Pytest - 功能级别的 fixture 自省(introspection)

python - 你应该在 Python 中测试原始函数吗?

python - 将函数应用于 Python 中列表的一个元素

python - 创建与 EXCEL OFFSET 函数等效的 pandas 函数

python - 将从 os.walk 接收到的路径放入 cmd 中以在 Windows 终端上运行 - python

java - 通过 jUnit 的 BDD Cucumber 测试

python - 使用 Paramiko 保留时间戳