You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:00:07