Python项目中测试脚本导入主脚本符号的最佳实践是什么?
问题描述
项目结构
SomeDir |- script.py |- TestDir | |- test.py
背景
script.py 是供CLI调用的脚本,包含业务逻辑类和定义退出码的枚举类 exit_codes(Enum)。test.py 基于pytest编写测试,通过subprocess.run调用script.py,需要断言返回码与预期一致,因此希望在test.py中通过from script import exit_codes导入枚举类,但默认情况下无法找到script模块。
现有可行方案
- 通过
__file__结合..使用sys.path.append修改路径 - 修改
sys.path前保存原路径,导入完成后恢复 - 在
script.py所在目录添加__init__.py转为模块,但仅能在该目录运行pytest - 使用
pytest.ini配置(尚未尝试)
也可组合使用上述方案。
请问哪种方案是行业最佳实践?
最佳实践方案
推荐优先选择**pytest.ini配置路径**,如果项目需要长期维护,则推荐将脚本目录转为可安装Python包,具体说明如下:
方案1:pytest.ini配置路径(最简无侵入)
在SomeDir目录下创建pytest.ini文件,内容如下:
[pytest] pythonpath = .
该配置会让pytest自动将SomeDir加入Python路径,test.py中直接执行from script import exit_codes即可正常导入,无需修改代码,且不限制pytest的运行目录(在SomeDir或TestDir下运行均可)。
方案2:转为可安装Python包(长期维护首选)
若项目需要长期迭代,更规范的做法是将SomeDir做成标准Python包:
- 在
SomeDir下创建__init__.py(可空),如果脚本复杂度较高,可将业务逻辑、exit_codes拆分到更清晰的子模块结构中(比如src/my_package/目录下)。 - 在
SomeDir下创建pyproject.toml(或setup.py)声明包信息,执行pip install -e .将包安装为可编辑模式。 - 此时无论在哪个目录运行pytest,都能直接导入
exit_codes,同时脚本也可作为标准CLI工具调用(可在pyproject.toml中配置console_scripts)。
其他方案的局限性
- 直接修改
sys.path:代码侵入性强,易引发路径冲突,多人协作时环境差异可能导致问题。 - 修改
sys.path后恢复:虽比直接append更严谨,但仍有代码侵入,维护成本高,属于冗余操作。 - 仅添加
__init__.py不配置路径:限制了pytest的运行目录,团队成员易踩坑,灵活性不足。
内容的提问来源于stack exchange,提问作者Oersted
相关产品推荐
相关产品推荐

