pytest: How to get a list of all failed tests at the end of the session? (and while using xdist)

后端 未结 6 835
陌清茗
陌清茗 2021-02-18 17:03

I would like to have a list of all the tests that have failed to be used at the end of session.

Pytest lets you define a hook pyt

相关标签:
6条回答
  • 2021-02-18 17:13

    Run pytest with -rf to get it to print a list of failed tests at the end.

    From py.test --help:

      -r chars              show extra test summary info as specified by chars
                            (f)ailed, (E)error, (s)skipped, (x)failed, (X)passed,
                            (p)passed, (P)passed with output, (a)all except pP.
                            Warnings are displayed at all times except when
                            --disable-warnings is set
    

    Here's what you get:

    $ py.test -rf
    ================= test session starts =================
    platform darwin -- Python 3.7.2, pytest-4.3.1, py-1.6.0, pluggy-0.7.1
    [...]
    =============== short test summary info ===============
    FAILED test_foo.py::test_foo_is_flar
    FAILED test_spam.py::test_spam_is_mostly_pork
    FAILED test_eggs.py::test_eggs_are_also_spam
    === 3 failed, 222 passed, 8 warnings in 12.52 seconds ==
    
    0 讨论(0)
  • 2021-02-18 17:13

    You can use command line option --result-log:

    test_dummy.py:

    def test_dummy_success():
        return
    
    
    def test_dummy_fail():
        raise Exception('Dummy fail')
    

    Command line:

    $ py.test --result-log=test_result.txt
    

    Content of the test_result.txt

    . test_dummy.py::test_dummy_success
    F test_dummy.py::test_dummy_fail
     def test_dummy_fail():
     >       raise Exception('Dummy fail')
     E       Exception: Dummy fail
    
     test_dummy.py:6: Exception
    

    Just search 'F' in first column and after that would be [file]::[test]

    0 讨论(0)
  • 2021-02-18 17:24

    You can get the details of only failing tests and save the logs into a file with command below. Logs also contain the trace of each test.

    py.test -rf tests/ | tee logs.txt
    
    0 讨论(0)
  • 2021-02-18 17:32

    --result-log is deprecated. You can instead use -v to output the test case names as they run. If you pipe that into a file, you can query it. So if you're running your tests from a script you can do something like:

    pytest -v | tee log.txt
    grep -E '::.*(FAILURE|ERROR)' log.txt
    
    0 讨论(0)
  • 2021-02-18 17:33

    If you want results of the tests you can use hook runtest_makereport:

    @pytest.hookimpl(tryfirst=True, hookwrapper=True)
    def pytest_runtest_makereport(item, call):
        outcome = yield
        rep = outcome.get_result()
        if rep.when == 'call' and rep.failed:
            mode = 'a' if os.path.exists('failures') else 'w'
            try:  # Just to not crash py.test reporting
              pass  # the test 'item' failed
            except Exception as e:
                pass
    
    0 讨论(0)
  • 2021-02-18 17:35

    I wanted a concise report of failed tests and parametrized variations so went with pytest_terminal_summary in conftest.py:

    def pytest_terminal_summary(terminalreporter, exitstatus, config):
        terminalreporter.section('Failed tests')
        failures = [report.nodeid.split('::')[-1]
                    for report in terminalreporter.stats.get('failed', [])]
        terminalreporter.write('\n'.join(failures) + '\n')
    

    If you inspect terminalreporter._session.items, there's more information you can add to the report, this is just what I wanted.

    0 讨论(0)
提交回复
热议问题