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

测试requests连接错误重试适配器:connect=10配置未生效

问题分析与解决

你的测试用例中连接错误重试未生效,主要有两个核心原因:

1. 异常类型不匹配

requests.adapters.Retry的connect参数仅针对requests库定义的连接异常(requests.exceptions.ConnectionError及其子类,比如NewConnectionError),而非Python内置的ConnectionError。你当前mock抛出的是内置ConnectionError,不会被Retry逻辑识别为需要重试的连接错误。

2. 调用次数断言错误

connect=10表示遇到连接错误时会重试10次,加上第一次初始调用,send方法总共会被调用11次,而非你断言的10次。

修正后的测试用例

import pytest
from unittest.mock import patch
import requests
from your_module import RetryRequest  # 替换为你的实际模块名

@patch('requests.adapters.HTTPAdapter.send', side_effect=requests.exceptions.ConnectionError)
def test_retry_on_connection_error(mock_send):
    """Test to verify that the RetryRequest retries when a connection error occurs."""
    retry_request = RetryRequest()
    request_session = retry_request.session

    # 发起请求并预期捕获连接异常
    with pytest.raises(requests.exceptions.ConnectionError):
        request_session.get('https://example.com/test')

    # 验证总调用次数:1次初始请求 + 10次重试
    assert mock_send.call_count == 11, f"预期11次调用(1次初始+10次重试),实际{mock_send.call_count}次"

精准Mock的可选方案

如果担心全局Mock的覆盖范围问题,可以直接patch当前Session实例绑定的Adapter方法,确保精准命中:

def test_retry_on_connection_error_direct():
    retry_request = RetryRequest()
    # 直接patch当前Session使用的HTTPS Adapter的send方法
    with patch.object(retry_request.session.adapters['https://'], 'send', side_effect=requests.exceptions.ConnectionError) as mock_send:
        with pytest.raises(requests.exceptions.ConnectionError):
            retry_request.session.get('https://example.com/test')
        
        assert mock_send.call_count == 11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:28