如何修改Pytest源码,使其在所有活动前默认运行启动脚本?
嘿,我懂你想让外部补丁脚本在pytest开始收集、执行测试模块前就跑起来,而且要默认排在所有操作最前面的需求。先插一句,其实pytest官方更推荐用插件机制来实现这个(完全不用改源码,更灵活还不怕版本更新覆盖),不过既然你明确要改源码,那我给你指几个精准的位置:
1. 最早期的启动入口:修改_pytest/main.py的main()函数
main()是pytest命令的核心启动函数,这里是整个流程的起点。如果你要让脚本在所有命令行解析、配置初始化之前就运行,直接在函数开头加代码:
def main(args=None, plugins=None): # 在这里插入你的补丁脚本执行逻辑 import sys sys.path.insert(0, "/path/to/your/script/directory") # 把脚本所在目录加入路径 import your_patch_script your_patch_script.run() # 假设你的脚本有run()方法执行补丁 # 下面是pytest原有的启动代码 if args is None: args = sys.argv[1:] plugins = plugins or [] try: config = _prepareconfig(args, plugins) # ... 后续原代码省略
2. 配置初始化后、测试收集前:修改_pytest/main.py的main()函数(稍晚但更稳妥)
如果你希望脚本在pytest完成配置初始化(比如读取命令行参数、加载插件)之后,但还没开始扫描测试模块前运行,就把代码加在_prepareconfig调用之后:
def main(args=None, plugins=None): if args is None: args = sys.argv[1:] plugins = plugins or [] try: config = _prepareconfig(args, plugins) # 在这里插入你的补丁脚本执行逻辑 import sys sys.path.insert(0, "/path/to/your/script/directory") import your_patch_script your_patch_script.run() # ... 后续原代码省略
3. 利用配置钩子的触发点:修改_pytest/config/__init__.py的Config.configure()方法
这个位置会在pytest触发pytest_configure钩子之前运行,也是测试收集前的关键节点,适合需要依赖pytest配置对象的场景:
def configure(self) -> None: # 插入你的补丁脚本执行逻辑 import sys sys.path.insert(0, "/path/to/your/script/directory") import your_patch_script your_patch_script.run() # 原有的pytest配置代码 self._ensure_setup_cache() self.hook.pytest_configure(config=self) # ... 后续原代码省略
额外提醒:更推荐的无源码修改方案
其实不用改源码也能实现默认运行的效果——在你的测试项目根目录创建conftest.py文件,加入以下代码,pytest会自动加载并在测试收集前执行:
def pytest_configure(config): import sys sys.path.insert(0, "/path/to/your/script/directory") import your_patch_script your_patch_script.run()
这种方式不用动pytest源码,更新pytest版本也不会受影响,更符合pytest的设计规范。
内容的提问来源于stack exchange,提问作者Arun Chandramouli
相关产品推荐
相关产品推荐

