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

Python单元测试:失败HTTP请求测试未通过及覆盖率异常排查求助

解决你的API失败测试未通过的问题

我来帮你梳理下几个导致测试没触发异常分支、未通过的关键问题:

1. Mock的URL与实际调用的URL不匹配

你的测试里mock的是http://calldem.com/api,但实际调用的是http://callAPI.com/api/1/foobar,responses库只会拦截完全匹配的请求URL,所以这个mock根本没生效,callAPI方法实际要么发起了一个无效请求,要么走了非预期的分支。

修复方法:把测试里调用的URL改成和mock一致的,或者用正则匹配动态URL:

# 方案1:使用完全匹配的URL
resp = demConfig.callAPI('http://calldem.com/api')

# 方案2:用正则匹配带动态部分的URL
import re
responses.add(
    responses.GET,
    re.compile(r'http://callAPI.com/api/.+/foobar'),
    json={"err": "server error"},
    status=500)

2. 错误使用pytest.raises(Exception)

你的业务方法callAPI里已经用try-except捕获了所有Exception,并返回None,这个方法永远不会向外抛出异常,所以测试里用pytest.raises(Exception)会直接失败——因为根本没有异常被抛出。

修复方法:去掉pytest.raises上下文管理器,直接断言返回值为None:

@responses.activate
def testCallDemFails():
    responses.add(
        responses.GET,
        'http://calldem.com/api',
        json={"err": "server error"},
        status=500)
    demConfig = DemConfig()
    resp = demConfig.callAPI('http://calldem.com/api')
    print("testCallAPIFail", resp)
    assert resp is None  # 用is None比== None更规范

3. Mock的JSON参数格式错误

你写的json="{'err'}"是一个不合法的JSON字符串,当response.json()解析时会抛出JSONDecodeError(属于Exception子类),虽然这会被业务方法的except捕获,但写法不规范。建议直接传字典格式,responses会自动帮你转成正确的JSON响应:

responses.add(
    responses.GET,
    'http://calldem.com/api',
    json={"err": "internal server error"},  # 用字典定义JSON结构
    status=500)

额外优化建议

  • 尽量不要捕获所有Exception,可以更具体地捕获requests相关异常(比如requests.exceptions.RequestException),避免意外捕获其他无关异常。
  • 测试里可以打印responses.calls查看所有被拦截的请求,确认你的请求是否匹配到了mock:
    print("匹配到的请求:", responses.calls)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:23:12