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 提高测试效率和代码质量。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

​​​软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐