如何让Pytest正确导入不同Lambda下的同名core模块?
解决方案
方案1:使用进程隔离避免模块缓存冲突
直接使用pytest的--forked选项运行测试,每个测试函数/类会在独立的子进程中执行,每个进程的sys.modules和sys.path完全隔离,不会出现跨Lambda的模块污染问题。
运行命令:
pytest tests/unit/ --forked
如果需要并行测试,可结合pytest-xdist,每个worker进程处理一组测试,同样能实现隔离:
pytest tests/unit/ -n auto --forked
方案2:在conftest.py中实现测试级别的路径切换与模块清理
在tests/unit/conftest.py中添加自动适配的fixture,针对每个Lambda的测试目录动态调整sys.path,并清理缓存的core模块:
import sys import os import pytest @pytest.fixture(scope="module", autouse=True) def lambda_path_setup(request): # 从测试文件路径推导对应Lambda的根目录 test_module_dir = os.path.dirname(request.module.__file__) lambda_name = os.path.basename(test_module_dir) lambda_root = os.path.abspath( os.path.join( os.path.dirname(os.path.dirname(test_module_dir)), "lambdas", lambda_name ) ) # 将当前Lambda根目录插入sys.path最前端,确保优先导入该目录下的core sys.path.insert(0, lambda_root) # 清理所有已加载的core相关模块,避免缓存影响 modules_to_remove = [mod for mod in sys.modules if mod.startswith("core")] for mod in modules_to_remove: del sys.modules[mod] yield # 测试结束后移除临时添加的路径 if lambda_root in sys.path: sys.path.remove(lambda_root)
这个fixture会自动作用于每个测试模块:
- 运行lambda1的测试时,会把
lambdas/lambda1加到sys.path最前面,并清空之前的core模块缓存 - 切换到lambda2的测试时,重复上述操作,确保导入的是lambda2下的core
方案3:为每个Lambda测试单独指定sys.path(手动配置)
如果不想用自动适配的fixture,可以为不同Lambda的测试目录单独创建conftest文件配置路径。比如在tests/unit/lambda1/conftest.py中添加:
import sys import os lambda_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../lambdas/lambda1")) sys.path.insert(0, lambda_root)
同样在tests/unit/lambda2/conftest.py中添加对应lambda2的路径。这种方式逻辑简单,便于按需调整。
内容的提问来源于stack exchange,提问作者Samuel O'Connell
相关产品推荐
相关产品推荐

