【问题标题】:How to run multiple tests with pytest with a qualifier test如何使用带有限定符测试的 pytest 运行多个测试
【发布时间】:2020-02-13 07:11:18
【问题描述】:

我有一个 pytest 测试文件的目录,并且有一个需要测试的限定符测试,如果它失败则停止执行任何进一步的测试,但如果它通过则执行所有测试,无论是否通过。 我有一个具有以下结构的目录:

tests/
test_qualifier.py
test_one.py
test_two.py
...

现在,当我使用 pytest test/ -x 运行测试时,它会运行所有测试,因为它会在第一次失败时停止。 我希望pytest 运行test_qualifier.py,如果它失败则停止进一步执行,但如果它通过则不要停止任何测试是否失败。

【问题讨论】:

  • 这不是问题。请扩展它并考虑包含代码 sn-ps 显示您如何运行它。

标签: python pytest


【解决方案1】:

一般来说,这不是一个很有意义的功能,所以我看不到 pytest 开箱即用地支持它。

但是您可以自己推出它:在 test_qualifier 中,创建一个 autouse 固定装置,如果其中一个测试失败,则 checks the result of the test 并调用类似 pytest.exit 的东西。如果你想要正确的报告,也许检查--exitfirst 的工作原理,我不知道直接调用pytest.exit 是否会生成正常的失败报告,所以这可能不太好。

除了pytest.exit,您还可以设置一个内部标志,a test running hook 将使用该标志自动跳过所有以后的测试。

您可能还想编写一个与pytest_collection_modifyitems 挂钩的conftest 插件,以确保您的资格测试始终先运行,并且您不会受到脏乱的迭代或字母顺序的影响。

【讨论】:

    【解决方案2】:

    您可以使用 pytest-depends 插件。将其他测试标记为依赖于 test_qualifier。

    来自plugin page

    这个 pytest 插件允许你声明 pytest 测试之间的依赖关系,如果依赖的测试没有成功,则依赖的测试将不会运行。

    当然,测试应该尽可能自包含,但这并不意味着它没有很好的用途。

    当一个测试失败意味着另一个测试也不可能成功时,这可能很有用,尤其是对于较慢的测试。这不是测试 A 为测试 B 设置东西的意义上的依赖关系,但更多的是如果测试 A 失败,也没有理由打扰测试 B。

    代码示例:

    BUILD_PATH = 'build'
    
    def test_build_exists():
        assert os.path.exists(BUILD_PATH)
    
    @pytest.depends(on=['test_build_exists'])
    def test_build_version():
        result = subprocess.run([BUILD_PATH, '--version', stdout=subprocess.PIPE)
        assert result.returncode == 0
        assert '1.2.3' in result.stdout
    

    您可以通过使用 pytest 钩子编写自己的 pytest 插件来实现相同的目的。

    【讨论】:

    • 它有效,谢谢。但是我遇到了另一个问题,我需要运行测试套件 N 次,为此我使用了命令行选项“--count N”,所以每当我给计数超过 1 时,每次都会跳过相关测试。不确定是什么导致测试跳过:(
    • 那是一个单独的问题。需要一个工作代码示例来调试该问题。而且,您必须使用 pytest-repeat 插件来重复测试。还需要研究该插件的内部结构以了解问题所在。
    猜你喜欢
    • 2022-08-19
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2018-01-25
    • 2018-03-28
    相关资源
    最近更新 更多