在成功的 pytest 运行 上输出 ASCII 艺术到控制台
Output ASCII art to console on succesfull pytest run
我在 Django 项目中使用 pytest 运行 测试。我在定义 DJANGO_SETTINGS_MODULE 的地方使用 pytest.ini,所以我 运行 测试只用:
pytest
现在,如果测试 运行 成功,我想在控制台输出中添加一些 ASCII 艺术。我知道我能做到:
pytest && cat ascii_art.txt
但我想将 ASCII 艺术隐藏到配置或其他地方,以便我只用 pytest
保持 运行ning 测试。我没有看到任何可以使用的 pytest 配置选项。还有其他想法吗?
在 pytest
中有很多地方可以打印您自己的东西; select 来自 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
包装函数的适当钩子:
def screenfetch():
exec = shutil.which('screenfetch')
out = ''
if exec:
out = subprocess.run(exec, stdout=subprocess.PIPE, universal_newlines=True).stdout
return out
测试执行完成后自定义打印
在您的项目根目录中创建一个文件 conftest.py
,内容如下:
from utils import screenfetch
def pytest_unconfigure(config):
print(screenfetch())
结果:
如果您只想在成功测试 运行 时进行条件打印,请使用 pytest_sessionfinish
挂钩来存储退出代码:
def pytest_sessionfinish(session, exitstatus):
session.config.exitstatus = exitstatus
def pytest_unconfigure(config):
if config.exitstatus == 0:
print(screenfetch())
另一个例子:
增强摘要
# conftest.py
from utils import screenfetch
def pytest_terminal_summary(terminalreporter, exitstatus, config):
terminalreporter.ensure_newline()
terminalreporter.write(screenfetch())
pytest
输出开始前自定义打印
# conftest.py
from utils import screenfetch
def pytest_configure(config):
print(screenfetch())
在 pytest
的 header 信息后自定义打印
# conftest.py
import screenfetch
def pytest_report_header(config, startdir):
return screenfetch()
测试收集后自定义打印,测试前运行
# 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())
每次测试后自定义打印
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())
请注意,我在可能的情况下使用 terminalreporter
插件而不只是 print
ing - 这就是 pytest
本身发出输出的方式。
我在 Django 项目中使用 pytest 运行 测试。我在定义 DJANGO_SETTINGS_MODULE 的地方使用 pytest.ini,所以我 运行 测试只用:
pytest
现在,如果测试 运行 成功,我想在控制台输出中添加一些 ASCII 艺术。我知道我能做到:
pytest && cat ascii_art.txt
但我想将 ASCII 艺术隐藏到配置或其他地方,以便我只用 pytest
保持 运行ning 测试。我没有看到任何可以使用的 pytest 配置选项。还有其他想法吗?
在 pytest
中有很多地方可以打印您自己的东西; select 来自 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
包装函数的适当钩子:
def screenfetch():
exec = shutil.which('screenfetch')
out = ''
if exec:
out = subprocess.run(exec, stdout=subprocess.PIPE, universal_newlines=True).stdout
return out
测试执行完成后自定义打印
在您的项目根目录中创建一个文件 conftest.py
,内容如下:
from utils import screenfetch
def pytest_unconfigure(config):
print(screenfetch())
结果:
如果您只想在成功测试 运行 时进行条件打印,请使用 pytest_sessionfinish
挂钩来存储退出代码:
def pytest_sessionfinish(session, exitstatus):
session.config.exitstatus = exitstatus
def pytest_unconfigure(config):
if config.exitstatus == 0:
print(screenfetch())
另一个例子:
增强摘要
# conftest.py
from utils import screenfetch
def pytest_terminal_summary(terminalreporter, exitstatus, config):
terminalreporter.ensure_newline()
terminalreporter.write(screenfetch())
pytest
输出开始前自定义打印
# conftest.py
from utils import screenfetch
def pytest_configure(config):
print(screenfetch())
在 pytest
的 header 信息后自定义打印
# conftest.py
import screenfetch
def pytest_report_header(config, startdir):
return screenfetch()
测试收集后自定义打印,测试前运行
# 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())
每次测试后自定义打印
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())
请注意,我在可能的情况下使用 terminalreporter
插件而不只是 print
ing - 这就是 pytest
本身发出输出的方式。