如何模拟超时响应

问题描述 投票:0回答:2

我正在创建一个 Python 脚本,它始终检查 Web 应用程序是否正常,因为通常会向多个请求发送超时响应。

此脚本使用httplib:

conn = httplib.HTTPConnection("10.255.255.1")
conn.request("HEAD", "/")
ping = conn.getresponse()

然后简单分析返回的http代码。

我不控制网络应用程序,所以我无法创建一个可以返回我想要的任何内容的端点,所以我的问题是:如何模拟我收到超时?

python timeout simulate
2个回答
7
投票

您可以通过在here查找一些异常来模拟一些httplib错误(具体来说,查看exceptions)。

非常令人惊讶的是,我注意到它抛出的超时是

socket.timeout
;来自不同的包。实际上,我通过给
httplib.HTTPConnection
提供一个不切实际的小超时作为 0.0001 秒的参数来发现这一点。

因此,您可以通过提高socket.timeout来模拟错误:

def requestResultingInTimeout():
    # Pretend to request
    raise socket.timeout

不过别忘了

import socket

你可以这样处理:

from socket import timeout
try:
    requestResultingInTimeout()
except timeout:
    print("Now that I got a timeout, I'll print this message instead")

2
投票

更现代的方法是使用 responses 库:

您的应用程序:

# my_app.py
import requests

def call_some_api(agrs):
    # here prepare request payload/auth
    try:
       response = requests.post(
            'https://some-api.com/path/',
            headers=headers,
            data=payload,
            timeout=60
       )
    except ConnectTimeout as error:
       # handle exception if needed
       return False
    return True

单元测试:

# test_my_app.py

import responses

from requests.exceptions import ReadTimeout, ConnectTimeout

from my_app import call_some_api

@responses.activate
def test_error_timeout(self):
    """test time-out exception handling"""
    responses.add(
        responses.POST,
        'https://some-api.com/path/',
        body=ConnectTimeout(),
    )
    result = call_some_api(test_agrs) 
    # here is the assertion of results of your code 
    enter code here
    assert result == False
© www.soinside.com 2019 - 2024. All rights reserved.