- Pytest:帮助您编写更好的程序
- 完整的 Pytest 文档
- 安装和入门
- 使用和调用
- 在现有测试套件中使用 pytest
- 测试中断言的编写和报告
- Pytest 夹具:显式、模块化、可扩展
- 用属性标记测试函数
- MonkeyPatching / Mocking 模块和环境
- 临时目录和文件
- 捕获 stdout/stderr 输出
- 捕获警告
- 模块和测试文件的 Doctest 集成
- 跳过和 xfail:处理无法成功的测试
- 参数化夹具和测试功能
- 缓存:使用交叉测试运行状态
- UnitTest.TestCase 支持
- 运行为鼻子编写的测试
- 经典的 Xunit 风格设置
- 安装和使用插件
- 编写插件
- 登录
- 良好的集成实践
- 古怪的测试
- Pytest 导入机制和 sys.path/PYTHONPATH
- 设置 bash 完成
- API 引用
- _pytest.hookspec
- _pytest.python_api
- _pytest.outcomes
- _pytest.config
- _pytest.mark
- _pytest.recwarn
- _pytest.assertion
- _pytest.freeze_support
- _pytest.fixtures
- _pytest.cacheprovider
- _pytest.capture
- _pytest.doctest
- _pytest.junitxml
- _pytest.logging
- _pytest.monkeypatch
- _pytest.pytester
- _pytest.tmpdir
- _pytest.python
- _pytest.nodes
- _pytest.reports
- _pytest._code.code
- _pytest.config.argparsing
- _pytest.main
- pluggy.callers
- _pytest.config.exceptions
- py.test 2.0.0:断言++、UnitTest++、Reporting++、Config++、Docs++
- 示例和自定义技巧
- 配置
- 贡献开始
- 向后兼容策略
- Python 2.7 和 3.4 支持
- 企业版 pytest
- 项目实例
- 历史笔记
- 弃用和移除
- 发展指南
- 演讲和辅导
登录
pytest捕获级别的日志消息 WARNING
或更高版本自动显示,并以捕获stdout和stderr的相同方式在各自的部分中显示每个失败的测试。
无选项运行:
pytest
显示失败的测试,如:
----------------------- Captured stdlog call ---------------------- test_reporting.py 26 WARNING text going to logger ----------------------- Captured stdout call ---------------------- text going to stdout ----------------------- Captured stderr call ---------------------- text going to stderr ==================== 2 failed in 0.02 seconds =====================
默认情况下,每个捕获的日志消息显示模块、行号、日志级别和消息。
如果需要,可以通过传递特定格式选项,将日志和日期格式指定给日志模块支持的任何内容:
pytest --log-format="%(asctime)s %(levelname)s %(message)s" \ --log-date-format="%Y-%m-%d %H:%M:%S"
显示失败的测试,如:
----------------------- Captured stdlog call ---------------------- 2010-04-10 14:48:44 WARNING text going to logger ----------------------- Captured stdout call ---------------------- text going to stdout ----------------------- Captured stderr call ---------------------- text going to stderr ==================== 2 failed in 0.02 seconds =====================
这些选项也可以通过 pytest.ini
文件:
[pytest] log_format = %(asctime)s %(levelname)s %(message)s log_date_format = %Y-%m-%d %H:%M:%S
此外,还可以完全禁用对失败测试中捕获的内容(stdout、stderr和logs)的报告,方法是:
pytest --show-capture=no
拼图夹具
在测试中,可以更改捕获的日志消息的日志级别。这是由 caplog
固定装置:
def test_foo(caplog): caplog.set_level(logging.INFO) pass
默认情况下,级别是在根日志记录器上设置的,但是为了方便起见,也可以设置任何记录器的日志级别:
def test_foo(caplog): caplog.set_level(logging.CRITICAL, logger="root.baz") pass
日志级别集将在测试结束时自动还原。
It is also possible to use a context manager to temporarily change the log level inside a with
block:
def test_bar(caplog): with caplog.at_level(logging.INFO): pass
同样,默认情况下,根日志记录器的级别会受到影响,但任何记录器的级别都可以更改为:
def test_bar(caplog): with caplog.at_level(logging.CRITICAL, logger="root.baz"): pass
最后,在测试运行期间发送给记录器的所有日志都以 logging.LogRecord
实例和最终日志文本。当您要对消息的内容进行断言时,这很有用:
def test_baz(caplog): func_under_test() for record in caplog.records: assert record.levelname != "CRITICAL" assert "wally" not in caplog.text
有关日志记录的所有可用属性,请参阅 logging.LogRecord
类。
你也可以求助于 record_tuples
如果您所要做的只是确保某些消息已以给定的记录器名称记录,并且具有给定的严重性和消息:
def test_foo(caplog): logging.getLogger().info("boo %s", "arg") assert caplog.record_tuples == [("root", logging.INFO, "boo arg")]
你可以打电话 caplog.clear()
要在测试中重置捕获的日志记录,请执行以下操作:
def test_something_with_clearing_records(caplog): some_method_that_creates_log_records() caplog.clear() your_test_method() assert ["Foo"] == [rec.message for rec in caplog.records]
这个 caplog.records
属性只包含当前阶段的记录,因此在 setup
阶段它只包含安装日志,与 call
和 teardown
阶段。
要从其他阶段访问日志,请使用 caplog.get_records(when)
方法。例如,如果要确保使用某个fixture的测试从不记录任何警告,可以检查记录中的 setup
和 call
拆卸过程中的阶段如下:
@pytest.fixture def window(caplog): window = create_window() yield window for when in ("setup", "call"): messages = [ x.message for x in caplog.get_records(when) if x.levelno == logging.WARNING ] if messages: pytest.fail( "warning messages encountered during testing: {}".format(messages) )
完整的API可在 _pytest.logging.LogCaptureFixture
.
活原木
通过设置 log_cli
配置选项到 true
,pytest将在日志记录直接发送到控制台时输出这些记录。
您可以指定日志级别,通过传递将具有相同或更高级别的日志记录打印到控制台。 --log-cli-level
. 此设置接受日志级别名称(如python文档中所示)或整数作为日志级别num。
此外,还可以指定 --log-cli-format
和 --log-cli-date-format
哪个镜像默认为 --log-format
和 --log-date-format
如果未提供,但仅应用于控制台日志记录处理程序。
所有的cli日志选项也可以在配置ini文件中设置。选项名称为:
log_cli_level
log_cli_format
log_cli_date_format
如果需要将整个测试套件日志记录调用记录到一个文件中,则可以通过 --log-file=/path/to/log/file
. 此日志文件以写模式打开,这意味着它将在每个运行测试会话中被覆盖。
还可以通过传递来指定日志文件的日志级别 --log-file-level
. 此设置接受在Python文档中看到的日志级别名称(即大写级别名称)或整数作为日志级别num。
此外,还可以指定 --log-file-format
和 --log-file-date-format
等于 --log-format
和 --log-date-format
但应用于日志文件日志记录处理程序。
所有日志文件选项也可以在配置ini文件中设置。选项名称为:
log_file
log_file_level
log_file_format
log_file_date_format
你可以调用 set_log_path()
动态自定义日志文件路径。考虑到该功能 实验的 .
发行说明
此功能是作为 pytest-catchlog 插件和它们相互冲突。向后兼容API pytest-capturelog
在引入此功能时已删除,因此如果出于此原因仍需要 pytest-catchlog
您可以通过添加到 pytest.ini
:
[pytest] addopts=-p no:logging
Pytest 3.4中的不兼容更改
此功能是在 3.3
还有一些 不兼容的更改 已经制成 3.4
社区反馈后:
日志级别不再更改,除非
log_level
配置或--log-level
命令行选项。这允许用户自己配置记录器对象。设置log_level
将设置全局捕获的级别,因此如果特定测试需要低于此级别的级别,请使用caplog.set_level()
否则测试很容易失败。Live Logs 现在默认情况下已禁用,并且可以启用设置
log_cli
配置选项到true
. 启用后,详细程度会增加,因此可以看到每个测试的日志记录。Live Logs 现在发送到
sys.stdout
不再需要-s
要工作的命令行选项。
如果要部分还原版本的日志记录行为 3.3
,您可以将此选项添加到 ini
文件:
[pytest] log_cli=true log_level=NOTSET
有关导致此更改的讨论的更多详细信息,请参阅 #3013 .
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论