如何编写兼容unittest与独立运行的Python模块导入语句?
Python导入语句与unittest兼容问题解决方案
无需修改代码的兼容方案
有两种无需改动代码就能同时支持独立运行模块和执行测试的方法:
- 用模块方式运行foo.py:在Simple目录下执行命令
python -m dev.foo,而非直接进入dev目录运行py foo.py。这种方式会自动将Simple目录加入sys.path,让from dev import bar的导入逻辑正常生效。 - 设置PYTHONPATH环境变量:把Simple目录的绝对路径添加到PYTHONPATH中:
- Windows命令行:
set PYTHONPATH=C:\你的实际路径\Simple,之后无论是运行py .\dev\foo.py还是测试命令py -m unittest .\test\test1.py都能正常执行。 - Linux/macOS终端:
export PYTHONPATH=/你的实际路径/Simple,后续运行对应命令即可。
- Windows命令行:
为什么测试模块受开发代码导入语句影响?
Python的模块查找依赖sys.path列表里的路径,不同运行方式下sys.path的内容存在差异:
- 用
py -m unittest执行测试时,当前工作目录是Simple,该目录会被自动加入sys.path,所以from dev import bar能找到dev模块(dev是Simple下的子包)。但直接运行py .\dev\foo.py时,当前工作目录是dev,sys.path里没有Simple目录,自然找不到名为dev的模块。 - 反过来,当foo.py用
import bar时,直接运行foo.py(工作目录dev)会把dev目录加入sys.path,能找到同目录的bar模块;但测试时工作目录是Simple,sys.path里没有dev目录,所以找不到bar模块。 - 测试模块运行时会加载被测试的foo.py,此时foo.py的导入语句会基于测试环境的
sys.path去查找依赖,若导入语句的写法和当前环境的sys.path不匹配,就会触发模块找不到的错误。
内容的提问来源于stack exchange,提问作者Sperry
相关产品推荐
相关产品推荐

