问题
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
Now, I want to add some ASCII art to the console output if the test run is successful. I know I can do:
pytest && cat ascii_art.txt
But I want to hide the ASCII art to config or somewhere else so that I keep running tests with just pytest
. I don't see any pytest config option I can use. Any other ideas how this could be done?
回答1:
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 print
ing where possible - this is how pytest
itself emits the output.
来源:https://stackoverflow.com/questions/53637733/output-ascii-art-to-console-on-succesfull-pytest-run