pytest的内置插件盘点3:main

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

正在连载,欢迎关注

图片

3. 内置插件 main

插件路径:_pytest.main

实现的 hook

hooktryfirsttrylastoptionalhookhookwrapper
pytest_addoptionFalseFalseFalseFalse
pytest_cmdline_mainFalseFalseFalseFalse
pytest_collectionFalseFalseFalseFalse
pytest_collection_modifyitemsFalseFalseFalseFalse
pytest_ignore_collectFalseFalseFalseFalse
pytest_runtestloopFalseFalseFalseFalse

调用的 hook

  • pytest_ignore_collect

  • pytest_sessionfinish

  • pytest_collection_finish

  • pytest_runtest_protocol

  • pytest_collectreport

  • pytest_collection

  • pytest_deselected

  • pytest_collect_file

  • pytest_collection_modifyitems

  • pytest_itemcollected

  • pytest_keyboard_interrupt

  • pytest_sessionstart

  • pytest_runtestloop

插件功能

  1. 创建了一系列命令行参数配置项、文件配置项:_pytest.main.pytest_addoption

  2. 创建新的插件 session_pytest.main.Session

  3. 实现了 hook pytest_cmdline_main,在 pytest 启动时自动运行:

    1. 用例收集

    2. 用例执行

  4. 将用例收集和用例执行工作,委托给 session 插件完成

  5. 如果收到命令行参数 --co,则只收集,不执行!

代码片段

def wrap_session(
    config: Config, doit: Callable[[Config, "Session"], Optional[Union[int, ExitCode]]]
) -> Union[int, ExitCode]:
    """Skeleton command line program."""
    session = Session.from_config(config)
    session.exitstatus = ExitCode.OK
    ...

def _main(config: Config, session: "Session") -> Optional[Union[int, ExitCode]]:
    """Default command line protocol for initialization, session,
    running tests and reporting."""
    config.hook.pytest_collection(session=session)
    config.hook.pytest_runtestloop(session=session)

    if session.testsfailed:
        return ExitCode.TESTS_FAILED
    elif session.testscollected == 0:
        return ExitCode.NO_TESTS_COLLECTED
    return None


def pytest_collection(session: "Session") -> None:
    session.perform_collect()

  1. session 插件是基于 config 创建的

  2. session 插件的 exitstatus 属性,会成为 pyetst.main() 的返回值

  3. main 插件委托 session 插件实施用例收集和用例执行工作

 

简评

session 的出现,让我意识到之前的分析脚本有 BUG,漏掉了一些插件...

于是修正脚本后重新统计

插件总数:43实现hook的插件数:39实现fixture的插件数:10--------------------基于文件的插件数:33基于类的插件数:1基于对象的插件数:9

最开始读pytest源码的时候宛如天书,后面勉强上道了,但是也步履艰难,怀疑这么做没啥意义

功夫不负有心人,你看收获这不就来了吗。。。

如果需要对新脚本进行 review 和本地验证的话,欢迎留言

...

session 插件具体实现用例收集和执行,所以可以这么理解:

在 session 插件注册之后,pytest 测试框架的初始化正式完成,接下要开始正式的干活了

session 插件是在 pytest_cmdline_main 调用之后创建的,

所以尽管它和 main 插件关系紧密,但是加载顺序比较靠后。

因为插件的加载顺序是:

  1. 加载默认插件

  2. 调用 hook,产生新插件

  3. 加载新插件

session插件先就此别过,在后文中,会继续按照加载顺序进行介绍

首发于公众号:测试开发研习社

原创不易,喜欢请星标+点赞+在看

  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值