gpt4 book ai didi

python - Pytest 捕获某个测试的标准输出

转载 作者:行者123 更新时间:2023-12-03 08:32:17 26 4
gpt4 key购买 nike

有没有一种方法可以为特定测试获取捕获的标准输出调用,而不会导致测试失败?

假设我有 10 个测试,外加一个 test_summary。 test_summary 实际上只是打印某种测试的摘要/统计数据,但为了让我获得该输出/打印输出,我目前必须故意使该测试失败。当然,这个 test_summary 最后使用 pytest-ordering 运行。但是有没有更好的方法可以在不通过测试的情况下获得结果呢?或者它不应该在测试中,而应该更多地在conftest.py 或其他东西中?请就最佳实践以及如何获得此摘要/结果提出建议(基本上是我编写的特定脚本的打印输出)

最佳答案

首先,回答您的确切问题:

Is there a way get the Captured stdout call just for a specific test without failing the test?

您可以添加一个模仿捕获的标准输出调用的自定义部分,并在测试成功时打印。每个测试中捕获的输出都存储在相关的 TestReport 对象中,并通过 report.capstdout 访问。示例实现:将以下代码添加到项目或测试根目录中的 conftest.py 中:

import os

def pytest_terminal_summary(terminalreporter, exitstatus, config):
# on failures, don't add "Captured stdout call" as pytest does that already
# otherwise, the section "Captured stdout call" will be added twice
if exitstatus > 0:
return
# get all reports
reports = terminalreporter.getreports('')
# combine captured stdout of reports for tests named `<smth>::test_summary`
content = os.linesep.join(
report.capstdout for report in reports
if report.capstdout and report.nodeid.endswith("test_summary")
)
# add custom section that mimics pytest's one
if content:
terminalreporter.ensure_newline()
terminalreporter.section(
'Captured stdout call',
sep='-',
blue=True,
bold=True,
)
terminalreporter.line(content)

这将添加一个自定义部分Captured stdout call,该部分将仅打印为ID以test_summary结尾的测试捕获的输出(如果您有多个名为test_summary,扩展检查)。为了区分这两个部分,自定义部分有一个蓝色标题;如果您希望它与原始版本匹配,请通过 blue=True arg 删除颜色设置。


现在,解决您的实际问题:

test_summary really just prints some kind of summary/statistics of the tests

对我来说,使用自定义报告测试很像一种解决方法;为什么不在测试中收集数据并添加一个自定义部分,然后打印该数据?要收集数据,您可以例如使用record_property固定装置:

def test_foo(record_property):
# records a key-value pair
record_property("hello", "world")


def test_bar(record_property):
record_property("spam", "eggs")

要收集并输出记录的自定义属性,请稍微更改上面的 hookimpl。通过 record_property 存储的数据可通过 report.user_properties 访问:

import os


def pytest_terminal_summary(terminalreporter, exitstatus, config):
reports = terminalreporter.getreports('')
content = os.linesep.join(
f'{key}: {value}' for report in reports
for key, value in report.user_properties
)
if content:
terminalreporter.ensure_newline()
terminalreporter.section(
'My custom summary',
sep='-',
blue=True,
bold=True
)
terminalreporter.line(content)

运行上述测试现在会产生:

$ pytest test_spam.py 
=============================== test session starts ================================
platform linux -- Python 3.9.0, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: /home/oleg.hoefling/projects/private/stackoverflow/so-64812992
plugins: metadata-1.10.0, json-report-1.2.4, cov-2.10.1, forked-1.3.0, xdist-2.1.0
collected 2 items

test_spam.py .. [100%]

-------------------------------- My custom summary ---------------------------------
hello: world
spam: eggs
================================ 2 passed in 0.01s =================================

关于python - Pytest 捕获某个测试的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64812992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com