本文系《pytest源码剖析》系列内容
28. logging
插件路径:_pytest.logging
实现的 hook
调用的 hook
无
定义的 fixture
caplog
插件功能
创建了一系列参数和配置:
日志等级
日志格式
日志时间格式
日志内容是否在命令行显示
日志内容保存到哪个文件
日志内容是否自动缩进
创建 fixturecaplog
创建并注册插件logging-plugin
代码片段
def get_option_ini(config: Config, *names: str): for name in names: ret = config.getoption(name) # 'default' arg won't work as expected if ret is None: ret = config.getini(name) if ret: return ret
def add_option_ini(option, dest, default=None, type=None, **kwargs): parser.addini( dest, default=default, type=type, help="Default value for " + option ) group.addoption(option, dest=dest, **kwargs)
同时创建命令行参数或 ini 配置
也同时从命令行参数或 ini 配置中取值
简评
这个插件做的事情可以大致分为两部分,
第一部分是面向用户的,也就是编写用例时会用到的,
第二部分是面向框架的,也就是框架运行时 pytest 会用的,
...
先说第一个部分,用例、用户相关的,这部分的功能通过 fixture 进行提供
前有,
capture插件提供的 fixture:capsys、capfd,捕获输出
recwarn插件提供了 fixture:recwarn,捕获警告
现在,
logging插件提供了 fixture:caplog,捕获日志
它们有一些相似点:
function 作用域,仅对当前用例生效,与其他用例隔离
在 setup 阶段,开始捕获
返回实例对象,有多种灵活用法
在 teardown 阶段,还原捕获
...
当然也有一些细致的区别,具体到 calog,有下面几种用法
def test_logging(caplog): caplog.text # 已捕获日志的文本字符串 caplog.records # 已捕获日志的对象列表 caplog.record_tuples # 已捕获日志的元组列表,包含名称、等级、内容 caplog.record_tuples # 已捕获日志的内容列表 caplog.set_level(logging.DEBUG) # 设置记录的等级下限 caplog.clear() # 清除已捕获的日志
...
再说第二部分,
插件提供了一些函数、类,供自己和子插件使用。
实际上,第三方插件也可以拿来使用
_remove_ansi_escape_sequences:移除日志中的验收控制符合(我被 appium 的日志烦了好久,可算遇到救星了)
get_log_level_for_setting:从配置文件中读取日志等级(不用手动判断 + 转换了)
get_option_ini:从命令行和配置文件中读取配置
add_option_ini:创建命令行和配置文件(和上一个配合使用)
LoggingPlugin:插件,在 pytest 运行的各个阶段进行日志捕获
item.stash[caplog_handler_key]:用例状态,在不同插件之间传递对象
...
这个插件很好得表现出了:
面向用例、用户的功能,应该通过 fixues 提供,
面向框架、插件、开发任意的功能通过 hook 提供
对想要学习和掌握 pytest 的人,也指出了清晰的方向:
如果想用好 pytest:了解 fixture、使用 fixture、设计 fixture,
如果想改进 pytest:了解 hook,使用 hook、设计 hook
与各位共勉~
领取专属 10元无门槛券
私享最新 技术干货