问题
当一起收集多个测试目录时,以下两个测试模块导入失败:
ERROR tests/unit/defect_repair/test_classifier.py
ModuleNotFoundError: No module named 'defect_repair.test_classifier'
ERROR tests/unit/defect_repair/test_repair_engine.py
ModuleNotFoundError: No module named 'defect_repair.test_repair_engine'
根因
仓库里同时存在两个名为 defect_repair 的 Python 包:
- 顶层
defect_repair/ —— 源代码包(在 pyproject.toml 的 packages.find.include 中)
tests/unit/defect_repair/ —— 含 __init__.py,被 pytest 当成同名包
由于 tests/unit/ 没有 __init__.py,pytest 的 rootdir-based import 把 tests/unit/defect_repair/ 解析成 defect_repair 包,与源代码包冲突,触发 ImportError。
附带,仓库结构还有一个相关混乱:
- 顶层有
defect_repair/ 和 scheduler/
- 同时
agentManager/defect_repair/ 也存在,且与顶层是两套不同的实现(文件名也略不同:顶层 classifier.py,子包 defect_classifier.py),不清楚到底哪一个是有效的。
复现
pytest tests/ --co -q
# ERROR tests/unit/defect_repair/test_classifier.py
单独跑 pytest tests/unit/defect_repair 不会出错,只有和其它目录一起收集时会冲突。
解决方案(任选一种)
A. 推荐:删除 tests/unit/defect_repair/__init__.py(让它成为 rootdir-relative test path,避开包名冲突)
B. 给 tests/ 和 tests/unit/ 都加上 __init__.py,让测试目录形成一个独立的命名空间 tests.unit.defect_repair
C. 把 tests/unit/defect_repair/ 改名(如 tests/unit/test_defect_repair/)
更长期的建议:清理顶层 defect_repair/ 与 agentManager/defect_repair/ 重复代码,只保留一份。
影响
- 严重程度:高
- 范围:tests/unit/defect_repair/* (约 90+ 测试用例无法在完整套件中执行)
问题
当一起收集多个测试目录时,以下两个测试模块导入失败:
根因
仓库里同时存在两个名为
defect_repair的 Python 包:defect_repair/—— 源代码包(在pyproject.toml的packages.find.include中)tests/unit/defect_repair/—— 含__init__.py,被 pytest 当成同名包由于
tests/unit/没有__init__.py,pytest 的 rootdir-based import 把tests/unit/defect_repair/解析成defect_repair包,与源代码包冲突,触发 ImportError。附带,仓库结构还有一个相关混乱:
defect_repair/和scheduler/agentManager/defect_repair/也存在,且与顶层是两套不同的实现(文件名也略不同:顶层classifier.py,子包defect_classifier.py),不清楚到底哪一个是有效的。复现
pytest tests/ --co -q # ERROR tests/unit/defect_repair/test_classifier.py单独跑
pytest tests/unit/defect_repair不会出错,只有和其它目录一起收集时会冲突。解决方案(任选一种)
A. 推荐:删除
tests/unit/defect_repair/__init__.py(让它成为 rootdir-relative test path,避开包名冲突)B. 给
tests/和tests/unit/都加上__init__.py,让测试目录形成一个独立的命名空间tests.unit.defect_repairC. 把
tests/unit/defect_repair/改名(如tests/unit/test_defect_repair/)更长期的建议:清理顶层
defect_repair/与agentManager/defect_repair/重复代码,只保留一份。影响