上一章通过脚本分析的方式,找出了 pytest 中全部的 hook 名称、关系、执行顺序。
在本章,同样采用脚本分析的方式,来处理 pytest 中每一个插的 hook 实现,包括:
hook 名
是否为 hookwrapper
是否尝试 tryfirst
是否尝试 trylast
以及每一个插件的所有 hook 调用,包括:
hook 名
hook 调用顺序
hook 调用次数
也就是说,阅读完本章,可以大致知道 pytest 中 32 个内置插件,分别为 pytest 提供了什么、对 pytest 做了什么
因篇幅原因,同时也为了方便索引、记录,每个插件的分析结果将单独发布,本次分享 pytest 的第一个插件: pytestconfig
内置插件 pytestconfig
插件路径:_pytest.config.Config
实现的 hook:
调用的 hook:
pytest_configure
pytest_load_initial_conftests
pytest_warning_recorded
pytest_unconfigure
pytest_plugin_registered
pytest_addoption
pytest_cmdline_main
pytest_addhooks
pytest_internalerror
pytest_cmdline_parse
pytest_cmdline_preparse
插件功能:
定义了框架启动函数:_pytest.config.main
定义了框架配置类:_pytest.config.Config
命令行参数
配置文件
conftest.py
定义了 pytest 专用的 pm:_pytest.config.PytestPluginManager
定义了命令行参数解析:_pytest.config.argparsing.Parser
定义了配置文件加载:_pytest.config.findpaths.determine_setup
列出了内置插件列表:src/_pytest/config/__init__.py:236
代码片段
def get_config( args: Optional[List[str]] = None, plugins: Optional[Sequence[Union[str, _PluggyPlugin]]] = None,) -> "Config": # subsequent calls to main will create a fresh instance pluginmanager = PytestPluginManager() config = Config( pluginmanager, invocation_params=Config.InvocationParams( args=args or (), plugins=plugins, dir=Path.cwd(), ), )
if args is not None: # Handle any "-p no:plugin" args. pluginmanager.consider_preparse(args, exclude_only=True)
for spec in default_plugins: pluginmanager.import_plugin(spec)
return config
@finalclass Config: """Access to configuration values, pluginmanager and plugin hooks.
:param PytestPluginManager pluginmanager: A pytest PluginManager.
:param InvocationParams invocation_params: Object containing parameters regarding the :func:`pytest.main` invocation. """
final装饰用来申明 Config 类不可被继承、重写
注释内容说明 Config 类用于访问配置、插件管理器、插件 hook
get_config函数展示了 Config 类的实例化方式:
在 pytest 启动时马上进行Config实例化
传递 PluginManager 实例对象
传递命令行参数、插件列表、当前工作目录,以便 pytestconfig 接管接下来的一切
简评
该插件是 pytest 基础中的基础、核心中的核心、一切功能的开始
领取专属 10元无门槛券
私享最新 技术干货