代码之家  ›  专栏  ›  技术社区  ›  thinwybk

如何在运行时访问pytest测试运行的总体测试结果?

  •  1
  • thinwybk  · 技术社区  · 6 年前

    取决于 pytest 测试运行我想执行条件分解。这意味着对总体测试结果的访问必须在执行所有测试之后,但在离开测试运行程序之前发生。我怎样才能做到这一点?

    1 回复  |  直到 6 年前
        1
  •  8
  •   thinwybk    6 年前

    我还没有找到合适的pytest钩子来访问整个测试结果。

    你不需要,你自己收集测试结果就行了。这是我在需要批量访问测试结果时通常使用的蓝图:

    # conftest.py
    import pytest
    
    
    def pytest_sessionstart(session):
        session.results = dict()
    
    
    @pytest.hookimpl(tryfirst=True, hookwrapper=True)
    def pytest_runtest_makereport(item, call):
        outcome = yield
        result = outcome.get_result()
    
        if result.when == 'call':
            item.session.results[item] = result
    

    现在所有测试结果都存储在 session.results 示例用法:

    # conftest.py (continued)
    
    def pytest_sessionfinish(session, exitstatus):
        print()
        print('run status code:', exitstatus)
        passed_amount = sum(1 for result in session.results.values() if result.passed)
        failed_amount = sum(1 for result in session.results.values() if result.failed)
        print(f'there are {passed_amount} passed and {failed_amount} failed tests')
    

    运行测试将产生:

    $ pytest -sv
    ================================== test session starts ====================================
    platform darwin -- Python 3.6.4, pytest-3.7.1, py-1.5.3, pluggy-0.7.1 -- /Users/hoefling/.virtualenvs/stackoverflow/bin/python3.6
    cachedir: .pytest_cache
    rootdir: /Users/hoefling/projects/private/stackoverflow/so-51711988, inifile:
    collected 3 items
    
    test_spam.py::test_spam PASSED
    test_spam.py::test_eggs PASSED
    test_spam.py::test_fail FAILED
    run status code: 1
    there are 2 passed and 1 failed tests
    
    
    ======================================== FAILURES =========================================
    _______________________________________ test_fail _________________________________________
    
        def test_fail():
    >       assert False
    E       assert False
    
    test_spam.py:10: AssertionError
    =========================== 1 failed, 2 passed in 0.05 seconds ============================
    

    编辑:

    以防 pytest 退出代码( exitstatus )是否有足够的信息(不需要有关“通过”、“失败”等的信息)请使用以下内容:

    # conftest.py
    
    def pytest_sessionfinish(session, exitstatus):
        print()
        print('run status code:', exitstatus)