单元测试导入模块时全局boto3 Session调用失败,如何Mock解决?
解决导入模块时创建Boto3 Session导致的测试环境报错问题
核心问题在于/lib/module.py的模块级代码在导入阶段就执行了boto3.session(),触发了AWS凭证验证,而测试环境无有效凭证导致报错。必须在导入模块前完成Mock操作,以下是两种可行方案:
方案1:使用unittest.mock.patch提前Mock
修改tests/test.py,先Mockboto3.session再导入目标模块:
from unittest.mock import patch, MagicMock # 先Mock boto3.session,再导入模块(关键:导入前完成Mock) with patch('boto3.session') as mock_session: # 创建模拟的Session实例,避免真实调用 mock_session_instance = MagicMock() mock_session.return_value = mock_session_instance # 此时导入模块,模块内的session会是Mock实例 from lib.module import test_func def test_function(): # 如果test_func用到了session的方法(如client),可提前在Mock中设置返回值 # mock_session_instance.client.return_value = MagicMock() assert test_func()
方案2:用Pytest Fixture全局Mock(适用于Pytest环境)
通过自动执行的Fixture在所有测试前完成Mock:
import pytest from unittest.mock import patch, MagicMock # autouse=True会在所有测试用例执行前触发 @pytest.fixture(autouse=True) def mock_boto3_session(): with patch('boto3.session') as mock_session: mock_session.return_value = MagicMock() yield # 现在可正常导入模块,Fixture已提前完成Mock from lib.module import test_func def test_function(): assert test_func()
关键注意事项
- 不要直接Mock
lib.module.session:模块导入时已执行boto3.session(),此时Mock模块内的session变量为时已晚,必须Mock源头boto3.session。 - 按需扩展Mock:如果
test_func依赖Session的具体方法(如client、resource),可在Mock实例中添加对应返回值,确保测试流程完整。
内容的提问来源于stack exchange,提问作者J_Heads
相关产品推荐
相关产品推荐

