Output ASCII art to console on succesfull pytest run

前端 未结 1 1830
有刺的猬
有刺的猬 2021-01-21 17:21

I\'m using pytest to run tests in Django project. I\'m using pytest.ini where DJANGO_SETTINGS_MODULE is defined, so I run tests with just:

pytest
相关标签:
1条回答
  • 2021-01-21 17:43

    There are lots of places where you can print your own stuff in pytest; select an appropriate hook from the hooks list and override it, adding your own printing. To spice the examples a bit up, I will print some system info using a screenfetch wrapper function:

    def screenfetch():
        exec = shutil.which('screenfetch')
        out = ''
        if exec:
            out = subprocess.run(exec, stdout=subprocess.PIPE, universal_newlines=True).stdout
        return out
    

    Custom print after test execution finished

    Create a file conftest.py in your project root dir with the following contents:

    from utils import screenfetch
    
    def pytest_unconfigure(config):
        print(screenfetch())
    

    Result:

    If you want a conditional print on successful test runs only, use pytest_sessionfinish hook to store the exit code:

    def pytest_sessionfinish(session, exitstatus):
        session.config.exitstatus = exitstatus
    
    def pytest_unconfigure(config):
        if config.exitstatus == 0:
            print(screenfetch())
    

    Another examples:

    Enhanced summary

    # conftest.py
    from utils import screenfetch
    
    def pytest_terminal_summary(terminalreporter, exitstatus, config):
        terminalreporter.ensure_newline()
        terminalreporter.write(screenfetch())
    

    Custom print before pytest output starts

    # conftest.py
    
    from utils import screenfetch
    
    def pytest_configure(config):
        print(screenfetch())
    

    Custom print after pytest's header info

    # conftest.py
    
    import screenfetch
    
    def pytest_report_header(config, startdir):
        return screenfetch()
    

    Custom print after tests collected, before test run

    # conftest.py
    
    import os
    from utils import screenfetch
    
    def pytest_collection_modifyitems(session, items):
        terminalreporter = session.config.pluginmanager.get_plugin('terminalreporter')
        terminalreporter.ensure_newline()
        terminalreporter.write(screenfetch())
    

    Custom print after each test

    def pytest_report_teststatus(report, config):
        if report.when == 'teardown':  # you may e.g. also check the outcome here to filter passed or failed tests only
            terminalreporter = config.pluginmanager.get_plugin('terminalreporter')
            terminalreporter.ensure_newline()
            terminalreporter.write(screenfetch())
    

    Note that I use terminalreporter plugin instead of just printing where possible - this is how pytest itself emits the output.

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