本文系《pytest源码剖析》系列内容
30. python_path
插件路径:_pytest.python_path
实现的 hook
调用的 hook
无
定义的 fixture
无
插件功能
创建配置文件选项pythonpath,将指定路径添加到sys.path
代码片段
@pytest.hookimpl(tryfirst=True)def pytest_load_initial_conftests(early_config: Config) -> None: # `pythonpath = a b` will set `sys.path` to `[a, b, x, y, z, ...]` for path in reversed(early_config.getini("pythonpath")): sys.path.insert(0, str(path))
@pytest.hookimpl(trylast=True)def pytest_unconfigure(config: Config) -> None: for path in config.getini("pythonpath"): path_str = str(path) if path_str in sys.path: sys.path.remove(path_str)
加载用例前,修改 sys.path
用例执行结束后,还原 sys.path
简评
本插件内容简单,代码量少,内容上没什么好说的
值得思考的问题是:通过插件添加 path 和在测试文件中修改sys.path有何区别
我能想到的有这么几个:
集中管理,避免在多个文件中重复设置
优先级高,甚至高于conftest.py
支持热插拔,通过启动 \ 禁用插件即可控制是否生效
无需 python 文件,这对纯 excel 或纯 yaml 用例的项目友好
...
记得之前在命令行直接执行pytest来启动测试框架的话会有一个问题,
就是当前目录中的模块,无法被测试用例导入,
当前觉得很烦,想出了很多解决办法,比如:
根目录创建 conftest.py
根目录创建用例文件
通过环境变量修改 path
通过代码修改 path
等等...
有了这个插件,只需要配置文件中加一行就搞定了
[pytest]; 支持从当前目录中导入模块pythonpath = ./
领取专属 10元无门槛券
私享最新 技术干货