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

单元测试导入模块时全局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()

关键注意事项

  • 不要直接Mocklib.module.session:模块导入时已执行boto3.session(),此时Mock模块内的session变量为时已晚,必须Mock源头boto3.session。
  • 按需扩展Mock:如果test_func依赖Session的具体方法(如client、resource),可在Mock实例中添加对应返回值,确保测试流程完整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:20:05