当跳过所有测试时,pytest 总体结果“通过”

Posted

技术标签:

【中文标题】当跳过所有测试时,pytest 总体结果“通过”【英文标题】:pytest overall result 'Pass' when all tests are skipped 【发布时间】:2015-10-10 21:36:47 【问题描述】:

当前 pytest 在跳过所有测试时返回 0。跳过所有测试时,是否可以将 pytest 返回值配置为“失败”?或者是否可以在执行结束时在 pytest 中获得通过/失败的测试总数?

【问题讨论】:

【参考方案1】:

可能有一个更惯用的解决方案,但到目前为止我能想到的最好的就是这个。

修改文档的example 以将结果保存在某处。

# content of conftest.py
import pytest
TEST_RESULTS = []

@pytest.mark.tryfirst
def pytest_runtest_makereport(item, call, __multicall__):
    rep = __multicall__.execute()
    if rep.when == "call":
        TEST_RESULTS.append(rep.outcome)
    return rep

如果您想让会话在特定条件下失败,那么您可以编写一个会话范围内的固定拆解来为您做到这一点:

# conftest.py continues...
@pytest.yield_fixture(scope="session", autouse=True)
def _skipped_checker(request):
    yield
    if not [tr for tr in TEST_RESULTS if tr != "skipped"]:
        pytest.failed("All tests were skipped")

不幸的是,由此产生的失败(实际上是错误)将与会话中的最后一个测试用例相关联。

如果你想改变返回值,那么你可以写一个钩子:

# still conftest.py
def pytest_sessionfinish(session):
    if not [tr for tr in TEST_RESULTS if tr != "skipped"]:
        session.exitstatus = 10

或者只是通过 pytest.main() 调用,然后访问该变量并进行会话后检查。

import pytest
return_code = pytest.main()

import conftest
if not [tr for tr in conftest.TEST_RESULTS if tr != "skipped"]:
    sys.exit(10)
sys.exit(return_code)

【讨论】:

在这个提交中防弹,谢谢:github.com/myselfhimself/gmic-py/commit/… 行 rep = multicall.execute() 是什么意思?

以上是关于当跳过所有测试时,pytest 总体结果“通过”的主要内容,如果未能解决你的问题,请参考以下文章

pytest文档12-skip跳过用例

混合参数化和skipif时Pytest不跳过测试

Pytest框架

在 Python 中测试另一个线程的结果时,当断言失败时,PyTest 测试套件是不是通过?

16-pytest-skip跳过用例

pytest学习和使用10-Pytest中的测试用例如何跳过执行?