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

Python pytest测试时类导入失败,如何兼顾代码运行与测试?

解决Python包导入兼容测试与主程序运行的问题

项目包结构

├── src/
│   ├── __init__.py
│   ├── class_1.py
│   ├── used_by_class_1.py
└── tests/
    ├── __init__.py
    └── test_class_1.py

问题描述

  • 在tests/test_class_1.py中使用import src.class_1导入后,测试可执行,但实例化class_1时,其内部导入used_by_class_1.py失败。
  • 给内部导入添加src.前缀后,测试正常,但运行主程序时会报错No module named 'src'。
  • 希望不用修改sys.path或重复导入这类不够优雅的方法,同时兼顾测试与代码运行。

解决方案

1. 用相对导入处理包内部依赖

直接修改src/class_1.py里的导入语句,换成相对导入:

# src/class_1.py
# 导入整个模块
from . import used_by_class_1
# 或者导入模块里的特定对象
from .used_by_class_1 import TargetClassOrFunc

相对导入基于当前模块所在的包层级,不管是从外部测试导入,还是在包内部运行主程序,都能正确找到依赖模块。

2. 将src设为可安装包(推荐方案)

在项目根目录创建pyproject.toml配置文件,把src目录标记为包的根目录:

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "your-package"
version = "0.1.0"
packages = ["src"]

然后在项目根目录执行命令:

pip install -e .

这会以可编辑模式安装你的包,之后:

  • 主程序里可以直接用from src.class_1 import Class1导入,不会再出现src模块找不到的错误。
  • 测试文件里用import src.class_1导入也能正常工作,内部的相对导入同样生效。

3. 调整测试运行方式

如果暂时不想安装包,就在项目根目录下用模块方式运行测试:

  • 用pytest的话:
python -m pytest tests/
  • 用unittest的话:
python -m unittest tests/test_class_1.py

这种运行方式会自动把项目根目录加入Python的搜索路径,让src被识别为顶级包,配合内部的相对导入,就能同时满足测试和主程序运行的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:13:23