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

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.py
  • python -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设为可导入包(需配置打包排除)

  1. 在tests根目录下创建空的__init__.py,让tests成为一个标准Python包。
  2. 在pyproject.toml中配置打包规则,排除测试目录,避免测试代码被发布:
    [tool.setuptools]
    packages = ["src.my_package"]
    exclude = ["tests/*"]
    
  3. 测试文件中使用绝对导入:
    from tests.base_test_case import TestBase
    
    class SomeTestCase(TestBase):
        # 测试逻辑代码
        pass
    
    注意:直接执行单个测试文件时,可能仍需要临时添加项目根目录到sys.path(可参考方案1的路径处理代码);PyCharm和unittest命令行从项目根目录执行时,该导入方式可直接生效。

验证方式

分别执行三种运行命令,确认测试能正常启动且TestBase导入无报错:

  • 直接运行单个测试文件:python tests/group1/test_thing_1.py
  • 用unittest批量执行:python -m unittest discover tests/group1/
  • PyCharm中右键测试文件,选择"Run"运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:55:16