Skip to content

tests/unit/defect_repair/__init__.py 引起 pytest 包名冲突 #3

@Zld1994

Description

@Zld1994

问题

当一起收集多个测试目录时,以下两个测试模块导入失败:

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 包:

  1. 顶层 defect_repair/ —— 源代码包(在 pyproject.tomlpackages.find.include 中)
  2. 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+ 测试用例无法在完整套件中执行)

Metadata

Metadata

Assignees

No one assigned

    Labels

    good-first-issueGood first issue for new contributors

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions