• 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 节进行详细介绍

  • 相关阅读:
    150:vue+openlayers 多边形拐点用不同形状表示(圆形、三角形、矩形、正方形、星形...)
    在配置文件“tsconfig.json”中找不到任何输入。指定的 “include“ 路径为“[“**/*“]”,“exclude“ 路径为[]
    【蓝桥杯单片机】五、DS18B20
    【Spring源码】8. 捋下invokeBeanFactoryPostProcessors()主要处理流程
    【通信原理课设--基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真】课程设计报告大纲
    我在高职教STM32——LCD液晶显示(3)
    JVM:字节码文件,类的生命周期,类加载器
    MCM箱模型建模方法及大气O3来源解析
    JavaSE--基础语法--类和对象(第二期)
    JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)
  • 原文地址:https://blog.csdn.net/python_sanmu/article/details/138181854