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

如何用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
    
  • 证书过期/证书链缺失/无效:有两种实现方式:
    1. 使用真实的过期/无效证书文件,请求时指定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
      
    2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:50:29