如何从包源码目录外的相邻测试模块中导入内容?
分离式测试目录下模块间导入问题的解决方法
这种分离式目录结构并非固有缺陷,问题出在Python的模块导入机制上——默认情况下tests目录不在Python的模块搜索路径(sys.path)中,也不会被识别为可导入的包,导致相对导入和普通绝对导入都无法生效。以下是几种可行的解决方式:
1. 手动将tests目录加入Python路径
方式一:运行测试时设置环境变量
在项目根目录下执行测试时,通过PYTHONPATH指定tests目录的路径:
PYTHONPATH=./tests pytest
之后在test_app.py中就可以使用绝对导入:
from test_view import important_attr
方式二:在测试文件中动态添加路径
在test_app.py的最顶部添加代码,将当前测试文件所在的tests目录加入sys.path:
import sys from pathlib import Path # 将tests目录添加到模块搜索路径 sys.path.append(str(Path(__file__).parent)) from test_view import important_attr
2. 将tests目录作为包进行导入
在tests目录下保留__init__.py,然后在项目根目录下执行测试时,将项目根目录加入PYTHONPATH:
PYTHONPATH=. pytest
此时可以使用完整的绝对导入路径:
from tests.test_view import important_attr
3. 使用pytest的conftest.py共享测试资源
如果important_attr是测试用的共享变量/工具,更推荐将其放到tests目录下的conftest.py文件中。pytest会自动识别这个文件中的内容,所有测试模块无需手动导入即可直接使用:
# tests/conftest.py important_attr = "你的共享内容"
之后test_app.py和test_view.py可以直接使用important_attr。
补充说明
之前尝试相对导入失败,是因为直接运行测试文件或pytest时,测试模块是作为独立脚本执行的,而非作为包的一部分运行(只有用python -m tests.test_app这种方式运行时,相对导入才会生效)。而普通绝对导入失效,则是因为tests目录不在Python的默认搜索路径里。
内容的提问来源于stack exchange,提问作者Jagerber48
相关产品推荐
相关产品推荐

