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,然后按 …...
操作系统之进程与线程
进程 定义: 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。 组成: 包括程序代码、程序处理的数据、程序计数器、一组寄存器的值以及系统资源(如打开的文件)等。 …...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
el-amap-bezier-curve运用及线弧度设置
文章目录 简介示例线弧度属性主要弧度相关属性其他相关样式属性完整示例链接简介 el-amap-bezier-curve 是 Vue-Amap 组件库中的一个组件,用于在 高德地图 上绘制贝塞尔曲线。 基本用法属性path定义曲线的路径,可以是多个弧线段的组合。stroke-weight线条的宽度。stroke…...