pytest找不到测试模块的解决方案是否合理?__init__.py作用解析
pytest模块导入问题的解决方案疑问
项目初始结构
| |-tests | |----test_sum.py | |--script_to_test.py |- pytest.ini
各文件内容
script_to_test.py
def sum(a,b): return a+b
pytest.ini
[pytest] python_files = test_* python_classes = *Tests python_functions = test_*
test_sum.py
import script_to_test def test_sum(): d=script_to_test.sum(6,5) assert d==11
问题背景
运行pytest时提示找不到script_to_test.py模块,尝试在tests目录下添加空的__init__.py文件后,pytest可正常运行。现疑问:
- 该解决方案是否正确、合适?
__init__.py在此处的作用是什么?
解答
1. 这个解决方案是否正确合适?
完全正确,而且是非常合适的轻量方案。不用修改导入路径、不用将主模块安装为第三方包,只需要添加一个空文件就能快速解决测试代码无法导入主模块的问题。不过要注意前提是你需要在项目根目录下运行pytest,此时根目录会被自动加入Python的模块搜索路径sys.path,而tests目录因为有__init__.py被识别为Python包,测试文件里的import script_to_test就能找到同级的主模块了。
2. __init__.py在这里的作用是什么?
- 标记目录为Python包:在Python中,只有包含
__init__.py的目录才会被识别为可导入的常规包。虽然Python3.3以后支持没有该文件的命名空间包,但添加空的__init__.py能明确将tests目录标记为常规包,避免路径识别的潜在问题。 - 间接调整模块搜索逻辑:当tests目录成为包后,Python处理测试文件的导入请求时,会优先从项目根目录(已在
sys.path中)查找顶级模块(比如script_to_test),从而解决找不到模块的问题。 - 可选扩展能力:虽然这里用的是空文件,但
__init__.py还可以写入初始化代码,比如导入子模块、定义包级变量等,不过在这个场景下,只需要它的“包标记”作用就足够了。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

