Hypothesis:高效的 Python 测试工具
简介:Hypothesis 是一个强大的 Python 测试库,旨在自动生成各种测试案例,以帮助开发者发现潜在的边界问题和隐藏的错误。通过对输入数据进行智能化的探索,Hypothesis 能够为测试提供更全面的覆盖,避免遗漏一些极端或不常见的输入。Hypothesis 在测试驱动开发(TDD)中尤为有用,能够大大减少人为编写繁琐测试用例的工作量,并提升测试质量。
历史攻略:
Mockaroo - 在线生成测试用例利器
pytest-asyncio:协程异步测试案例
pytest-stress:好用的pytest压力测试插件
pytest-cov:好用的统计代码测试覆盖率插件
pytest-xdist:远程多主机 - 分布式运行自动化测试
深度学习-PyTorch:02-基于BERT-base打造AI芯片高效 - 简易版压力测试工具
一、基本特性
1.1 自动化生成测试用例:Hypothesis 会根据你的测试函数自动生成不同的输入数据,从而覆盖更广泛的场景和数据组合。
1.2 支持多种数据类型:支持对各种数据类型的生成,包括整数、浮点数、字符串、集合、字典等。
1.3 可扩展性强:支持自定义数据生成策略,能够为复杂的数据结构编写自定义生成器。
1.4 与 pytest 集成:Hypothesis 与 pytest 紧密集成,可以方便地与现有的测试框架配合使用。
1.5 边界条件检测:Hypothesis 能够有效检测到边界条件,自动触发潜在的异常情况。
1.6 快速反馈:生成的测试用例覆盖面广,能够更早发现错误并提供快速反馈。
二、安装
可以通过 pip 安装 Hypothesis:
pip install hypothesis
三、基本用法
3.1 与 pytest 一起使用:Hypothesis 能够与 pytest 集成,通过装饰器和生成器来自动化生成测试数据。假设已经安装了 pytest,以下是一个简单的例子:
import pytest
from hypothesis import given
from hypothesis.strategies import integers# 假设你有一个简单的加法函数
def add(a, b):return a + b# 使用 Hypothesis 自动生成测试数据
@given(integers(), integers())
def test_addition(a, b):result = add(a, b)assert result == a + b
在这个例子中,@given(integers(), integers()) 装饰器让 Hypothesis 自动为 a 和 b 生成整数输入。Hypothesis 会随机选择不同的整数来执行测试,确保 add() 函数的正确性。
3.2 自定义数据生成器:Hypothesis 允许你自定义数据生成器。通过 hypothesis.strategies 模块,你可以选择或创建符合特定要求的生成器。例如,生成一个带有字母和数字的字符串:
from hypothesis import given
from hypothesis.strategies import text# 生成符合特定模式的字符串
@given(text(min_size=5, max_size=10))
def test_string_length(s):assert 5 <= len(s) <= 10
在这个例子中,@given(text(min_size=5, max_size=10)) 装饰器指定了生成的字符串长度在 5 到 10 之间。
3.3 边界条件测试:Hypothesis 可以自动探索边界条件,帮助开发者发现潜在的边界错误。例如:
from hypothesis import given
from hypothesis.strategies import integers# 测试一个除法函数,避免除以零
def safe_divide(a, b):if b == 0:raise ValueError("Cannot divide by zero")return a / b# 使用 Hypothesis 自动检测除以零的情况
@given(integers(), integers())
def test_safe_divide(a, b):if b == 0:try:safe_divide(a, b)assert False, "Expected ValueError"except ValueError:passelse:safe_divide(a, b)
在此示例中,Hypothesis 会自动生成各种整数值作为输入,检查是否能正确处理除以零的错误。
3.4 生成复杂的数据结构:Hypothesis 不仅支持基本数据类型,还支持复杂的数据结构。例如,生成包含多个键值对的字典:
from hypothesis import given
from hypothesis.strategies import dictionaries, text, integers# 测试一个简单的字典操作
@given(dictionaries(keys=text(), values=integers()))
def test_dict_length(d):assert len(d) >= 0
在这个例子中,dictionaries(keys=text(), values=integers()) 会生成一个键为字符串、值为整数的字典,并验证其长度大于等于 0。
示例代码:hypothesis_demo.py
# -*- coding: utf-8 -*-
# time: 2024/12/08 14:15
# file: hypothesis_demo.py
# 公众号: 玩转测试开发import pytest
from hypothesis import given
from hypothesis.strategies import dictionaries, text, integers# 1. 假设你有一个简单的加法函数
def add(a, b):return a + b# 使用 Hypothesis 自动生成测试数据
@given(integers(), integers())
def test_addition(a, b):result = add(a, b)assert result == a + b# 2. 生成符合特定模式的字符串
@given(text(min_size=5, max_size=10))
def test_string_length(s):assert 5 <= len(s) <= 10# 3. 测试一个除法函数,避免除以零
def safe_divide(a, b):if b == 0:raise ValueError("Cannot divide by zero")return a / b# 使用 Hypothesis 自动检测除以零的情况
@given(integers(), integers())
def test_safe_divide(a, b):if b == 0:try:safe_divide(a, b)assert False, "Expected ValueError"except ValueError:passelse:safe_divide(a, b)# 4. 测试一个简单的字典操作
@given(dictionaries(keys=text(), values=integers()))
def test_dict_length(d):assert len(d) >= 0
四、运行参考结果

4.1 测试用例执行:运行 pytest 测试时,Hypothesis 会自动生成不同的输入数据,并执行相应的测试用例。如果测试用例失败,Hypothesis 会提供失败的输入数据,以帮助开发者定位问题。
4.2 边界情况生成:Hypothesis 会自动探索边界条件,例如极大或极小的输入,零值,空集合等,帮助开发者发现边界错误。
4.3 快速反馈:通过自动生成多种测试数据,Hypothesis 能够更早地发现潜在的 bug,提升开发过程中的反馈速度。
五、注意事项
5.1 测试数据量控制:Hypothesis 会生成大量的测试数据,可能导致测试时间较长。可以通过装饰器参数 max_examples 控制生成的测试用例数量,例如:
@given(integers())
@example(0)
def test_example(a):assert a >= 0
5.2 与其他框架兼容:Hypothesis 与 pytest 最为兼容,但也支持其他框架,如 unittest。在使用时,可以查看相关文档,确保与现有测试框架的配合。
5.3 调试测试失败:当测试失败时,Hypothesis 会展示引起失败的输入数据,帮助开发者进行调试。你也可以使用 @example 装饰器指定特定的输入值来重现问题。
5.4 复杂类型的生成:对于非常复杂的类型或场景,可能需要自定义生成器来确保测试的有效性。
六、小结
Hypothesis 是一个非常强大的工具,能够自动生成多种类型的测试数据并与 pytest 无缝集成。通过其智能化的数据生成机制,开发者能够更快速地发现潜在的 bug 和边界条件错误。它特别适用于需要高覆盖率的自动化测试场景,能够显著提高测试的质量和开发效率。
相关文章:
Hypothesis:高效的 Python 测试工具
简介:Hypothesis 是一个强大的 Python 测试库,旨在自动生成各种测试案例,以帮助开发者发现潜在的边界问题和隐藏的错误。通过对输入数据进行智能化的探索,Hypothesis 能够为测试提供更全面的覆盖,避免遗漏一些极端或不…...
Terminus Calculator 计算原理分享
在《使命召唤:黑色行动 6》僵尸模式中,Terminus 关卡的研究办公室里有一个复杂的数学谜题需要解决。为了获得多相共振器,玩家需要计算出三个数字并输入电脑。虽然可以花费 5000 精华来获得答案,但使用 Terminus Calculator 可以更…...
Wwise 使用MIDI文件、采样音频
第一种:当采样音频只有一个文件的时候 1.拖入MIDI文件到Interactive Music Hierarchy层级 2.拖入采样音频到Actor-Mixer Hierarchy层级 3.勾选MIDI显示出面板,设置Root Note与采样音频音高相同,这里是C#5 4.播放测试,成功&…...
在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案
在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案 背景概述解决方案脚本实现脚本说明使用指南注意事项在CentOS操作系统环境中,若需并发上传特定目录下的.wav文件至HTTP服务器,而系统未安装GNU parallel工具,我们可通过其他方法实现此需求。本文将介绍一种利用Sh…...
【RocketMQ 源码分析(一)】设计理念与源码阅读技巧
RocketMQ 的设计理念与源码阅读技巧 一、设计理念二、源码设计三、源码阅读技巧 一直想仔细仔细看看这个 RocketMQ 的源码,学学它的设计思想和编码风格,没准在以后自己在设计和编码的时候有思考的方向。这是专栏的第一篇 —— 介绍下 RocketMQ 的一些设计…...
独立ip服务器有什么优点?
网站的性能和安全性直接影响到用户体验和业务发,独立IP服务器作为一种主流的托管方式,因其独特的优势而受到许多企业和个人站长的青睐。与共享IP相比,独立IP服务器到底有哪些优点呢? 使用独立IP的用户不必担心与其他网站共享同一…...
如何使用Python库连接Redis
1、redis-py 库封装一个 Redis 工具类可以帮助我们简化 Redis 的操作并提高代码的复用性和可维护性。 安装redis pip install redisimport redis import logginglogging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__)class RedisUtils:def __init__(s…...
Vant UI +Golang(gin) 上传文件
前端基本用法:点击查看 实现代码: const afterRead (file) > {console.log(file);//set content-type to multipart/form-dataconst formData new FormData();formData.append("file", file.file);request.POST("/api/v1/users/up…...
【Unity高级】如何实现粒子系统的间歇式喷射
先看下要最终实现的效果: 代码如下: using UnityEngine; using System.Collections;public class ParticleBurstController : MonoBehaviour {private ParticleSystem _particleSystem; // 获取粒子系统public float burstDuration 2f; // 每次…...
通过linux命令获取自选股票价格及大盘涨跌幅
技术发展与数据获取需求 互联网与金融数据融合:随着互联网的普及和金融市场的数字化发展,金融数据的获取和分析变得更加便捷和重要。投资者希望能够及时、准确地获取股票价格和市场指数等信息,以便做出合理的投资决策。Linux 作为一种强大的操作系统,为数据获取和处理提供…...
透彻理解并解决Mockito模拟框架的单元测试无法运行的问题
本篇的实例基于Maven IDE (VS Code) 运行 在VS Code 运行的时候, 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮,单击就可以运行使用Mockito 注解 ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。 不使用注…...
vue3字典数据的显示问题(使用hooks解决)
我们在使用 element-plus的时候,经常会使用一些字典数据, 在搜索框的时候,字典数数要使用 el-select el-option 来显示,当在table表格的时候,我们通常记录的是 字典数据的id , 又要把它改变成 字典数据的 name 属性 因…...
Elasticsearch 单节点安全配置与用户认证
Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞:Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时,需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤,为单节…...
二分查找(带图详解)
优选算法系列 文章目录 优选算法系列前言一、二分查找的思想二、算法使用小总结 三、代码实现四、二分查找拓展4.1、查找第一次出现的target小总结 4.2、target最后出现的位置小总结 五、代码总结 前言 在这篇博客中,我会给大家分享二分查找及其扩展。 这是链接-&…...
【Git】:标签管理
目录 理解标签 创建标签 操作标签 理解标签 标签的作用 标记版本:标签 tag ,可以简单的理解为是对某次 commit 的⼀个标识,相当于起了⼀个别名。例如,在项目发布某个版本的时候,针对最后⼀次 commit 起⼀个 v1.0 这样…...
物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉
0. 要实现的效果 让树莓派可以识别身边的一些物品,比如电脑,鼠标,键盘,杯子,行李箱,双肩包,床,椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…...
单片机软件工程师前景分析
单片机软件工程师的前景在2024年看起来是积极的。随着物联网(IoT)、自动化、智能设备等领域的快速发展,对于能够开发基于单片机(MCU)如STM32、ARM、51等嵌入式系统的软件工程师需求持续增长。这些工程师负责设计和实现…...
在Java中几种常用数据压缩算法的实现及其优劣势
在Java中几种常用数据压缩算法的实现及其优劣势 背景:项目需要引入Redis作为缓存组件,需要考虑到Redis的内存占用(机器内存越大,成本越高),因此需要引入数据压缩。 1、介绍 数据压缩是计算机领域中一项重要…...
Word——如何打出 符号中的 1、2、3等带圆圈的序号
一、方式1 1.1:点击 插入-符号 1.2:字体 选择 Wingdings 或者 Wingdings 2 二、方式2 带1的圈:输入 2460,然后按 AItX 带2的圈:输入 2461,然后按 AItX 带3的圈:输入 2462,然后按 …...
操作系统之进程与线程
进程 定义: 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 组成: 包括程序代码、程序处理的数据、程序计数器、一组寄存器的值以及系统资源(如打开的文件)等。 …...
3个步骤让你的外文漫画秒变中文:BallonsTranslator零门槛入门指南
3个步骤让你的外文漫画秒变中文:BallonsTranslator零门槛入门指南 【免费下载链接】BallonsTranslator 深度学习辅助漫画翻译工具, 支持一键机翻和简单的图像/文本编辑 | Yet another computer-aided comic/manga translation tool powered by deeplearning 项目地…...
5分钟终极指南:永久免费使用Cursor Pro功能的完整解决方案
5分钟终极指南:永久免费使用Cursor Pro功能的完整解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your…...
从数字臃肿到高效存储:开源视频图片压缩解决方案深度解析
从数字臃肿到高效存储:开源视频图片压缩解决方案深度解析 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compress…...
Adafruit Bluefruit Playground:iOS与蓝牙开发板的物联网交互实战
1. 项目概述与核心价值 如果你手头有一块Adafruit的Circuit Playground Bluefruit或者CLUE开发板,想让它在你的iPhone或iPad上“活”起来,变成一个能远程控制彩灯、读取传感器数据甚至演奏音乐的智能玩具,那么Adafruit Bluefruit Playground …...
10个UTF8-CPP最佳实践:让你的C++ Unicode处理更高效
10个UTF8-CPP最佳实践:让你的C Unicode处理更高效 【免费下载链接】utfcpp UTF-8 with C in a Portable Way 项目地址: https://gitcode.com/gh_mirrors/ut/utfcpp UTF8-CPP是一个轻量级的C库,提供了便捷的UTF-8编码和解码功能,帮助开…...
C语言字符串处理算法:反转、回文检测等实用技巧终极指南
C语言字符串处理算法:反转、回文检测等实用技巧终极指南 【免费下载链接】c Implementation of All ▲lgorithms in C Programming Language 项目地址: https://gitcode.com/gh_mirrors/c3/c 你是否在寻找C语言字符串处理的高效方法?🤔…...
Kubernetes Agent沙箱:构建安全隔离的集群组件运行时环境
1. 项目概述:一个为Kubernetes集群“特工”准备的沙箱在云原生世界里,Kubernetes已经成为了事实上的操作系统,而运行在其中的工作负载,就是一个个“特工”,它们执行着各种关键任务。但你是否想过,这些“特工…...
Astra Toolbox终极指南:如何快速掌握高性能GPU加速3D重建
Astra Toolbox终极指南:如何快速掌握高性能GPU加速3D重建 【免费下载链接】astra-toolbox ASTRA Tomography Toolbox 项目地址: https://gitcode.com/gh_mirrors/as/astra-toolbox 还在为复杂的CT重建算法而烦恼吗?想要让医学影像处理和工业检测的…...
提供充电桩运维托管的服务商:选择标准与服务内容解析
一、引言据中国电动汽车充电基础设施促进联盟(EVCIPA)数据显示,截截至2026年2月底,我国电动汽车充电基础设施(枪)总数达到2101.0万个,同比增长47.8%。其中,公共充电设施(…...
ISDN PRI外线故障排查实战指南
在实际运维案例中,工程师不怕故障一直出现,就怕偶尔出问题。比如客户反馈打外线时,偶尔会出现断线的情况。当然可以通过MST或Trace命令去跟踪,但如果故障发生频率过低,抓日志往往很难。我们通常需要先检查线路质量&…...
