python代码测试 vim_用 Hypothesis 快速测试你的 Python 代码

点击上方“Python编程时光”,选择“加为星标”第一时间关注Python技术干货!

117bc6fd2c3485a4b278b5e4f0051046.png

介绍

无论你使用哪种编程语言或框架,测试都非常重要。Hypothesis是 Python 的一个高级测试库。它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试数据。可以用更少的工作在代码中发现更多的bug。该测试库覆盖了大多数情况,并且确实可以帮助你查找代码中的错误。

这篇文章为展示了如何使用Hypothesis在Python中进行测试,并提供了一些示例。

我们如何区分测试?

在我们开始进行基于属性的测试之前,我们需要知道测试的一般区别。有不同的分组测试方法,两种最常见的方法基于测试方法和测试级别。让我们从大多数人已经听说的测试级别开始。本质上,存在四个测试级别(尽管人们可能也知道或定义其他级别):

  • 单元测试
  • 集成测试
  • 系统测试
  • 端到端测试

不同测试级别侧重专注于不同的事物。单元测试侧重于软件的特定部分或功能。这可以是单个功能或功能的一部分。相反,集成测试侧重于通过软件组件的接口进行协作。系统测试甚至更进一步,可以测试整个系统。

现在,我们将看看存在的各种各样的测试方法。

最常见和已知的是静态和动态测试。所谓静态测试(static testing)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。如果软件或其部分实际执行,我们称之为动态测试。编写单元测试和集成测试属于动态测试。

另一种常见的方法是盒式方法。基本上,它可以分为白盒测试和黑盒测试(以及灰盒测试作为两者的混合)。白盒测试可验证程序的内部结构或工作情况。黑盒测试与之相反,在黑盒测试中,应用程序被视为黑盒,并且对其交互进行测试。这意味着在不了解内部实现的情况下测试功能。

什么是基于属性的测试?

现在,我们快速了解了如何区分测试,您可能会问:什么是基于属性的测试?

基于属性的测试技术( Property-based testing),是指编写对你的代码来说为真的逻辑语句(即“属性”),然后使用自动化工具来生成测试输入(一般来说,是指某种特定类型的随机生成输入数据),并观察程序接受该输入时属性是否保持不变。如果某个输入违反了某一条属性,则用户证明程序存在一处错误,并找到一个能够演示该错误的便捷示例。

使用Hypothesis进行基于属性的测试

让我们举一个简单的例子。假设您有两个函数crement()decrement()。一个示例实现可能如下所示:

# increment_decrement.py

def increment(number: int) -> int:
    return number + 1


def decrement(number: int) -> int:
    return number - 1

您可能会为两者编写单元测试代码,如下所示:

# test_increment_decrement_pytest.py

from increment_decrement import decrement
from increment_decrement import increment

def test_increment():
    x = 5
    expected = 6
    actual = increment(x)
    assert actual == expected


def test_decrement():
    x = 5
    expected = 4
    actual = decrement(x)
    assert actual == expected

注意:测试代码是使用pytest框架编写的。

当然,您可以编写更多的测试脚本来测试具有不同值的两个函数,甚至可以对测试进行参数化。但是,最后您将使用预定义的值来测试这两个功能。

使用基于属性的测试库(例如Hypothesis )编写测试是不同的。在这里,您可以指定要测试的类型以及软件的工作方式或行为方式。然后该库根据指定的类型生成随机值来进行实际测试功能。

让我们看看如何使用Hypothesis来测试我们的两个功能。

# test_increment_decrement_hypothesis.py

from hypothesis import given
import hypothesis.strategies as st

from increment_decrement import decrement
from increment_decrement import increment


@given(st.integers())
def test_increment(x):
    expected = x + 1
    actual = increment(x)
    assert actual == expected


@given(st.integers())
def test_decrement(x):
    expected = x - 1
    actual = decrement(x)
    assert actual == expected

如您所见,这两个测试脚本都有一个参数xx的值是由Hypothesis使用integers()方法生成的。Hypothesis提供了各种方法。本质上,这些方法对应于内置类型或其他结构,并生成与给定类型匹配的随机数据。

听起来不错,不是吗?但是,如果我们想测试具有特定值的函数以确保它也可以使用该值怎么办?Hypothesis提供了一个@example()装饰器,您可以在其中定义一个值,即使该值不属于随机生成的测试数据集,也可以将该值传递给相应的函数。

让我们举个简单的例子:

# div.py

def div(dividend: int, divisor: int) -> int:
    return dividend // divisor

我们定义了一个函数div(),该函数接受一个除数和一个被除数并返回两者的商。请注意,这两个参数都是整型数据,因此结果也应该是整型数据,我们使用Python的//运算符执行整数除法。

为了测试div()函数,我们创建了一个新的测试文件test_div.py并编写了一个名为test_div()的测试脚本。

# test_div.py

from hypothesis import example
from hypothesis import given
import hypothesis.strategies as st

from div import div


@given(dividend=st.integers(), divisor=st.integers())
def test_div(dividend, divisor):
    if divisor == 0:
        expected = -1
    else:
        expected = dividend // divisor
    actual = div(dividend, divisor)
    assert actual == expected

同样,我们使用Hypothesisintegers()方法生成除数和被除数的值。我们编写的测试脚本可能通过也可能不会通过,具体取决于执行时Hypothesis产生的值。为了确保始终将值0传递给div()函数,我们将@example(1,0)添加到test_div()函数。因此,即使div()不在随机生成的数据集中,也至少会用除数的值0调用一次。

如果我们按原样运行测试脚本,则test_div()将始终失败。因此,让我们修改div()函数来处理这种情况并使测试通过:

# div.py

def div(dividend: int, divisor: int) -> int:
    if divisor == 0:
        return -1
    return dividend // divisor

概要

本文主要讲了什么是基于属性的测试以及为什么有用。此外,您快速浏览了Hypothesis库,该库使您可以编写基于属性的测试并与pytest测试一起执行。

文末福利

明哥整理了 21 张 Python 代码速查表,每一张都是国外的大师总结的,非常实用 ~

d12338f8b848ae8f9afe20366060d31d.png

还有 2 张高清的 PyCharm 快捷键一览图,一张 Windows ,一张 Mac,放在桌面上,需要的时候打开一查,非常方便。。

01dd155ab72a9b16f4f5603545527fd0.png

怎么获取呢?

3c0c4828ed3e2f58cb1e9a9431b1e1b5.png

添加明哥微信,备注 "速查表" 和 "快捷键" 获取

- EOF -

推荐阅读  点击标题可跳转

求你了,别再用 print 调试代码了

GitHub 捍卫开发者!重新上架 7.2 万星开源项目 youtube-dl

使用 Python 打印漂亮的表格,这两项基本功你可会?

别这样直接运行Python命令,否则电脑等于“裸奔”

5 个 Git 工作流,改善你的开发流程

8 个 Jupyter Notebook Tips,隐藏得太深了

用 Python 读取资源文件?这个技巧保你涨姿势

26a929eec0e5fa01be87ada32e463ef9.png

觉得本文对你有帮助?请分享给更多人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 下 CMake 的配置与使用

文章目录安装与配置编译单个源文件编译前的准备开始编译编译多个源文件多个源文件在同一目录下多个源文件在不同目录下math 目录下的 CMakeLists.txt根目录的 CMakeLists.txtoption 选项导入外部库本地导入(find_package)外部导入(FetchConte…

五轴编程_沙井万丰数控数控编程五轴编程那个软件好用

沙井万丰数控数控编程五轴编程那个软件好用设计需要掌握很高很全面的知识和技能,模具做的好,产品质量好,模具结构合理,生产效率高,工厂效益好。正因如此,模具技术工在外打工的工资都非常的高。少则每月几千…

Linux学习:第二章-Linux安装

一虚拟机使用 VMware主要特点: 1、不需要分区或重新开机就能在同一台PC上使用两种以上的操作系统 2、本机系统可以与虚拟机系统网络通信 3、可以设定并且随时修改虚拟机操作系统的硬件环境 二安装方式 图形安装:直接回车 字符安装:linux tex…

keil3如何放大字体_国潮海报不会做?送你国风字体+图案笔刷+PSD素材+包装样机...

有很多朋友都问带鱼,国潮风的海报到底应该怎么做呢?首先你要知道什么是国潮风:国潮风就是现代文化和古代文化的碰撞,是年轻人的态度!那么应该如何构图如何设计呢?如何配色如何搭配字体呢?这些方…

Google 开源项目风格指南学习笔记——C++篇

文章目录前言0. 缩写名词解释1. 头文件1.1. Self-contained 头文件1.2. 头文件保护1.3. 前置声明1.4 内联函数1.5. #include 的路径及顺序2. 作用域2.1. 命名空间2.2. 非成员函数、静态成员函数和全局函数2.3. 局部变量2.4. 静态和全局变量3. 类3.1. 构造函数的职责3.2. 隐式类…

hiveserver2启动不起来_给爱车配个充电宝,70迈汽车应急启动电源,让你远离搭电小广告...

说到汽车应急启动其实我有切身的痛,在哈尔滨零下35的严冬,晚上带着女神吃完饭,高高兴兴地吃完以后一上车,发现电瓶被冻没电了,天知道当时有多尴尬。马上叫了保险公司过来给搭电,结果在饭店从晚上8点一直等到…

Windows 下 VS 配置 OpenGL 环境

文章目录前言获取 GLFW打开 VS前言 感谢B站同学搬运YouTube上的教学视频。 获取 GLFW 从官网上下载GLFW macOS下64位二进制文件 打开 VS 新建解决方案 OpenGL test,并在解决方案中新建文件夹 Dependencies: 从下载好的 glfw 文件夹中找到最新版链接…

ubuntu 网卡双网口 配置_无线网卡m2 ngff keya keye、minipcie接口改转多口有线网卡实现软路...

小型主板及笔记本中的无线网卡m2ngffkeyakeye接口(CNVI除外)通过m2ngffkeyae转接pcie1x转接板,或者无线网卡的minipcie接口,通过minipcie转接pcie1x转接板可以改装有线网卡板卡,来实现软路由功能。m2ngffkeyae转接pcie…

OpenGL | 通过绘制一个三角形来入门 OpenGL 图形渲染管线

文章目录前言什么是 OpenGl ?回顾openGL 的 Object显存结构工作阶段通过顶点缓冲对象将顶点数据初始化至缓冲中标准化设备坐标顶点缓冲对象 VBOglGenBuffersglBindBufferglBufferData建立了一个顶点和一个片段着色器着色器是什么?为什么需要使用着色器&a…

javascript特效_如何在网页添加鼠标点击特效

经常有同学问我怎么做到的,本论坛属于DZ当然用的是插件啦。偶然在网上找到一个关于wordpress的特效代码,分享给大家。WordPress 添加鼠标点击特效实际上这种教程在网上搜索一下有一大堆,已经是各大博主玩烂的东西了。不过既然给自己的博客加上…

android nio debug模式正常 release包crash_Flutter包大小治理上的探索与实践

Flutter作为一种全新的响应式、跨平台、高性能的移动开发框架,在性能、稳定性和多端体验一致上都有着较好的表现,自开源以来,已经受到越来越多开发者的喜爱。但是,Flutter的引入往往带来包体积的增大,给很多研发团队带…

sam格式的结构和意义_各种格式的练字本,对写字真有帮助吗

图片来源于笔势通各种格式的练字本现在越来越多,目的主要是便于学生把握好笔画的位置和布局,从而把整个字的结构处理好,常见的有米字格,回宫格等。这些练字本对于初学者来说肯定是有帮助的,特别是低年级学生。当然随着…

硬件结构图_那曲地表水电子除垢仪结构图

那曲地表水电子除垢仪结构图水处理设备也应断电停止使用,系统长期停止运行或季节性停止运行,在系统停止运行前,在水中投加适量缓蚀剂,并采取满水湿保护的措施,以减小腐蚀,保护系统。开启进水阀检查无误后电…

双屏怎么快速切换鼠标_在笔记本上实现双屏设计,怎么做到的?

如果给你的笔记本电脑安装两个屏幕,你会用来干什么?是上班时间主屏幕放着PPT,副屏幕偷摸玩游戏;还是主屏幕玩游戏,副屏幕刷刷B站视频;亦或是主屏幕P着图,副屏幕在网上找找能用的素材&#xff1f…

信元模式mpls 避免环路_【基础】交换机堆叠模式

堆叠是指将一台以上的交换机组合起来共同工作,以便在有限的空间内提供尽可能多的端口。多台交换机经过堆叠形成一个堆叠单元。可堆叠的交换机性能指标中有一个"最大可堆叠数"的参数,它是指一个堆叠单元中所能堆叠的最大交换机数,代…

为什么叫日上_古雷150万吨乙烯,为啥叫芒果项目?

古雷150万吨乙烯,为啥叫芒果项目?福建石油化工集团有限责任公司9月1日在福州举行的一场新闻通气会上透露,石化基地引进世界化工巨头——沙特基础工业公司(简称SABIC),合资合作共建中沙古雷乙烯项目。中沙古雷乙烯项目将在福建古雷…

Linux学习:第四章-vi编辑器

一vi编辑器简介vim全屏幕纯文本编辑器别名alias命令‘命令别名’ aliasvi’vim’ alias lsls --colorttyls正常显示颜色 alias lsls --colornever 环境变量配置文件/root/.bashrc 二vim使用 1vi模式 vi文件名 命令模式 输入模式 末行模式 命令----》输入a:追加i&…

gradient设置上下渐变_PaintCode Mac使用教程:如何使用渐变色

Mac平台上一款强大的iOS矢量绘图编程软件PaintCode Mac,无论您是程序员还是设计师,paintcode3能够让你像在PS中画图一样绘制各种UI图形,而且paintcode3会自动帮你生成针对MacOS X或iOS平台Objective-C或C#代码,能够节约大量的编程…

opencv计算图像亮度调节_OpenCV教程创建Trackbar图像对比度、亮度值调整

这篇文章中我们一起学习了如何在OpenCV中用createTrackbar函数创建和使用轨迹条,以及图像对比度、亮度值的动态调整。文章首先详细讲解了OpenCV2.0中的新版创建轨迹条的函数createTrackbar,并给上一个详细注释的示例。然后讲解图像的对比度、亮度值调整的…

find linux 目录深度_浪里淘沙,详解Linux系统中Find命令的实用技巧

知了小巷:浪里淘沙,详解Linux系统中Find命令的实用技巧。啊哈,找到了!当我们需要在Linux系统上定位某个文件或目录时,find命令通常是必备之选。它使用起来非常简单,但有许多不同的可选项,允许我…