首页 > 其他分享 >httpretty,一个Mock Http请求的库

httpretty,一个Mock Http请求的库

时间:2024-05-24 15:07:18浏览次数:21  
标签:Http httpretty https import requests com response Mock

介绍:

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()

  

标签:Http,httpretty,https,import,requests,com,response,Mock
From: https://www.cnblogs.com/pywen/p/18211005

相关文章

  • https免费证书申请和安装教程
    免费的SSL证书也是可以实现https,下面是免费证书的申请和安装教程(不限制申请数量)1访问CA创建账号登录JoySSL官网,创建一个证书管理账号,在注册账号时填写注册码230916可以获取不限量领取和技术支持权限,建议填写。免费SSL证书申请网址链接https://www.joyssl.com/certificat......
  • 使用 PHP cURL 实现 HTTP 请求类
    类结构创建一个HttpRequest类,其中包括初始化cURL的方法、不同类型的HTTP请求方法,以及一些用于处理响应头和解析响应内容的辅助方法。初始化cURL首先,创建一个私有方法initCurl,用于初始化cURL句柄并设置一些常用的选项。classHttpRequest{privatefunctionini......
  • git之fatal: unable to access ‘https://11.2.7.8:68/mjgn/mj.git/‘: SSL certifica
    MENU前言方法一方法二方法三方法四结束语前言出现这个错误是因为Git在访问仓库时遇到了SSL证书问题,具体是证书的密钥太弱,不符合安全要求。方法一升级或更换SSL证书联系服务器管理员,确保服务器上使用的是强密钥SSL证书。推荐使用至少2048位的密钥。方法二......
  • 网络设置 —— Http 响应头和请求头的设置
     get请求可以使用GetAsync方法      Post请求使用PostAsync,      delete请求使用DeleteAsync      Put请求使用PutAsync      请求的完整写法HttpResponseMessageres=awaitnewHttpClient().SendAsync(reg);str......
  • 【MinIO】SpringBoot引入MinIO依赖遇到的一些问题:okhttp、kotlib-stdlib
    参考官方文档SDK:https://docs.min.io/docs/java-client-quickstart-guide.htmlMinIOJavaSDKisSimpleStorageService(akaS3)clienttoperformbucketandobjectoperationstoanyAmazonS3compatibleobjectstorageservice.MinIO依赖jar包下载地址:CentralReposi......
  • http和https的区别
    HTTP(HyperTextTransferProtocol)和HTTPS(HyperTextTransferProtocolSecure)都是用于在客户端(如浏览器)和服务器之间传输数据的协议。它们的主要区别在于安全性。以下是HTTP和HTTPS的详细区别:数据传输安全性:HTTP:数据以明文形式传输,缺乏加密。如果数据在传输过程中被拦截,攻击......
  • 新版本的禅道在使用 nginx 做 https 反向代理时,无法正常安装、升级以及登录
    是想从docker的12.5.3版本升级到16.0版本,但是按步骤升级完成后,发现会卡在一个“禅道开源版15版本升级”的介绍页面无限循环直接部署全新的系统,也会卡在配置数据库连接的页面无限循环而且在容器的日志中,会有一条ERROR1045(28000):Accessdeniedforuser'root'@'loca......
  • websocket和http的区别
    1、websocket1.1介绍WebSocket是一种实时通信协议,它允许客户端和服务器之间进行双向通信,而不需要每次请求都重新建立连接。WebSocket是HTML5中的新功能,它建立在HTTP协议之上,通过握手协议来建立持久化的连接。WebSocket的握手协议比HTTP的握手协议更简单,因为WebSocket......
  • 解决老旧电脑在win7中浏览器访问https网站出现的Let‘sEncrypt证书过期的问题
        原因LetsEncrypt证书未过期,但是其顶级ca根证书“DSTRootCAX3”在2021-09-01过期了,老旧设备上的win系统会被影响到。解决步骤下载三张Letsencrypt的根证书“DSTRootCAX3”的最新版本,包含isrgrootx1.der+isrg-root-x2.der+lets-encrypt-r3.der:https://do......
  • Gin 框架是怎么使用 net http 包的(gin.go)
     Gin框架是基于Go语言的标准库net/http构建的,它使用net/http提供的基础功能来构建自己的高性能Web应用框架。具体来说,Gin使用net/http的以下方面: 1,HandlerFunc:Gin使用net/http的HandlerFunc类型,这是一个可以作为HTTP处理程序的函数类型。Gin自己的路......