我一直在翻阅文档,但是我不知道如何让py.test写入日志以获取通过的测试。例如,如果我运行" py.test --resultlog = mylog.txt myPytest.py" mylog.txt只为每个通过的测试都有一行。我想在我的日志文件中记录的每个测试中添加其他内容,无论您是通过还是失败。例如,我需要知道它们运行的时间,一些输出数据等。如何让py.test在py.test日志文件中包含有关测试(传递和失败)的数据?
答案 0 :(得分:1)
您可以查看junitxml输出是否提供了更多信息。但我怀疑,如果你想要实际时间而不是持续时间等,你将不得不编写自己的插件。该文档为您提供了相关的钩子:http://pytest.org/latest/plugins.html?highlight=hooks#reporting-hooks
答案 1 :(得分:1)
pytest现在支持-s参数,以防止捕获日志调用以传递测试。
pytest -s
-s,-capture = no通常会捕获stdout和stderr,仅显示失败的测试。 -s选项可用于禁用捕获, 显示stdcalls用于打印语句,记录调用等。
答案 2 :(得分:0)
你可以使用py-cov结合pytest
py.test --cov $(MOD_NAME) --cov-config .coveragerc --cov-report xml --junit-xml=results.xml
在这里,您将获得所需的所有信息,因为我们习惯将coverage.xml文件推送到sonarqube并获取所有可用数据。
如果您确实需要来自测试功能的自定义数据/日志,请传递-s
,这样pytest将停止捕获输出并将其打印在控制台上(您可以将其流式传输到文件中,不太好)
答案 3 :(得分:0)
此钩子是实验性的,每次断言通过时都会被调用。 从文档-
在传递断言后,使用此钩子进行一些处理。原始断言信息位于 expl字符串中提供了orig字符串和pytest自省的断言信息。
此挂钩必须由 enable_assertion_pass_hook ini文件选项:
[pytest]
enable_assertion_pass_hook=true
启用此选项时,需要清除项目目录和解释器库中的.pyc文件,如下所示: 断言将需要重新编写。
import logging
log = logging.getLogger(__name__)
def pytest_assertion_pass(item, lineno, orig, expl):
"""
Prints the log(log file) every time the assert passes
"""
log.info(str(item) + ' | lineno: ' + str(lineno) + ' | ' + orig + ' | PASS')