我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python怎么使用Hypothesis来自动化单元测试

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python怎么使用Hypothesis来自动化单元测试

这篇文章主要介绍了python怎么使用Hypothesis来自动化单元测试,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Hypothesis 是一个 Python 库,用于让单元测试编写起来更简单,运行时功能更强大,可以在代码中查找您不会想到的极端情况。它稳定,强大且易于添加到任何现有测试框架中。它的工作原理是让您编写断言每种情况都应该正确的测试,而不仅仅是您偶然想到的那些。

Hypothesis 的基础知识

典型的单元测试需要自己写一些测试用例,然后编写测试函数,通过一段代码运行它,然后根据预期结果检查结果。

Hypothesis 有所不同。它是基于属性进行单元测试。它通过生成与您的规范匹配的任意数据并检查在这种情况下程序是否仍然有效。如果找到了一个失败的用例,它将采用该示例并将其测试用例范围缩减缩减为一定尺寸,然后对其进行简化,直到找到一个仍会导致问题的小得多的示例。然后将其保存,后续单元测试时仍会使用这些用例。

现在就让我们看看怎么用吧。

Hypothesis 快速入门

1、安装

可以通过 pip 安装,也可以通过源代码安装[2],也可以安装一些扩展[3],如下:

pip install hypothesispip install hypothesis[pandas,django]

2、使用

先写一段代码,保存在 mycode.py 中,功能是对字符串进行特定的编码和解码,内容如下:

def encode(input_string): count = 1 prev = "" lst = [] for character in input_string:  if character != prev:   if prev:    entry = (prev, count)    lst.append(entry)   count = 1   prev = character  else:   count += 1 entry = (character, count) lst.append(entry) return lstdef decode(lst): q = "" for character, count in lst:  q += character * count return q

对这段代码进行单元测试,往往需要写很多测试用例,现在我们使用 hypothesis 来自动为我们测试,编写 test_mycode.py (文件名随意),内容如下:

from hypothesis import givenfrom mycode import decode,encodefrom hypothesis.strategies import textimport unittestclass TestEncoding(unittest.TestCase): @given(text()) def test_decode_inverts_encode(self, s):  self.assertEqual(decode(encode(s)), s)if __name__ == "__main__": unittest.main()

可以看出,这里并没有出现具体的测试用例,而是使用来 text 的策略,相当于 hypothesis 自动穷举来可能的情况,也可以看出它很容易可其他测试框架集成,这里是 unittest。现在来运行一下看看效果:

(py38env) ➜ tmp python test_mycode.pyFalsifying example: test_decode_inverts_encode( self=<__main__.TestEncoding testMethod=test_decode_inverts_encode>, s='',)E======================================================================ERROR: test_decode_inverts_encode (__main__.TestEncoding)----------------------------------------------------------------------Traceback (most recent call last): File "test_mycode.py", line 9, in test_decode_inverts_encode def test_decode_inverts_encode(self, s): File "/Users/aaron/py38env/lib/python3.8/site-packages/hypothesis/core.py", line 1162, in wrapped_test raise the_error_hypothesis_found File "test_mycode.py", line 10, in test_decode_inverts_encode self.assertEqual(decode(encode(s)), s) File "/Users/aaron/tmp/mycode.py", line 14, in encode entry = (character, count)UnboundLocalError: local variable 'character' referenced before assignment----------------------------------------------------------------------Ran 1 test in 0.048sFAILED (errors=1)

这里测试出当字符串为 '' 的时候会抛出 UnboundLocalError 的异常。现在我们来修复这个 bug,然后把所有的测试用例 s 给打印出来,看看它用了哪些测试用例。

encode 函数加入以下代码:

if not input_string: return []

test_mycode.py 文件打印出测试用例:

@given(text())def test_decode_inverts_encode(self, s): print(f"{s=}") self.assertEqual(decode(encode(s)), s)

再次执行:

(py38env) ➜ tmp python test_mycode.pys=''s='1's='0's='0's='0's='Ā's='\U000cf5e5's='0's=''s='0's='0's='E's=")dù'\x18\U0003deb3¤jd"s='\U0005bc37\x07\U000537a1&Yacute;&Agrave;&atilde;i&Icirc;\U000ce9e5\x0b's='\U0005bc37\U0005bc37\U000537a1&Yacute;&Agrave;&atilde;i&Icirc;\U000ce9e5\x0b's='\U0005bc37\U000537a1\U000537a1&Yacute;&Agrave;&atilde;i&Icirc;\U000ce9e5\x0b's='&Agrave;\U000537a1\U000537a1&Yacute;&Agrave;&atilde;i&Icirc;\U000ce9e5\x0b's='\U000965e1\x12\x85&\U000f500a&Auml;&Atilde;c's='\n\U0004466c\x86&Icirc;\x07's='&Ecirc;\U00063f1e\x01G\x88's='&Uacute;V\n's='VV\n's='\U0008debf湆è's='\U0008debf湆è's='\U0008debf湆's='\U0008debf\U0008debf's='\U0008debf\U0008debfó]&frac12;àq\x82#\U00015196\U0001c8beg's='\U0008debfgó]&frac12;àq\x82#\U00015196\U0001c8beg's='?'s='&Icirc;'s='&Icirc;\U00085b9e's="&Icirc;8'?\U00057c38&Ugrave;;\x07\U000a5ea8&Ograve;&raquo;=\U00091d5b~8뺈"s='\U000d6497&Yacute;>'s='\U000e0f01's='\U000e0f01&Aring;0y&cent;KN&reg;'s='\U000e0f01&Aring;0y&cent;KN&reg;'s='\U00050a06's='&Aring;\U000b98b3か\U000ba80aá`&Atilde;-&Ecirc;u\x8c\x90&sup3;F&Ocirc;"'s='\x8e\U0004612a\x83&ccedil;'s='\x8e's='\x8e\x98\U000fb3e0\U0010d2b3\x10\x82\x94&ETH;渥's='&yen;W's='p\U000e5a2aE·`ì's='\U000b80f8\x12\U000c2d54's='.\U000703de's='6\U00010ffa\U000f7994\x8e's='116\U000f7994\x8e's='1?6\U000f7994\x8e's='4?6\U000f7994\x8e's='4\x8e6\U000f7994\x8e's='0's='\U0006a564&acute;&ETH;\x93ü\x9eb&i\x1c&Ntilde;'s='\U000ceb6f's='\U000ceb6f\xa0\x08's='\U000ceb6f\xa0\x08's='\U000ceb6fꄃ\x08's='\U000ceb6fꄃ匀\U0007cc15\U000b2aaa×**'s='\U000ceb6fꄃ匀's='匀ꄃ匀's='J\x14?&ouml;'s='q)'s='q)'s='q\U00060931's='q6's='\U000e3441's='\U000e3441\U00019958&macr;'s='\x13's='\U000f34dbk's='Kp&t&Ucirc;à's='\n&ouml;\x93's='\n\n\x93's='\U00019c8d&Ntilde;&sup3;\U00056cbd\U000e3b2f\U00058d302's='\x90=R\x8b&szlig;\x03's='\x9a's='\U000147e7's='\U000147e7\x85\U0007a3ef's='\U000147e7\U00050a070&Acirc;>'s='\U000a4089\x0eC+R&Aacute;\x02\x97\x9cü&Igrave;&iuml;SS\U0006cbc5;&yuml;~\x16\x019V&Ccedil;\U000a32fdQ÷\x15's='&THORN;&Uacute;&frac34;\x19&copy;Z&reg;'s='ਸ਼&aelig;'s='\U000cd45a's='\U000cd45a\U000e15cb&Ntilde;\x08J\ueb3eú&szlig;\x07I\x91\x9a\x18\x16&Ccedil;\x80\x1a's='\x8f}&ordm;\x0eq\x0b's='\x0e}&ordm;\x0eq\x0b's="\U000e05a3&&para;&ordm;[f&otilde;\x8b&Uuml;R'&Iacute;&frac14;t\x97íW\x05\U000caea9\U0008fd74\U000e8f1c&sup1;?df&AElig;&frac34;\x13"s='\x10\U000e12e2ù\U0006f96er&yacute;\U00014baf\x00\x95\U000dbc92&Eacute;\U00081613&micro;\U0003b865Z\U0008cc3c's='ú\U000b561f\x8f&Icirc;'s='\tà&Ouml;÷'s='à\x92&copy;&Igrave;\U000618fa\x92's='\U000aaf94\x94\x84\U000cda69\U0005291a\U000a63de&thorn;&iquest;O\x8a>\U000b458b&Ecirc;.\U00086f07\x1a's='\U0009754e?U_\xa0\x13PQ\x18&ordm;\x07\U0006c9c5.&Aacute;'s='\U00102456's='&sup3;Wᵎ&Otilde;'s='\x14\x1c's='\x14's='\x14\U00105bcd"\x10&Ocirc;\x99\U000a5032R\U00056c44V&÷>+\U000aaff2&ntilde;&reg;\U000d7570%&ordf;!\U00032553&acute;8x^&laquo;'s='\x00\U000e2ac4&frac14;&Auml;UrB's='\x00\U000e2ac4&frac14;&Auml;UrB's='\x00\U000e2ac4&frac14;&Auml;UrB's='&ordf;\x1aU\x8a&Ccedil;\U000b2fb9\U0005a586'.----------------------------------------------------------------------Ran 1 test in 0.180sOK

从执行结果可以看出,'' 首先被测试,其次 hypothesis 使用了大量的极端测试用例,减轻了手写的负担,大大提升了效率。

虽然 hypothesis 具有自动记忆功能,你仍然可以显式的指定某个测试用例一直被测试,而且这是推荐的做法,比如我想在每次的测试中都测试 '',可以这样写:

from hypothesis import given, examplefrom hypothesis.strategies import text@given(text())@example("")def test_decode_inverts_encode(s): assert decode(encode(s)) == s

这一点非常有用,提升了测试代码的可读性,可以用来告诉开发人员或者未来的自己,输入的字符串必须要考虑 '' 的情形。

此外,执行单元测试,不一定要使用 unittest.main(),也可以这样,是不是很方便:

if __name__ == "__main__": test_decode_inverts_encode()

感谢你能够认真阅读完这篇文章,希望小编分享的“python怎么使用Hypothesis来自动化单元测试”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python怎么使用Hypothesis来自动化单元测试

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python怎么使用Hypothesis来自动化单元测试

这篇文章主要介绍了python怎么使用Hypothesis来自动化单元测试,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Hypothesis 是一个 Python 库,用于让
2023-06-14

C#中如何使用单元测试框架进行自动化测试

C#中如何使用单元测试框架进行自动化测试引言:在软件开发过程中,自动化测试是一个非常重要的环节。通过编写和运行测试代码,可以帮助我们验证和确保代码的正确性和稳定性。在C#开发中,我们可以使用单元测试框架来实现自动化测试。本文将介绍C#中常用
2023-10-22

Java怎么自动生成mock单元测试

在Java中,我们可以使用Mockito等库来自动生成mock单元测试。以下是一个示例:首先,我们需要在项目的构建文件中添加Mockito库的依赖项。例如,在Maven项目中,可以将以下依赖项添加到pom.xml文件中:org.mocki
2023-10-22

怎么用Python+Appium做自动化测试

这篇文章主要讲解了“怎么用Python+Appium做自动化测试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python+Appium做自动化测试”吧!目录一、环境准备二、真机测试一
2023-06-20

python自动化测试中Selenium怎么用

小编给大家分享一下python自动化测试中Selenium怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.安装完成自动化测试,需要配置三个东西。selen
2023-06-29

idea单元测试自动生成怎么实现

实现自动生成单元测试的方法可以分为以下几个步骤:静态代码分析:通过静态代码分析工具(如静态代码分析器、AST解析器等),对待测试的代码进行解析和分析,提取出代码的结构、函数的参数和返回值等信息。自动化测试框架:搭建一个自动化测试框架,用于生
2023-10-22

Python怎么实现自动化测试

本篇文章为大家展示了Python怎么实现自动化测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码
2023-06-14

java自动生成单元测试代码怎么写

在Java中,可以使用各种框架来自动生成单元测试代码,比如JUnit、TestNG等。下面是使用JUnit框架来自动生成单元测试代码的基本步骤:导入JUnit框架:在项目的pom.xml文件中添加JUnit依赖,或者手动下载JUnit的ja
2023-10-22

python中Airtest自动化测试工具怎么用

小编给大家分享一下python中Airtest自动化测试工具怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Airtest的官网介绍项目构成Airtest:是
2023-06-29

怎么使用IOS自动化测试工具UIAutomation

这篇文章给大家分享的是有关怎么使用IOS自动化测试工具UIAutomation的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。xcode中自带的Instuments工具可以用来进行APP的自动化测试, 以及用于进行
2023-06-14

如何使用python selenium实现自动化测试

这篇文章主要介绍如何使用python selenium实现自动化测试,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、安装selenium打开命令控制符输入:pip install -U selenium火狐浏览器安
2023-06-15

如何使用python+appium实现自动化测试

这篇文章主要为大家展示了“如何使用python+appium实现自动化测试”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用python+appium实现自动化测试”这篇文章吧。1.什么是A
2023-06-22

python自动化测试中装饰器@ddt与@data怎么使用

这篇文章主要介绍“python自动化测试中装饰器@ddt与@data怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python自动化测试中装饰器@ddt与@data怎么使用”文章能帮助大家解
2023-07-04

教你怎么用python selenium实现自动化测试

一、安装selenium 打开命令控制符输入:pip install -U selenium 火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能 Selenium IDE 是嵌入到Firefox 浏览器
2022-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录