本文系《pytest源码剖析》系列内容
正在连载,欢迎关注
3. 内置插件 main
插件路径:_pytest.main
实现的 hook
hook | tryfirst | trylast | optionalhook | hookwrapper |
---|---|---|---|---|
pytest_addoption | False | False | False | False |
pytest_cmdline_main | False | False | False | False |
pytest_collection | False | False | False | False |
pytest_collection_modifyitems | False | False | False | False |
pytest_ignore_collect | False | False | False | False |
pytest_runtestloop | False | False | False | False |
调用的 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
插件功能
-
创建了一系列命令行参数配置项、文件配置项:
_pytest.main.pytest_addoption
-
创建新的插件
session
:_pytest.main.Session
-
实现了 hook
pytest_cmdline_main
,在 pytest 启动时自动运行:-
用例收集
-
用例执行
-
-
将用例收集和用例执行工作,委托给
session
插件完成 -
如果收到命令行参数
--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()
-
session
插件是基于config
创建的 -
session
插件的exitstatus
属性,会成为pyetst.main()
的返回值 -
main
插件委托session
插件实施用例收集和用例执行工作
简评
session
的出现,让我意识到之前的分析脚本有 BUG,漏掉了一些插件...
于是修正脚本后重新统计
插件总数:43
实现hook的插件数:39
实现fixture的插件数:10
--------------------
基于文件的插件数:33
基于类的插件数:1
基于对象的插件数:9
最开始读pytest源码的时候宛如天书,后面勉强上道了,但是也步履艰难,怀疑这么做没啥意义
功夫不负有心人,你看收获这不就来了吗。。。
如果需要对新脚本进行 review 和本地验证的话,欢迎留言
...
session
插件具体实现用例收集和执行,所以可以这么理解:
在 session
插件注册之后,pytest 测试框架的初始化正式完成,接下要开始正式的干活了
session 插件是在 pytest_cmdline_main
调用之后创建的,
所以尽管它和 main 插件关系紧密,但是加载顺序比较靠后。
因为插件的加载顺序是:
-
加载默认插件
-
调用 hook,产生新插件
-
加载新插件
session插件先就此别过,在后文中,会继续按照加载顺序进行介绍
首发于公众号:测试开发研习社
原创不易,喜欢请星标+点赞+在看