pytest-cov统计行覆盖率时报No module named 'src'导入错误
问题原因
两种执行方式的Python模块搜索路径逻辑不一致,是报错的核心原因:
- 执行
python -m pytest tests/时,Python会自动将当前命令执行的工作目录(即MATCHING_CC项目根目录)加入sys.path导入搜索路径,因此代码中写的from src.xxx import xxx可以正常找到src模块。 - 直接执行
pytest --cov=MATCHING_CC tests/时,pytest-cov会在测试收集阶段提前加载覆盖率追踪钩子,修改默认模块加载逻辑,此时项目根目录未被加入导入搜索路径,就会触发ModuleNotFoundError: No module named 'src'报错。
额外说明:你传入的--cov=MATCHING_CC参数本身也有误,MATCHING_CC是外层文件夹名称,并非存放业务代码的Python包,你的业务代码全部存放在src目录下,参数值错误也会导致覆盖率统计失效。
解决方案
按改造成本从低到高,可任选以下方案:
方案1:统一启动命令(零配置改动)
直接复用能正常跑通测试的python -m启动方式,同时修正cov参数指向实际的代码目录src即可:
python -m pytest --cov=src tests/
该方式完全复用原有正常运行的路径逻辑,不需要改任何配置文件,执行后即可正常收集测试用例并统计覆盖率。
方案2:修改pytest配置固定导入路径
在现有pytest.ini中增加路径配置,让pytest执行时自动将项目根目录加入搜索路径,适配直接调用pytest命令的场景。
修改后的pytest.ini内容如下:
[pytest] addopts = -p no:warnings filterwarnings = ignore:.*U.*mode is deprecated:DeprecationWarning pythonpath = .
如果你的pytest版本低于7.0,不支持pythonpath配置,可以将最后一行替换为addopts = -p no:warnings --import-mode=append实现相同效果。
配置完成后,直接执行以下命令即可正常运行:
pytest --cov=src tests/
方案3:项目安装为可编辑包(长期维护推荐)
当前导入逻辑强依赖执行命令时的工作目录,换目录执行、CI环境运行都容易重复出现导包问题,最稳妥的方式是将项目配置为可安装的Python包:
- 在MATCHING_CC根目录新建
pyproject.toml文件,写入以下内容:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "matching_cc" version = "0.1.0" packages = ["src", "src.services"]
- 在项目根目录执行可编辑安装命令:
pip install -e .
安装完成后,无论在什么路径下执行pytest命令、是否加cov参数,都不会出现模块找不到的问题。
内容的提问来源于stack exchange,提问作者Atilio
相关产品推荐
相关产品推荐

