运行Unittest测试出现模块导入错误,需兼容AWS Lambda导入结构如何处理
问题原因
你遇到的导入报错核心是运行单元测试时,Python的模块搜索路径未包含src目录:main.py中直接导入library的写法是符合AWS Lambda部署要求的(Lambda运行时会把代码根目录加到搜索路径),但本地跑测试时默认是从项目根目录启动,Python找不到src下的library.py模块。
不需要修改业务代码的导入语句,以下几种方案都可以适配当前结构:
解决方案
方案1:临时指定PYTHONPATH运行测试(无需修改任何代码)
直接在测试命令前添加环境变量,把src目录加入搜索路径即可:
PYTHONPATH=./src python3 -m unittest discover test
如果是Windows系统,PowerShell下先执行$env:PYTHONPATH="./src"再运行测试命令即可。
方案2:测试文件开头手动添加搜索路径
如果不想每次运行都加环境变量,可以在test_main.py的最开头新增两行代码:
import sys sys.path.append("./src")
这两行代码仅作用于测试执行逻辑,不会影响业务代码,部署AWS Lambda时测试文件不会被打包,完全不会破坏你现有的导入结构。
方案3:新增unittest配置文件(持久化配置)
在项目根目录新建setup.cfg文件,写入以下配置:
[unittest] start-dir = test pythonpath = src
配置完成后直接运行python3 -m unittest即可自动识别测试,不需要额外加参数。
另外注意你当前测试用例存在断言不匹配的小问题:library.py中hello()返回的是Hello World,但测试断言写的是Hello World!(多了一个感叹号),导入问题解决后需要修正这个断言才能通过测试。
内容的提问来源于stack exchange,提问作者zigzagzoom
相关产品推荐
相关产品推荐

