You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包:

  1. 在SomeDir下创建__init__.py(可空),如果脚本复杂度较高,可将业务逻辑、exit_codes拆分到更清晰的子模块结构中(比如src/my_package/目录下)。
  2. 在SomeDir下创建pyproject.toml(或setup.py)声明包信息,执行pip install -e .将包安装为可编辑模式。
  3. 此时无论在哪个目录运行pytest,都能直接导入exit_codes,同时脚本也可作为标准CLI工具调用(可在pyproject.toml中配置console_scripts)。

其他方案的局限性

  • 直接修改sys.path:代码侵入性强,易引发路径冲突,多人协作时环境差异可能导致问题。
  • 修改sys.path后恢复:虽比直接append更严谨,但仍有代码侵入,维护成本高,属于冗余操作。
  • 仅添加__init__.py不配置路径:限制了pytest的运行目录,团队成员易踩坑,灵活性不足。

内容的提问来源于stack exchange,提问作者Oersted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:54:59