如何模拟超时响应

7

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

该脚本使用httplib:

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

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

我无法控制webapp,因此无法创建一个可以返回任何我想要的内容的端点,所以我的问题是:我如何模拟收到超时的情况?

2个回答

7
您可以通过查找一些异常来模拟一些httplib错误,具体请查看这里(特别是查看exceptions部分)。
非常惊讶的是,我注意到它抛出的超时是一个socket.timeout;来自不同的包。实际上,我通过将不现实的小超时值0.0001秒作为参数传递给httplib.HTTPConnection而发现了这一点。
因此,您可以通过引发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库:

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

测试:

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接