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
相关产品推荐
相关产品推荐

