3. 分析 pytest 执行的过程
因为整个文件行数有 1K+,通过 Python 脚本辅助分析后发现,有共用 38 个 hook 累计被调用 440 次,
将其简化后,结果如下
根据这个 hook 记录,咱们可以梳理出 pytest 整个执行的过程,大致分为以下几个阶段
加载插件
在第 1 行,
pytest_plugin_registered 以插件为参数,被反复调用
初始化框架
在第 2~6 行
为框架增设 hook、配置项、conftest 文件
从命令行参数、配置文件中,加载配置内容
启动测试框架
在第 7 行
根据配置内容,决定做什么,怎么做
如果是内容输出(例如:版本号、帮助信息),做完马上退出
如果是执行用例,按照下面的阶段继续执行
收集测试用例
在第 8~23 行
找到符合收集规则且包含测试用例的文件
根据文件内容,生成 pytest 内部用例对象:Item
执行测试用例
在第 24~35 行
setup + run + tear down
结束框架
在第 36~38 行
输出测试结果的摘要
释放对标准输出、日志等资源的控制
此外,还有一组在 hook并不是在某个阶段执行,
而是运行在整个框架启动后全程运行,
用来实时的收集、输出报告
在第 10、13、17、23、28~30 行
在终端中输出:
框架信息
用例收集情况
用例执行进度、结果
异常信息
汇总执行结果、执行耗时(最后一行)
你可能还记得前面咱们一共收集到 52 个 hook,
本次执行用例却只执行了 38 个,
稍微修改脚本,筛选出未执行的 hook 有:
pytest_assertion_pass
pytest_assertrepr_compare
pytest_deselected
pytest_enter_pdb
pytest_fixture_post_finalizer
pytest_fixture_setup
pytest_internalerror
pytest_keyboard_interrupt
pytest_leave_pdb
pytest_make_parametrize_id
pytest_markeval_namespace
pytest_report_from_serializable
pytest_report_to_serializable
pytest_warning_recorded
从名字上可以看出,与断言、fixture、调试、筛选、参数化等相关。
可能咱们准备的脚本比较简单,未涉及这些,导致 hook 没能执行,
你有兴趣的话,可以把相关功能用上,然后重新记录和分析。
借助 hook,现在咱们知道了 pytest 的执行脉络,
但具体的细节还藏在实现了 hook 的各个插件中。
下一波,盘盘 pytest 内置的插件,看看它们怎么巧妙地运用各个 hook,实现各种神奇的功能
领取专属 10元无门槛券
私享最新 技术干货