Pytest权威教程20-日志
记录日志
Pytest默认捕获WARNING以上日志消息,在每个失败的测试结果概要中,捕获的log信息和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及日志捕获:
pytest --show-capture=no
caplog Fixture方法
在内部测试中,可以更改捕获的日志消息的日志级别。这由caplog夹具支持:
def test_foo(caplog):
caplog.set_level(logging.INFO)
pass
默认情况下,该级别是在根记录器上设置的,但为方便起见,还可以设置任何记录器的日志级别:
def test_foo(caplog):
caplog.set_level(logging.CRITICAL, logger="root.baz")
pass
测试结束时,将自动恢复设置的日志级别。
也可以使用上下文管理器临时更改with块内的日志级别:
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实例和最终日志文本的形式在Fixture上可用。当您要声明消息的内容时,这很有用:
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)方法。举个例子,如果你想确保它使用某种固定的测试永远不能登录任何警告,您可以检查的记录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如果没有提供,但只被应用到控制台日志处理程序。
还可以在配置INI文件中设置所有CLI日志选项。选项名称为:
- log_cli_level
- log_cli_format
- log_cli_date_format
如果您需要将整个测试套件的日志记录记录到一个文件中,则可以传递 --log-file=/path/to/log/file。该日志文件以写模式打开,这意味着它将在每个运行测试会话中被覆盖。
你还可以使用选项 -log-file-level来指定日志文件的日志记录级别。此设置接受python文档中显示的日志记录级别名称(即大写的名称)或对应的整数值。
此外,还可以指定--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()以动态自定义log_file路径。目前这是一个实验性功能。
(译者注:可以在conftest.py中使用Hook方法pytest_configure()来修改日志名称,示例如下:
# conftest.py
import os
form datetime import datetime
def pytest_configure(config):
today = datetime.now().strftime('%Y%m%d')
config.option.log_file = os.path.join(config.rootdir, 'logs', f'{today}.log')
)
版本改动记录
日志功能的引入代替了之前版本使用pytest-catchlog插件来记录日志的方式。两者相互冲突,Pytest已不再向后兼容pytest-capturelog插件。如果仍然需要使用pytest-catchlog插件,可以通过pytest.ini添加以下内容来禁用内部日志功能。
[pytest]
addopts=-p no:logging
Pytest3.4中不向后兼容的更改
引入日志功能后,社区反馈了一些3.4版本与3.3版本的不兼容问题:
除非log_level配置或--log-level命令行选项明确要求,否则日志级别将不再更改。这允许用户自己配置记录器对象。
现在,默认情况下会禁用用例实时日志输出,并且可以通过配置log_cli为true来启用。启用后,用例运行结果的详细程度会增加,因此可以看到每个测试的日志记录。
现在,实时日志已发送到sys.stdout并且不再需要-s命令行选项才能工作。
如果要部分还原version的日志记录行为3.3,可以将以下选项添加到ini 文件中:
[pytest]
log_cli=true
log_level=NOTSET
有关导致此更改的讨论的更多详细信息,请参见问题#3013。
Pytest权威教程20-日志的更多相关文章
- Pytest权威教程(官方教程翻译)
Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...
- Pytest权威教程21-API参考-07-配置选项(Configuration Options)
目录 配置选项(Configuration Options) addopts cache_dir confcutdir console_output_style doctest_encoding do ...
- Pytest权威教程21-API参考-05-对象(Objects)
目录 对象(Objects) CallInfo Class Collector Config ExceptionInfo FixtureDef FSCollector Function Item Ma ...
- Pytest权威教程21-API参考-03-夹具(Fixtures)
目录 夹具(Fixtures) @ pytest.fixture config.cache的 capsys capsysbinary capfd capfdbinary doctest_namespa ...
- Pytest权威教程02-Pytest 使用及调用方法
目录 Pytest 使用及调用方法 使用python -m pytest调用pytest 可能出现的执行退出code 获取版本路径.命令行选项及环境变量相关帮助 第1(N)次失败后停止测试 指定及选择 ...
- Pytest权威教程19-编写钩子(Hooks)方法函数
目录 编写钩子(Hooks)函数 钩子函数验证和执行 firstresult: 遇到第一个有效(非None)结果返回 hookwrapper:在其他钩子函数周围执行 钩子(Hooks)函数排序/调用示 ...
- Pytest权威教程25-配置
目录 配置 命令行选项和配置文件设置 初始化:确定ROOTDIR和INIFILE 寻找rootdir 如何更改命令行选项默认值 内置的配置文件选项 返回: Pytest权威教程 配置 命令行选项和配置 ...
- Pytest权威教程24-Pytest导入机制及系统路径
目录 Pytest导入机制和sys.path/PYTHONPATH 包中的测试脚本及conftest.py文件 独立测试模块及conftest.py文件 调用通过python -m pytest调用p ...
- Pytest权威教程21-API参考-06-变量及异常
目录 特殊变量(Special Variables) collect_ignore collect_ignore_glob pytest_plugins pytest_mark PYTEST_DONT ...
随机推荐
- IdentityServer4使用OpenIdConnect实现单点登录
接上一篇:IdentityServer4实现OAuth2.0四种模式之授权码模式 前面写的四种OAuth2.0实现模式只涉及到IdentityServer4的OAuth2.0特性,并没有涉及到OenI ...
- java第三次面试总结
这次面试是二面,由于自己的经验不足,面试的结果不是很令人满意,所以与这家公司失之交臂,在这里记录一下经历,吸取教训. 之前的一面是笔试+面试,面试是主管,今天的面试是总监.在前台招待我的时候,还跟我说 ...
- 【洛谷 P4302】 [SCOI2003]字符串折叠(DP)
题目链接 简单区间dp 令\(f[i][j]\)表示\([i,j]\)的最短长度 先枚举区间,然后在区间中枚举长度\(k\),看这个区间能不能折叠成几个长度为\(k\)的,如果能就更新答案. #inc ...
- 【转载】Extjs设置Ajax请求的超时时间timeout
在Extjs中的Ajax请求中,Ext.Ajax.request 默认超时时间是30秒,有时候我们有比较耗时的操作需要设置更长时间,此时我们就需要修改Ext.Ajax.Requset的超时时间为更长, ...
- Qt 窗口相关的常用操作
PS: 本文使用的是Qt 4.8.4版本,不同版本代码可能会有差异 设置窗口标题 setWindowTitle(QString::fromLocal8Bit("易语言")); 禁用 ...
- Python 实现自动导入缺失的库
原文:由浅入深:Python 中如何实现自动导入缺失的库? 作者:豌豆花下猫 在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module nam ...
- Python——字符串增加颜色
给显示字符添加颜色: salary=int(input('\033[31;1m请输入你的工资:\033[0m')) ('\033[;1m请输入你的工资:\033[0m') 3x是给字符串改变颜色 31 ...
- mysql查看当前实时连接数
静态查看: SHOW PROCESSLIST; SHOW FULL PROCESSLIST; SHOW VARIABLES LIKE '%max_connections%'; SHOW STATUS ...
- python之文件的相关操作
一..文件操作的函数 open("文件名(路径)" ,mode = "模式" , encoding="字符集") 注:文件路径: (1)绝对 ...
- Scyther tool 入门
1.Scyther 适合分析什么样的协议 首先协议分析工具并不是可以分析所有的协议,每种协议都有其自己适合的分析方法,并不都是可以使用形式化方法来分析. 目前协议分析方法: 模态逻辑分析(BAN ...