pytest的内置插件盘点8:terminal

本文系《pytest源码剖析》系列内容

正在连载,欢迎关注

图片

8. 内置插件 terminal

插件路径:_pytest.terminal

实现的 hook

hooktryfirsttrylastoptionalhookhookwrapperwrapper
pytest_addoptionFalseFalseFalseFalseFalse
pytest_configureFalseFalseFalseFalseFalse
pytest_report_teststatusFalseFalseFalseFalseTrue

调用的 hook

  • pytest_report_header

  • pytest_report_collectionfinish

  • pytest_terminal_summary

  • pytest_report_teststatus

插件功能

  1. 创建命令行参数 --verbosity-v 和 -q 控制报告的详细程度

    1. v 越详细,q 越多越精简

    2. verbosity 通过数字指定详细程度

  2. 创建一系列命令行参数,控制是否显示某些内容

  3. 创建 ini 配置 console_output_style,控制进度的显示形式

  4. 创建 terminalreporter 插件,用于生成终端版测试报告

  5. 创建用例的执行结果

    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()
  1. 虽然有三个参数,但其实是修改同一个 verbose 来控制详细程度

  2. 根据结果类型,生成字符缩写.sFE

简评

报告的详细程度有 5 级: -2-1012

但 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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值