我正在创建一个 Python 脚本,它始终检查 Web 应用程序是否正常,因为通常会向多个请求发送超时响应。
此脚本使用httplib:
conn = httplib.HTTPConnection("10.255.255.1")
conn.request("HEAD", "/")
ping = conn.getresponse()
然后简单分析返回的http代码。
我不控制网络应用程序,所以我无法创建一个可以返回我想要的任何内容的端点,所以我的问题是:如何模拟我收到超时?
您可以通过在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")
更现代的方法是使用 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