Python测试目录无__init__.py时的模块导入方法及原因咨询
解决方法与解释
首先,先修正你的测试代码并给出正确的导入方式,再逐一解答你的疑问。
一、正确的测试代码与导入方式
你的项目根目录是Python_test(包含my、test和根__init__.py的目录),只要在这个根目录下运行pytest,就可以直接使用绝对导入,无需修改sys.path或给test目录加__init__.py。
修改test/test_main.py为:
# /Python_test/test/test_main.py from my.my_sub.tested import inc # 这里要导入正确的函数inc,不是func def test_answer(): assert inc(3) == 4 # inc(3)应该返回4,不是3
然后在项目根目录(Python_test)执行命令:
pytest test/test_main.py -v
这样就能正常运行测试了。
二、疑问解答
1)为什么test目录不应添加__init__.py?
- 测试代码不属于源码包:
test目录是用于存放测试用例的,它不是项目发布的源码包的一部分。如果添加__init__.py,Python会将其识别为一个Python包,这可能导致打包工具(如setuptools)误将测试代码打包进发布包中,增加不必要的体积。 - 避免导入混淆:把
test作为包会引入相对导入的风险(比如你尝试的from ..my.main import func就触发了错误),因为Python会将test视为顶层包的一部分,无法跨越到同级的my包进行相对导入。 - 符合社区规范:像boto3、requests等主流开源项目的测试目录都不会添加
__init__.py,保持测试代码与业务源码的分离,让测试作为独立的脚本集合运行,而非包的子模块。
2)无需通过__init__.py添加路径到PYTHONPATH的导入方法
除了上面提到的在项目根目录运行pytest(最推荐的方式),还有两种可靠方法:
设置PYTHONPATH环境变量
在运行pytest前,将项目根目录添加到PYTHONPATH:- Linux/macOS终端:
export PYTHONPATH=/path/to/your/Python_test pytest test/test_main.py -v - Windows命令提示符:
set PYTHONPATH=C:\path\to\your\Python_test pytest test/test_main.py -v
这样Python会自动在
PYTHONPATH指定的目录中查找my包。- Linux/macOS终端:
使用pytest配置文件
在项目根目录创建pytest.ini文件,内容如下:[pytest] pythonpath = .这个配置会告诉pytest将当前目录(根目录)加入Python的搜索路径,之后无论你在哪个目录运行pytest,都能正确导入
my包。
内容的提问来源于stack exchange,提问作者JaK
相关产品推荐
相关产品推荐

