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

news2024/11/26 16:35:07

说到 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 标准库提供的单元测试框架,使用简单、功能强大,日常测试需求均能得到很好的满足。在不引入第三方库的情况下,是单元测试的不二之选。

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

电商项目实战

web测试项目

web+App+h5+小程序 测试项目

接口自动化测试实战项目

Linux实战项目

面试资料

我们进阶学习自动化测试必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

以上资料,对于想要测试进阶的朋友们来说应该会很有帮助,需要的小伙伴可以后台私信找我免费领取。

总结

我见过很多leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了好几年,更夸张的是7、8年工作内容的重复性比较高,没有什么技术含量的工作。

凡事要趁早,特别是技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

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

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

相关文章

谷歌seo关键词怎么做?Google如何优化关键词

本文主要分享谷歌seo关键词怎么去操盘才能更好的提升排名,我们立刻来学习一下。 本文由光算创作,有可能会被剽窃和修改,我们佛系对待这种行为吧。 谷歌seo关键词如何优化?这里我们提供一个谷歌seo优化的公式 答案是&#xff1a…

Vue基础15之消息订阅与发布、TodoList消息订阅与发布、TodoList编辑功能

Vue基础15消息订阅与发布安装pubsub-js库使用main.jsSchool.vueStudent.vue总结:消息订阅与发布(pubsub)TodoList-消息的订阅与发布将Item的deleteTodo使用消息订阅与发布App.vueMyItem.vueMyList.vueTodoList-编辑App.vueMyItem.vue完善编辑…

【极海APM32替代笔记】HAL库ADC测量精度提高方案(利用内部参考电压VREFINT计算VDDA来提高精度)

【极海APM32替代笔记】HAL库ADC测量精度提高方案(利用内部参考电压VREFINT计算VDDA来提高精度) 多数STM32的MCU 都没有内部基准电压 如L496系列 但在外接VDDA时(一般与VCC 3.3V连接) 有可能VCC不稳定 导致参考电压不确定 从而使A…

【并发编程十八】线程局部存储(TLS)

【并发编程十八】线程局部存储(TLS)一、定义二、线程局部存储的实现1、windows系统2、linux系统3、c11三、windows系统1、线程局部存储是分块的(TLS_MINIMUM_AVAILABLE)2、获得索引3、通过索引:存储数据、取出数据4、释放索引和内…

《计算机网络:自顶向下方法》实验1:协议分析软件的使用

实验1:协议分析软件的使用 实验步骤 启动主机上的web浏览器。 启动Ethereal(或WireShark)。你会看到如图2所示的窗口,只是窗口中没有任何分组列表。 开始分组捕获:选择“capture”下拉菜单中的“Start”命令,会出现如图所示的“Ethereal(或WireShark): Capture Options”…

(02)Cartographer源码无死角解析-(56) 2D后端优化→class MapById、MapById::lower_bound

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

Flink04: Flink核心API之DataSet

DataSet API主要可以分为3块来分析:DataSource、Transformation、Sink。 DataSource是程序的数据源输入。Transformation是具体的操作,它对一个或多个输入数据源进行计算处理,例如map、flatMap、filter等操作。DataSink是程序的输出&#xf…

攻击者查看邮件就被溯源到家?

本文通过分享实际攻防演练中真实案例,防守方在未暴露任何敏感信息的情况下,仅通过邮件往来最终溯源到攻击方相关真实信息。 作为攻击溯源技术的引子,供各位从业和爱好者交流学习。 场景描述 攻击者伪造邮件,称其申请防守方靶标系…

洛谷P5736 【深基7.例2】质数筛 C语言/C++

【深基7.例2】质数筛 题目描述 输入 nnn 个不大于 10510^5105 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 第一行输入一个正整数 nnn,表示整数个数。 第二行输入 nnn 个正整数 aia_iai​&…

基于 esp-idf SDK ,如何在 .cpp 工程中加入.c 的文件调用?

把外部 .c 文件放到 .cpp 工程下的 main 文件夹然后在 .cpp 工程下声明 .c 文件下的 hello_main 函数同时在 cpp 工程的 CmakeLists.txt 文件下加上 .c 文件最后在 .cpp 工程下调用 hello_main 函数即可 可基于 esp-idf/examples/storage/nvs_rw_value_cxx 例程来测试 &#x…

mysql 8.0.32安装 windows server 超详细

官网下载mysql包,官网地址(中文版): http://mysql.p2hp.com/cloud/index.html 我是下载的这个(第一个) 内容解压后是这样的,其实windows版本无需安装,只需要配置后启动即可 同时,建议下载下这个Visual Studio&#xf…

Nebula测试

LDBC benchmark 这是官方文档 https://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf 主要有几点 Scale Factors 是生成数据的一个大小,For both workloads, the SF1 data set is 1 GiB, the SF100 is 100 GiB, and the SF10 000 data set is 10 000 G…

关于CSS的简单知识

CSS是什么首先,在之前的html仅仅是写了一个框架,页面并不工整,美观。而CSS正是解决了这一问题。HTML仅仅只是表示页面的结构和内容,而CSS描述的是页面的样式(包括大小/位置/字体/颜色/背景等)基本语言规范选…

[element plus] 对话框组件再封装使用 - vue

学习关键语句: 饿了么组件dialog组件使用 dialog组件二次封装 vue3中封住的组件使用update触发更新 vue3中封装组件使用v-model:属性值来传值 写在前面 这是我遇到的一个页面需求 , 其中一个对话框的内容是很常用的 , 所以我将它封装出来才写的一篇文章 现在给出如下需求: 封…

Git(分布式版本控制系统)

提到git了,我们先来说一下什么是git? 1、通俗一点,就是一个人工版本控制器 通过人工的复制行为来保存项目的不同阶段的内容,添加适当的一些描述文字加以区分 繁琐、容易出错 产生大量重复数据 2、什么是版本控制? 版本控制是指对…

JVM16命令行

2. JVM 监控及诊断工具-命令行篇 2.1. 概述 简单命令行工具 在我们刚接触 java 学习的时候,大家肯定最先了解的两个命令就是 javac,java,那么除此之外,还有没有其他的命令可以供我们使用呢? 我们进入到安装 jdk 的…

JAVA并发编程面试题合集

1.在Java中守护线程和本地线程的区别? Java中的线程分为两种:守护线程(Daemon)和用户线程(User)任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(boolean);true表…

框架开发有哪些优势?Java主流框架

什么是框架“框架(Framework)"一词最早出现在建筑领域,指的是在建造房屋前期构建的建筑骨架。在编程领域,框架就是应用程序的骨架,开发人员可以在这个骨架上加入自己的东西,搭建出符合自己需求的应用系…

mac电脑数据恢复?真正实用的方法(2023最新)

使用电脑的用户都知道,被删除的文件一般都会经过回收站,想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样,但是“回收站”在mac电脑显示为“废纸篓”。 如果电脑回收站,或者是废纸篓里面的数据被清空了&…

Nginx第一讲

目录 一、Nginx01 1.1 Nginx简介 1.1.1 Nginx介绍 1.1.2 Nginx的应用 1.1.3 关于代理 1.1.4 负载均衡 1.1.5 动静分离 1.2 安装Nginx 1.2.1 安装依赖环境 1.2.2 安装nginx 1.2.3 nginx配置文件(nginx.conf) 1.2.4 反向代理实例1 1.2.5 安装tomcat 1.2.6 反向代理…