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

如何为依赖AWS Lambda环境变量的Python函数编写Pytest单元测试

解决方案

你的问题核心在于util.py中的day是模块级全局变量,在模块导入时就通过os.getenv完成了赋值,直接使用parametrize时,测试用例间的环境变量修改不会同步到这个全局变量上,导致测试不生效。下面提供两种可行的测试方案:

方案1:直接Mock模块全局变量(推荐)

无需修改环境变量,直接修改util模块中的day全局变量,简单高效:

创建测试文件test_util.py:

import pytest
import util

@pytest.mark.parametrize("day_value, expected_code", [
    ("Monday", "M"),
    ("Tuesday", "T"),
    ("Wednesday", "W"),
    ("Thursday", None),  # 测试未匹配的边界情况
])
def test_get_day_code(day_value, expected_code):
    # 直接覆盖模块的全局day变量
    util.day = day_value
    assert util.get_day_code() == expected_code

方案2:修改环境变量并重新加载模块

如果需要模拟真实的Lambda环境变量加载逻辑,可以通过修改环境变量后重新加载模块的方式实现:

import os
import importlib
import pytest
import util

@pytest.fixture(autouse=True)
def restore_env():
    # 保存原始环境变量,测试后恢复
    original_day = os.getenv("DAY")
    yield
    if original_day:
        os.environ["DAY"] = original_day
    else:
        os.environ.pop("DAY", None)
    # 重新加载模块,重置day变量
    importlib.reload(util)

@pytest.mark.parametrize("day_value, expected_code", [
    ("Monday", "M"),
    ("Tuesday", "T"),
    ("Wednesday", "W"),
    ("Thursday", None),
])
def test_get_day_code(day_value, expected_code):
    os.environ["DAY"] = day_value
    # 重新加载模块,让day变量从新的环境变量取值
    importlib.reload(util)
    assert util.get_day_code() == expected_code

运行测试

执行以下命令运行测试:

pytest test_util.py -v

内容的提问来源于stack exchange,提问作者Praveen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:20:32