本文系《pytest源码剖析》系列内容
40. logging-plugin
插件路径:_pytest.logging.LoggingPlugin
实现的 hook
调用的 hook
无
定义的 fixture
无
插件功能
通过多个 hook,连接 pytest 和 logging,实现日志捕获
实例化多个 handler,分别处理捕获到的日志内容
代码片段
def _log_cli_enabled(self): """Return whether live logging is enabled.""" enabled = self._config.getoption( "--log-cli-level" ) is not None or self._config.getini("log_cli") if not enabled: return False terminal_reporter = self._config.pluginmanager.get_plugin("terminalreporter") if terminal_reporter is None: # terminal reporter is disabled e.g. by pytest-xdist. return False
return True class _FileHandler(logging.FileHandler):
def handleError(self, record: logging.LogRecord) -> None: pass
要关闭命令行显示日志,需要同时满足:
命令行参数 --log-cli-level 不传递参数
ini 配置文件 log_cli 不设置或设置为 false
pytest-xidst启用时,强制关闭命令行日志
在记录日志文件时,就算有问题也不会报错,这时需要采取技巧进行排查
简评
插件创建了 4 个日志记录器,每当一条日志被记录时,会分别按照以下方式处理:
caplog_handler:记录到 fixture 中,供用例使用
report_handler:记录到 report 中,供测试报告使用
log_file_handler:记录到文件中,形成日志文件
log_cli_handler:记录到终端中,在命令行输出
...
caplog_handler 和 report_handler 的实现方式是一样的,
以每个用例为单位,捕获日志内容,并交给 pytest 使用。
其中 caplog_handler 被存储到item.stash,被 fixture 使用,详见《logging 插件》
而 report_handler 被存储到item._report_sections,被测试报告使用,在用例失败时进行显示
详见《report 插件》
...
log_file_handler 和 log_cli_handler 是以整个测试会话为单位,
它们都重写了handleError方法导致在处理日志时,如果出现错误,是不进行任何处理
这就是很多人遇到下面这个问题的原因:
日志格式配置错误,导致日志文件会自动创建,内容始却终为空
领取专属 10元无门槛券
私享最新 技术干货