HTTPretty 简介
HTTPretty 是一款 Python 库,专为测试环境设计,能够轻巧而精确地模拟 HTTP(s) 请求与响应。它通过注册 mock 接口和预设响应数据,使得测试代码无需真正连接互联网或依赖于外部服务器的实时响应。HTTPretty 支持多种请求方法(如 GET、POST)、自定义头信息、重定向、延迟响应等特性,为您的测试代码提供了高度可控且稳定的模拟环境。
为何选择 HTTPretty?
优势:
隔离测试:避免因外部服务不稳定或网络波动导致的测试失败,确保测试结果的准确性和一致性。
加速测试:无需等待真实网络请求的往返时间,显著缩短测试周期,尤其是在进行大量接口测试或回归测试时效果尤为明显。
控制复杂场景:轻松模拟各种边缘情况和错误响应,如超时、404、500 状态码等,有助于全面覆盖测试用例。
保护敏感数据:在测试环境中使用模拟数据代替真实用户数据,保护隐私信息不外泄。
代码示例
示例一:模拟获取微信 access_token API 响应
场景描述:在微信订阅号开发中,通常需要调用微信 API 获取 access_token。使用 HTTPretty 可以在测试环境中模拟这个过程,确保代码逻辑正确处理不同类型的响应。
import requests
from httpretty import HTTPretty, httprettified
# 微信 API 地址
WECHAT_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token"
@httprettified
def test_get_access_token():
# 预设模拟响应
expected_response = '{"access_token":"your_token","expires_in":7200}'
HTTPretty.register_uri(
HTTPretty.GET,
WECHAT_TOKEN_URL,
body=expected_response,
status=200,
content_type="application/json",
)
# 调用实际获取 access_token 的函数(假设已实现)
access_token = get_access_token(appid, secret)
# 断言返回的 access_token 与模拟响应一致
assert access_token == "your_token"
示例二:模拟用户关注事件 webhook
场景描述:当用户关注订阅号时,微信服务器会向您的应用发送一个 webhook 通知。利用 HTTPretty,可以在本地测试环境中模拟这个 webhook 请求,检查您的事件处理器是否正确处理关注事件。
import json
from httpretty import HTTPretty, httprettified
# 事件处理器 URL
EVENT_HANDLER_URL = "https://your_server.com/wechat/webhook"
@httprettified
def test_handle_subscribe_event():
# 构造关注事件的 JSON 数据
event_payload = {
"ToUserName": "your_appid",
"FromUserName": "openid",
"Event": "subscribe",
}
HTTPretty.register_uri(
HTTPretty.POST,
EVENT_HANDLER_URL,
body=json.dumps(event_payload),
content_type="application/json",
)
# 调用实际的事件处理器函数(假设已实现)
handle_subscribe_event(json.dumps(event_payload))
# 验证处理逻辑,如检查数据库中用户状态是否已更新为已关注
assert UserSubscription.query.filter_by(openid="openid").one().is_subscribed
示例三:模拟请求失败场景(404 错误)
场景描述:为了确保代码对异常情况有恰当的处理,可以使用 HTTPretty 模拟 HTTP 404 Not Found 响应。
from httpretty import HTTPretty, httprettified
# 需要模拟失败响应的 API 地址
API_URL = "https://api.example.com/resource"
@httprettified
def test_handle_not_found_error():
HTTPretty.register_uri(
HTTPretty.GET,
API_URL,
status=404,
body="Resource not found",
content_type="text/plain",
)
# 调用实际请求函数(假设已实现)
response = make_api_request()
# 断言请求返回的状态码和处理结果
assert response.status_code == 404
assert response.content == b"Resource not found"
assert error_handling_function(response) is not None
示例四:模拟延迟响应以测试超时处理
场景描述:在某些情况下,您可能需要测试代码在面对延迟响应时的处理能力。HTTPretty 允许设置响应延迟。
import time
from httpretty import HTTPretty, httprettified
# 需要模拟延迟响应的 API 地址
DELAYED_API_URL = "https://slow-api.example.com/data"
@httprettified
def test_request_timeout_handling():
HTTPretty.register_uri(
HTTPretty.GET,
DELAYED_API_URL,
body='{"key": "value"}',
content_type="application/json",
status=200,
)
HTTPretty.enable_net_connect(False) # 禁止真实网络连接
# 设置模拟响应延迟 5 秒
HTTPretty.register_uri(
HTTPretty.GET,
DELAYED_API_URL,
body='{"key": "value"}',
content_type="application/json",
status=200,
adding_headers={"X-Delay": "5"},
)
# 调用实际请求函数(假设已实现),并设置超时时间为 3 秒
start_time = time.time()
try:
response = make_api_request(timeout=3)
except requests.exceptions.Timeout:
elapsed_time = time.time() - start_time
assert elapsed_time >= 3 # 确保超时触发
return # 跳过后续断言,因为预期会抛出异常
assert False, "Expected a Timeout exception, but it was not raised."
示例五:模拟分页查询 API 响应
场景描述:许多 API 提供分页查询功能。使用 HTTPretty,可以模拟不同分页的响应,测试您的代码是否正确处理分页逻辑。
import json
from httpretty import HTTPretty, httprettified
# 分页查询 API 地址
PAGINATION_API_URL = "https://api.example.com/items"
@httprettified
def test_pagination_logic():
# 预设第一页响应
first_page_response = {
"items": [{"id": 1, "name": "Item 1"}, {"id": 2, "name": "Item 2"}],
"next_page": "https://api.example.com/items?page=2",
}
HTTPretty.register_uri(
HTTPretty.GET,
PAGINATION_API_URL,
body=json.dumps(first_page_response),
status=200,
content_type="application/json",
)
# 预设第二页响应
second_page_response = {
"items": [{"id": 3, "name": "Item 3"}, {"id": 4, "name": "Item 4"}],
"next_page": None,
}
HTTPretty.register_uri(
HTTPretty.GET,
first_page_response["next_page"],
body=json.dumps(second_page_response),
status=200,
content_type="application/json",
)
# 调用实际分页查询函数(假设已实现)
all_items = fetch_all_items(PAGINATION_API_URL)
# 验证所有项目是否按预期顺序加载
expected_items = [
{"id": 1, "name": "Item 1"},
{"id": 2, "name": "Item 2"},
{"id": 3, "name": "Item 3"},
{"id": 4, "name": "Item 4"},
]
assert all_items == expected_items
以上五个示例展示了如何在不同场景下使用 Python HTTPretty 进行 HTTP 请求模拟,涵盖了获取微信 access_token、模拟用户关注事件、模拟请求失败(404 错误)、模拟延迟响应测试超时处理以及模拟分页查询 API 响应。通过这些示例,您应该能更好地理解如何在实际项目中运用 HTTPretty 提高测试效率和代码质量。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 759968159,里面有各种测试开发资料和技术可以一起交流哦。
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。