Python 自动化测试必会技能板块—unittest框架

说到 Python 的单元测试框架,想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest。

的确,作为 Python 的标准库,它很优秀,并被广泛应用于各个项目。但其实在 Python 众多项目中,主流的单元测试框架远不止这一个。

一、介绍

unittest 单元测试框架最早受到 JUnit 的启发,和其他语言的主流单元测试框架有着相似的风格。它支持测试自动化,多个测试用例共享前置(setUp)和清理(tearDown)代码,聚合多个测试用例到测试集中,并将测试和报告框架独立。

二、用例编写

下面这段简单的示例来自于官方文档,用来测试三种字符串方法:upper、isupper、split:

上述示例中,通过继承 unittest.TestCase 来创建一个测试用例。在这个类中,定义以 test 开头的方法,测试框架将把它作为独立的测试去执行。

每个用例都采用 unittest 内置的断言方法来判断被测对象的行为是否符合预期,比如:

  • 在 test_upper 测试中,使用 assertEqual 检查是否是预期值

  • 在 test_isupper 测试中,使用 assertTrue 或 assertFalse 验证是否符合条件

  • 在 test_split 测试中,使用 assertRaises 验证是否抛出一个特定异常

可能有人会好奇,为什么不使用内置断言语句 assert,而要额外提供这么多断言方法并使用呢?原因是通过使用 unittest 提供的断言方法,测试框架在运行结束后,能够聚合所有的测试结果并产生信息丰富的测试报告。而直接使用 assert 虽然也可以达到验证被测对象是否符合预期的目的,但在用例出错时,报错信息不够丰富。

三、用例发现和执行

unittest 支持用例自动(递归)发现:

默认发现当前目录下所有符合 test*.py 测试用例

使用 python -m unittest 或 python -m unittest discover

通过 -s 参数指定要自动发现的目录, -p 参数指定用例文件的名称模式

    python -m unittest discover -s project_directory -p "test_*.py"

通过位置参数指定自动发现的目录和用例文件的名称模式

    python -m unittest discover project_directory "test_*.py"

unittest 支持执行指定用例:

指定测试模块

    python -m unittest test_module1 test_module2

指定测试类

    python -m unittest test_module.TestClass

指定测试方法

    python -m unittest test_module.TestClass.test_method

指定测试文件路径(仅 Python 3)

    python -m unittest tests/test_something.py

四、测试夹具(Fixtures)

测试夹具也就是测试前置(setUp)和清理(tearDown)方法。测试前置方法 setUp() 用来做一些准备工作,比如建立数据库连接。它会在用例执行前被测试框架自动调用。

测试清理方法 tearDown() 用来做一些清理工作,比如断开数据库连接。它会在用例执行完成(包括失败的情况)后被测试框架自动调用。测试前置和清理方法可以有不同的执行级别。

4.1 生效级别:测试方法

如果我们希望每个测试方法之前前后分别执行测试前置和清理方法,那么需要在测试类中定义好 setUp() 和 tearDown():

4.2 生效级别:测试类

如果我们希望单个测试类中只执行一次前置方法,再执行该测试类中的所有测试,最后执行一次清理方法,那么需要在测试类中定义好 setUpClass() 和 tearDownClass():

4.3 生效级别:测试模块

如果我们希望单个测试模块中只执行一次前置方法,再执行该模块中所有测试类的所有测试,最后执行一次清理方法,那么需要在测试模块中定义好 setUpModule() 和 tearDownModule():

五、跳过测试和预计失败

unittest 支持直接跳过或按条件跳过测试,也支持预计测试失败:

通过 skip 装饰器或 SkipTest 直接跳过测试

通过 skipIf 或 skipUnless 按条件跳过或不跳过测试

通过 expectedFailure 预计测试失败

六、子测试

有时候,你可能想编写这样的测试:在一个测试方法中传入不同的参数来测试同一段逻辑,但它将被视作一个测试,但是如果使用了子测试,就能被视作 N(即为参数的个数)个测试。下面是一个示例:

示例中使用了 with self.subTest(i=i) 的方式定义子测试,这种情况下,即使单个子测试执行失败,也不会影响后续子测试的执行。这样,我们就能看到输出中有三个子测试不通过:

七、测试结果输出

基于简单示例小节中提到的例子,来说明下 unittest 在运行完测试后的结果输出。

默认情况下的输出非常简单,展示运行了多少个用例,以及所花费的时间:

通过指定 -v 参数,可以得到详细输出,除了默认输出的内容,还额外显示了用例名称:

假定 test_upper 测试失败,则在详细输出模式下,结果如下:

如果我们将 test_upper 测试方法中的 self.assertEqual 改为 assert,则测试结果输出中将会少了对排查错误很有帮助的上下文信息:

如果想要生成 HTML 格式的报告,那么就需要额外借助第三方库(如 HtmlTestRunner)来操作。

在安装好第三方库后,你不能直接使用 python -m unittest 加上类似 --html report.html 的方式来生成 HTML 报告,而是需要自行编写少量代码来运行测试用例进而得到 HTML 报告。

详情请查看 HtmlTestRunner 使用说明。

八、小结

unittest 作为 Python 标准库提供的单元测试框架,使用简单、功能强大,日常测试需求均能得到很好的满足。在不引入第三方库的情况下,是单元测试的不二之选。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

西门子PLC1200--与电脑S7通讯

硬件构成 PLC为西门子1211DCDCDC 电脑上位机用PYTHON编写 二者通讯用网线,通讯协议用S7 PLC上的数据 PLC上的数据是2个uint,在DB1,地址偏移分别是0和2 需要注意的是DB块要关闭优化的块访问,否则是没有偏移地址的 PLC中的数据内…

elementui中日期/时间的禁用处理,使用传值的方式

项目中,经常会用到 在一个学年或者一个学期或者某一个时间段需要做的某件事情,则我们需要在创建这个事件的时候,需要设置一定的时间周期,那这个时间周期就需要给一定的限制处理,避免用户的误操作,优化用户体验 如下:需求为,在选择学年后,学期的设置需要在学年中,且结束时间大…

软件架构之计算机组成与体系结构

1.1计算机系统组成 计算机系统是一个硬件和软件的综合体,可以把它看成按功能划分的多级层次结构。 1.1.1 计算机硬件的组成 硬件通常是指一切看得见,摸得到的设备实体。原始的冯•诺依曼(VonNeumann)计算机在结构上是以运算器为…

2024年中国十大杰出起名大师排行榜,最厉害的易经姓名学改名字专家

在2024年揭晓的中国十大杰出易学泰斗评选中,一系列对姓名学与国学易经有深入研究的专家荣登榜单。其中,中国十大权威姓名学专家泰斗顶级杰出代表人物的师傅颜廷利大师以其在国际舞台上的卓越贡献和深邃学识,被公认为姓名学及易经起名领域的权…

verilog读写文件注意事项

想要的16进制数是文本格式提供的文件,想将16进制数提取到变量内, 可以使用 f s c a n f ( f d 1 , " 也可以使用 fscanf(fd1,"%h",rd_byte);实现 也可以使用 fscanf(fd1,"也可以使用readmemh(“./FILE/1.txt”,mem);//fe放在mem[0…

基于Android Studio零食工坊

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 用户 可以浏览商品 , 查询商品 , 加入购物车 , 结算商品 , 查看浏览记录 , 修改密码 , 修改个人信息 , 查询订单 管理员 能够实现商品的…

huggingface笔记:gpt2

0 使用的tips GPT-2是一个具有绝对位置嵌入的模型,因此通常建议在输入的右侧而不是左侧填充GPT-2是通过因果语言建模(CLM)目标进行训练的,因此在预测序列中的下一个标记方面非常强大 利用这一特性,GPT-2可以生成语法连…

Autosar MCAL-S32k324 Crypto配置-RandomNumber生成及使用

文章目录 前言CryptoPrimitivesCryptoPrimitiveAlgorithmFamilyCryptoPrimitiveAlgorithmModeCryptoPrimitiveAlgorithmSecondaryFamilyCryptoPrimitiveServiceCryptoDriverObject代码使用Random Generate执行流程配置job函数使用示例总结前言 之前介绍过AES-CMAC算法的配置,…

Windows 与 Windows Server 2022环境下如何开启远程桌面

文章目录 前言Windows 环境下如何开启远程桌面控制功能Windows Server 环境下如何开启远程桌面 前言 我这边是客户需要搭建一套备份系统,整体的系统流程是这样的:客户的笔记本或者其他PC工具可以自由访问到我司搭建的服务器平台并进行文件传输&#xff…

【C++】开源:地图投影和坐标转换proj库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍地图投影和坐标转换proj库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&a…

5款极其强大的大模型文生图工具!

文生图技术是一种基于深度学习的技术,可以根据自然语言描述生成相应的高品质图像。 下面介绍几个目前市场上比较优秀的工具或网站,并制作一张男性的白袍巫师图来比较。 针对大模型和AIGC技术趋势、AIGC 算法项目落地经验分享、新手如何入门算法岗、该如…

el-scrollbar组件使用踩坑记录

一、el-scrollbar和浏览器原生滚动条一起出现 问题描述 el-scrollbar组件主要用于替换浏览器原生导航条。如下图所示,使用el-scrollbar组件后,发现未能成功替换掉浏览器原生导航条,二者同时出现。 引发原因 el-scrollbar的height属性如果…

前端根据目录生成模块化路由routes

根据约定大于配置的逻辑,如果目录结构约定俗成,前端是可以根据目录结构动态生成路由所需要的 route 结构的,这个过程是要在编译时 进行,生成需要的代码,保证运行时的代码正确即可 主流的打包工具都有对应的方法读取文…

【不容错过】可灵AI重磅更新:画质升级,运镜控制,首尾帧自定义,还有30万创作激励奖金!

还记得最近在各大平台肆虐的老照片变成视频吗,就是用快手的可灵AI做的,今天可灵又迎来了一次重大更新。 「电脑端上线了」 之前一直用其他工具生的图片还需要保存到手机上,再用可灵来生成视频,很多人都能感受到手机操作不太方便&…

elasticsearch源码分析-04集群状态发布

集群状态发布 cluster模块封装了在集群层面执行的任务,如集群健康、集群级元信息管理、分片分配给节点、节点管理等。集群任务执行之后可能会产生新的集群状态,如果产生新的集群状态主节点会将集群状态广播给其他节点。 集群状态封装在clusterState中&…

ionic7 使用Capacitor打包 apk 之后,设置网络权限

报错处理 在打包的时候遇到过几个问题,这里记录下来两个 Visual Studio Code运行ionic build出错显示ionic : 无法加载文件 ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在 ionic7 项目初始化以及打包 apk 这篇文章讲到了如果安装…

2-25 基于matlab的语音信号降噪处理算法

基于matlab的语音信号降噪处理算法,采用谱减法,可以对强噪声背景下的语音信号进行去噪。输入原始信号及加噪信号,对加噪信号进行降噪,并提高信噪比。程序已调通,可直接运行。 2-25 语音信号降噪处理算法 谱减法 - 小红…

餐饮管理系统-计算机毕业设计源码43667

餐饮管理系统 摘 要 在信息化、数字化的时代背景下,餐饮行业面临着前所未有的挑战与机遇。为了提高运营效率、优化顾客体验,餐饮企业亟需一套高效、稳定且灵活的管理系统来支撑其日常运营。基于Spring Boot的餐饮管理系统应运而生,成为餐饮行…

mac 安装nvm的教程

在macOS上切换Node.js版本,可以使用nvm(Node Version Manager)。以下是安装nvm和切换Node.js版本的步骤: 安装nvm 下载方式 终端复制输入: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.…

GIT - 一条命令把项目更新到远程仓库

前言 阅读本文大概需要1分钟 说明 更新项目到远程仓库只需要执行一条命令,相当的简便 步骤 第一步 编辑配置文件 vim ~/.bash_profile第二步 写入配置文件 gsh() {local msg"${1:-ADD COMMIT PUSH}"git add . && git commit -m "$m…