Python HTTPretty:轻松模拟 HTTP 请求

本文介绍了如何使用Python库HTTPretty在软件测试面试准备中模拟各种场景,包括微信access_token获取、webhook事件处理、错误响应、超时测试和分页查询,以提高测试效率和代码质量。作者分享了实际的代码示例和面试题资源,帮助读者提升测试技能和找到工作机会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)_软件测试刷题小程序-CSDN博客文章浏览阅读3.3k次,点赞86次,收藏15次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、app自动化测试、接口测试、性能测试、自动化测试、安全测试及一些常问到的人力资源题目。最主要的是他还收集了像阿里、华为这样的大厂面试真题,还有互动交流板块……_软件测试刷题小程序https://blog.csdn.net/AI_Green/article/details/134931243?spm=1001.2014.3001.5502icon-default.png?t=N7T8https://blog.csdn.net/AI_Green/article/details/134931243?spm=1001.2014.3001.5502

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%免费】

​​​软件测试面试文档

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

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值