8. 内置插件 terminal
插件路径:_pytest.terminal
实现的 hook
调用的 hook
pytest_report_header
pytest_report_collectionfinish
pytest_terminal_summary
pytest_report_teststatus
插件功能
创建命令行参数--verbosity、-v和-q控制报告的详细程度
v越详细,q越多越精简
verbosity通过数字指定详细程度
创建一系列命令行参数,控制是否显示某些内容
创建 ini 配置console_output_style,控制进度的显示形式
创建terminalreporter插件,用于生成终端版测试报告
创建用例的执行结果
failed:失败passed: 成功skipped:跳过deselected:未选中xfailed:预期内失败xpassed:预期外通过warnings:触发警告error:遇到错误
代码片段
group._addoption( "-v", "--verbose", action="count", default=0, dest="verbose", help="Increase verbosity",)group._addoption( "-q", "--quiet", action=MoreQuietAction, default=0, dest="verbose", help="Decrease verbosity",)
group._addoption( "--verbosity", dest="verbose", type=int, default=0, help="Set verbosity. Default: 0.",)
@hookimpl(trylast=True) # after _pytest.runnerdef pytest_report_teststatus(report: BaseReport) -> Tuple[str, str, str]: letter = "F" if report.passed: letter = "." elif report.skipped: letter = "s"
outcome: str = report.outcome if report.when in ("collect", "setup", "teardown") and outcome == "failed": outcome = "error" letter = "E"
return outcome, letter, outcome.upper()
虽然有三个参数,但其实是修改同一个verbose来控制详细程度
根据结果类型,生成字符缩写.、s、F、E
简评
报告的详细程度有 5 级:-2、-1、0、1、2
但 pytest 不是直接判断verbose的值是多少,而是在不同的地方,用不同的方式判断:
1. line 776: 判断是否小于-12. line 660: 判断是否小于03. line 643: 判断是否大于等于04. line 646:判断是否大于等于15. line 556:判断是否大于2
所以读 pytest 的代码真不是一件容易的事情,
要一边看、一边想、一边调试、一边记录
...
console_output_style让 pytest 有两种进度显示方式
第一种是 已执行用例数的百分比(默认)
第二种是 已执行用例数 / 全部用例数
[ 1/27] [ 2/27] [ 4/27][ 9/27][24/27][25/27][27/27]
这种形式很新鲜啊, 我打算用一段时间
...
在unittest中:
凡是出现断言异常,就判定用例失败Failed,
出现其他异常,则判断执行出错Error
但pytest中则是不同:
异常出现在用例执行前的,判定为执行出错Error,
出现在执行过程中的,判定为用例失败Failed,
也即是说,unitest的判定依据是异常类型,pytest的判断依据是执行阶段
从这个角度来看,unittest 比较侧重【对象】,pytest 比较侧重【过程】
...
pytest 中约定的用例执行结果有 8 种,但是本插件只处理了其中 4 种的缩写,
至于剩下的 4 种:
xfailed和xpassed在skip插件中实现
deselected和warnings主要影响终端颜色,不需要缩写
...
本插件主要的功能是创建了配置参数和terminalreporter插件,
报告生成的具体工作,委托给了terminalreporter插件去完成,
按照插件序号,会在本章的第 36 节进行详细介绍
领取专属 10元无门槛券
私享最新 技术干货