httpretty,一个Mock Http请求的库
介绍:
HTTPretty是一个用于在测试环境中模拟HTTP请求和响应。允许开发者在不实际进行网络调用的情况下,完全控制HTTP交互。通过拦截网络请求并提供预定义的响应。使用HTTPretty,开发者可以模拟各种网络条件,如延迟、错误和超时。
安装
pip install httpretty
使用HTTPretty 模拟一个HTTP GET 请求的响应
import httpretty
import requests
httpretty.enable() # 开启HTTPretty
httpretty.register_uri(httpretty.GET, "https://www.wen.com/index",
body='{"result": "success", "code": "1", "data": [1, 2, 3]}',
adding_headers={'Content-Type': 'application/json'})
response = requests.get("https://www.wen.com/index")
print(response.json())
httpretty.disable() # 关闭HTTPretty
httpretty.reset() # 重置HTTPretty状态
使用 HTTPretty 模拟一个HTTP POST请求的响应
import httpretty
import requests
httpretty.enable()
httpretty.register_uri(httpretty.POST, "https://www.wenx.com/index",
body='{"status": "received", "msg": "ok"}',
adding_headers={'Content-Type': 'application/json'})
response = requests.post("https://www.wenx.com/index", data={"name": "Miko"})
print(response.json())
httpretty.disable()
httpretty.reset()
错误处理模拟
模拟错误响应是测试中一个重要的部分,HTTPretty 可以模拟不同的HTTP状态代码和错误信息。通过设置status参数,模拟了一个返回404状态码的HTTP请求。
import httpretty
import requests
httpretty.enable()
httpretty.register_uri(httpretty.GET, "https://api.example.com/notfound",
status=404)
response = requests.get("https://api.example.com/notfound")
print(response.status_code)
httpretty.disable()
httpretty.reset()
动态响应内容
HTTPretty 允许使用回调函数来动态生成响应内容,这在需要根据请求内容自定义响应时非常有用。
这个示例展示了如何根据请求头中的Content-Type动态调整响应内容。
import httpretty
import requests
httpretty.enable()
def request_callback(request, uri, response_headers):
content_type = request.headers.get('Content-Type')
if content_type == 'application/json':
return [200, response_headers, '{"message": "JSON received"}']
else:
return [200, response_headers, "Received"]
httpretty.register_uri(httpretty.POST, "https://api.example.com/submit",
body=request_callback)
response1 = requests.post("https://api.example.com/submit", json={"key": "value"})
print(response1.text)
response2 = requests.post("https://api.example.com/submit", data={"key": "value"})
print(response2.text)
httpretty.disable()
httpretty.reset()
延迟响应
模拟网络延迟可以帮助测试应用在慢速网络环境下。这个示例演示了如何模拟网络延迟,通过在响应函数中加入sleep来实现。
import httpretty
import requests
import time
httpretty.enable()
def delayed_response(request, uri, response_headers):
time.sleep(2) # 延迟2秒
return [200, response_headers, '{"message": "Delayed response"}']
httpretty.register_uri(httpretty.GET, "https://api.example.com/delay",
body=delayed_response)
response = requests.get("https://api.example.com/delay")
print(response.json())
httpretty.disable()
httpretty.reset()
流式响应
HTTPretty还支持模拟流式响应,这对于测试处理如视频流或大数据下载的应用非常有用。通过生成器streaming_body来模拟一个流式响应。
import httpretty
import requests
httpretty.enable()
def streaming_body():
yield "Hello"
yield " "
yield "world!"
# 生成器转换成列表
body_list = list(streaming_body())
httpretty.register_uri(httpretty.GET, "https://api.example.com/stream",
body=''.join(body_list))
response = requests.get("https://api.example.com/stream", stream=True)
print(''.join(response.iter_content(decode_unicode=True))) # 输出流式响应内容
httpretty.disable()
httpretty.reset()
实际应用场景
单元测试
HTTPretty 常用于单元测试,尤其是在测试涉及外部API调用的功能时。通过模拟API响应,开发者可以确保他们的代码在各种网络条件下都能正常工作。测试一个依赖外部API的功能,确保在API响应延迟时,应用能正确处理。
import time
import httpretty
import requests
httpretty.enable()
# 模拟API响应延迟
def delayed_weather_api(request, uri, response_headers):
time.sleep(2)
return [200, response_headers, '{"temperature": "test"}']
httpretty.register_uri(httpretty.GET, "https://weatherapi.example.com/today",
body=delayed_weather_api)
# 测试应用如何处理延迟
def test_weather():
response = requests.get("https://weatherapi.example.com/today")
if response.status_code == 200:
return response.json()['temperature']
else:
return "Error"
print(test_weather())
httpretty.disable()
httpretty.reset()
集成测试
在集成测试中,HTTPretty可以用来模拟服务间的交互,特别是在微服务架构中。在微服务架构中,模拟一个服务失败的情况,测试系统的容错能力。
import httpretty
import requests
httpretty.enable()
# 模拟服务失败
httpretty.register_uri(httpretty.GET, "https://paymentservice.example.com/charge",
status=500)
# 测试系统如何响应服务失败
def process_payment():
response = requests.get("https://paymentservice.example.com/charge")
if response.status_code == 500:
return "Service Error"
else:
return "OK"
print(process_payment())
httpretty.disable()
httpretty.reset()
性能测试
使用HTTPretty模拟不同网络条件,测试应用的性能。模拟网络拥堵和高延迟,测试应用的响应时间和用户体验。
import time
import httpretty
import requests
httpretty.enable()
# 模拟高延迟网络
def high_latency_simulation(request, uri, response_headers):
time.sleep(5) # 5秒高延迟
return [200, response_headers, '{"status": "ok"}']
httpretty.register_uri(httpretty.GET, "https://api.example.com/data",
body=high_latency_simulation)
response = requests.get("https://api.example.com/data")
print("Response time:", response.elapsed.total_seconds(), "seconds") # 输出响应时间
httpretty.disable()
httpretty.reset()

浙公网安备 33010602011771号