Python Unittest:多测试目录下共享基测试类的正确导入方法
兼容三种测试运行方式的基类导入方案
项目结构
|- src/ | |- my_package/ | |- __init__.py | |- ... | |- tests/ | |- group1/ | | |- __init__.py (empty) | | |- test_thing_1.py | |- ... | |- base_test_case.py | |- pyproject.toml
核心需求
确保测试文件能导入base_test_case.py中的TestBase类,同时支持以下三种运行场景:
python tests/group1/test_thing_1.pypython -m unittest discover tests/group1/- 在PyCharm中直接运行测试文件
现有导入方式的问题
之前尝试的几种写法都无法覆盖所有场景:
from mypackage import MyClass:仅PyCharm中运行有效,unittest命令行执行失败from ..base_test_case import TestBase/from .base_test_case import TestBase:仅unittest命令行执行有效,直接运行测试文件或PyCharm中运行失败from base_test_case import TestBase:仅unittest命令行执行有效
可行解决方案
方案1:动态添加项目根目录到Python路径(推荐)
在每个测试文件的开头加入以下代码,将包含tests和src的项目根目录添加到Python的搜索路径中,之后即可用绝对导入TestBase:
import sys from pathlib import Path # 从当前测试文件向上回溯3层,定位到项目根目录 project_root = Path(__file__).parents[2] sys.path.append(str(project_root)) # 现在可以正常导入基测试类 from tests.base_test_case import TestBase class SomeTestCase(TestBase): # 测试逻辑代码 pass
这种方法无需修改项目结构,也不会将测试代码打包发布,完美兼容三种运行方式。
方案2:将tests设为可导入包(需配置打包排除)
- 在
tests根目录下创建空的__init__.py,让tests成为一个标准Python包。 - 在
pyproject.toml中配置打包规则,排除测试目录,避免测试代码被发布:[tool.setuptools] packages = ["src.my_package"] exclude = ["tests/*"] - 测试文件中使用绝对导入:
注意:直接执行单个测试文件时,可能仍需要临时添加项目根目录到from tests.base_test_case import TestBase class SomeTestCase(TestBase): # 测试逻辑代码 passsys.path(可参考方案1的路径处理代码);PyCharm和unittest命令行从项目根目录执行时,该导入方式可直接生效。
验证方式
分别执行三种运行命令,确认测试能正常启动且TestBase导入无报错:
- 直接运行单个测试文件:
python tests/group1/test_thing_1.py - 用unittest批量执行:
python -m unittest discover tests/group1/ - PyCharm中右键测试文件,选择"Run"运行
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

