如何为依赖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
相关产品推荐
相关产品推荐

