如何用requests-mock或其他库测试Python requests的各类场景及SSL证书故障?
可以用requests-mock及相关库实现这些测试场景
基础请求场景测试(以requests-mock为主)
- 服务器不可达:这种情况是连不上服务器,不用requests-mock,直接用
unittest.mock模拟requests.get抛出requests.exceptions.ConnectionError即可:from unittest.mock import patch import requests def test_server_unreachable(): with patch('requests.get') as mock_get: mock_get.side_effect = requests.exceptions.ConnectionError try: requests.get('http://unreachable.server') except requests.exceptions.ConnectionError: assert True else: assert False - 服务器可达但目标服务不可用:用requests-mock模拟返回5xx状态码(比如503),模拟服务不可用的情况:
import requests_mock import requests def test_service_unavailable(): with requests_mock.Mocker() as m: m.get('http://available.server/unavailable', status_code=503) response = requests.get('http://available.server/unavailable') assert response.status_code == 503 - 请求调用失败:模拟返回4xx状态码(比如400、404),或者直接抛出请求异常(比如超时):
import requests_mock import requests def test_request_failure(): # 模拟400错误 with requests_mock.Mocker() as m: m.get('http://api.server/bad-request', status_code=400) response = requests.get('http://api.server/bad-request') assert response.status_code == 400 # 模拟超时异常 with requests_mock.Mocker() as m: m.get('http://api.server/timeout', exc=requests.exceptions.Timeout) try: requests.get('http://api.server/timeout') except requests.exceptions.Timeout: assert True - 请求调用成功:用requests-mock模拟返回200状态码和正常响应内容:
import requests_mock import requests def test_request_success(): with requests_mock.Mocker() as m: m.get('http://api.server/success', json={'data': 'ok'}, status_code=200) response = requests.get('http://api.server/success') assert response.status_code == 200 assert response.json() == {'data': 'ok'}
SSL证书场景测试(结合requests参数+unittest.mock/自定义证书文件)
- 证书有效:正常请求时指定有效证书文件即可,或者在mock场景下默认不会触发真实SSL校验,如果要模拟真实校验逻辑,可使用有效证书文件测试:
import requests def test_valid_ssl_certificate(): # 假设已有有效证书文件valid_cert.pem try: response = requests.get('https://valid.server', verify='valid_cert.pem') assert response.status_code == 200 except requests.exceptions.SSLError: assert False - 证书过期/证书链缺失/无效:有两种实现方式:
- 使用真实的过期/无效证书文件,请求时指定
verify参数为该文件,会触发SSLError:import requests def test_invalid_ssl_certificate(): # 假设已有过期证书文件expired_cert.pem try: requests.get('https://expired.server', verify='expired_cert.pem') except requests.exceptions.SSLError: assert True else: assert False - 用
unittest.mock模拟请求过程抛出SSLError,无需真实证书文件:from unittest.mock import patch import requests from requests.exceptions import SSLError def test_ssl_error_mock(): with patch('requests.adapters.HTTPAdapter.send') as mock_send: mock_send.side_effect = SSLError("证书无效/过期/链缺失") try: requests.get('https://invalid.server') except SSLError: assert True else: assert False
- 使用真实的过期/无效证书文件,请求时指定
内容的提问来源于stack exchange,提问作者nikoladsp
相关产品推荐
相关产品推荐

