UnitTest测试框架详解

从软件架构的⻆度来说,测试最重要的步骤是在软件开发的时候界入比较好,所以在早期测试的界入,从软件经济学的⻆度上来说,发现的问题解决成本低,投入的资源比较少。因此,对一个测试的系统,开始最佳的测试就是源代码级别的测试,也就是单元测试阶段,这个过程也被成为白盒测试。单元测试是最基本也是最底层的测试类型,单元测试应用于最基本的软件代码,如类,函数。方法等,单元测试通过可执行的断言检查被测单元的输出是否满足预期结果。在测试金字塔的理论上来说,越往下的测试投入资源越高,得到的回报率越大,⻅测试金字塔模型:

抛开软件架构的层面,在自动化测试的体系中,单元测试框架以及单元测试的知识体系是必须要掌握的技能之一, 单元测试的知识体系是自动化测试工程师以及测试开发工程师的知识体系之一,而且是必须具备的知识之一。在 Python语言中应用最广泛的单元测试框架是unittest和pytest,unittest属于标准库,只要安装了Python解释器后就 可以直接导入使用了,pytest是第三方的库,需要单独的安装。

白盒测试原理

在软件架构的层面来说,测试最核心的步骤就是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们可以称为白盒测试。

自动化测试用例

不管基于什么的测试框架,自动化测试用例的编写都需要遵守如下的规则,具体总结如下:

UnitTest组件

unittest是属于Python语言的单元测试框架,它的核心组件具体可以总结为如下:

测试类继承unittest模块中的TestCase类后,依据继承的这个类来设置一个新的测试用例类和测试方法,案例代码:

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

测试固件

所谓测试固件,可以理解为执行一个或者是多个测试用例工作所需要的初始化设置和清理操作,具体案例代码如下:

测试套件

测试套件顾名思义就是测试用例的集合,在unittest测试框架中主要是通过TestSuite类提供了对测试套件的支持,具体案例代码如下:

测试固件每次都执行

在unittest测试框架中,测试固件分为两类,一类是在一个测试类里面,不管有多少个测试用例,每次执行测试用例测试固件都会被执行,具体案例代码如下:

编写测试用例注意事项

1、在一个测试类里面,每一个测试方法都是以test开头的,test不能是中间或者尾部,必须是开头,建议test_ 2、每一个测试用例方法都应该有注释信息,这样在测试报告就会显示具体的测试点的检查点 3、在自动化测试中,每个测试用例都必须得有断言,无断言的自动化测试用例是无效的 4、最好一个测试用例方法对应一个业务测试点,不要多个业务检查点写一个测试用例 5、如果涉及到业务逻辑的处理,最好把业务逻辑的处理方法放在断言前面,这样做的目的是不要因为业务逻辑执行错误导致断言也是失败 6、测试用例名称最好规范,有约束

UnitTest的测试框架中提供了很丰富的测试套件,所谓测试套件其实我们可以把它理解为测试用例的集合,或者可以说理解为一个容器,在这个容器里面可以存放很多的测试用例。下面详细的说明下各个不同测试套件的应用和案例实战。

按测试类执行

按测试类执行,可以理解为在测试套件中,我们按测试类的方式来进行执行,那么也就不需要在乎一个测试类里面有多少测试用例,我们是以测试类为单位来进行执行,测试类里面有多少的测试用例,我们都会进行执行,下面详细的演示这部分的具体应用,具体案例代码如下:

按测试模块来执行

思维按测试模块来执行,就是以模块为单位来进行执行,那么其实在一个模块里面可以编写很多的类,下面通过详细的代码演示下这部分,具体案例代码如下:

 

自定义测试套件

针对测试套件的方式是很多的,那么我们是否可以把加载所有测试用例的方式单独分离出来了,当然其实是可以的,这样我们只需要关注更多的测试用例的执行,下面具体演示下测试套件的分离部分,案例代码如下:

 

分离测试套件

在一个完整的自动化测试用例中,比如在UI的自动化测试用例中,我们的测试用例是按照业务模块来进行划分的,那么以为着我们需要编写很多的模块,但是就存在重复的代码,比如我们针对百度产品的测试,不管是测试什么模块,测试固件这部分的代码每个测试模块都是一样的,这样就导致很多的重复的代码,重复必然就带来测试效率的低下的问题,举一个很简单的问题,比如需要修改测试的地址,就需要修改很多的测试模块,但是如果把测试套件分离出来,我们这需要修改一个地方就可以了,这样我们的测试效率就提升了一点,毕竟效率的提升是需要做很多的,不可能一点就进行大幅度的提升的。分离测试套件的思想其实很简单的,就是使用了继承的思想来解决这个问题,我们把测试固件分离到init.py里面,代码具体如下:

这样其他测试模块就需要引人这个模块中的Init类就可以了,然后再继承这个类,具体的代码如下:

 

其实过程我们使用了很简单的思维,但是解决了一个很核心的问题。

UnitTest之参数化

在unittest的测试框架中,可以结合ddt的模块来达到参数化的应用,当然关于ddt库的应用在数据驱动方面有很详 细的解释,这里就直接说另外的一个第三方的库parameterized,安装的命令为:

pip3 install parameterized

安装成功后,这里就以一个两个数相加的案例来演示它的应用,实现的源码如下:

 

在UI自动化测试中,parameterized也是特别的有用,如针对一个登录案例的测试,针对登录就会有很多的测试案 例的,主要是用户名和密码的input表单的验证以及错误信息的验证,下面就结合具体的案例来看它在UI自动化测 试中的应用,案例源码为:

 

测试报告

下面详细的说明下测试报告的生成以及加载所有测试模块的过程,我们在tests的模块下编写了很多的测试用例,但是实际的生产环境中总不能按测试模块来执行,我们都是加载所有的测试模块来执行并且最终生成基于HTML的测试报告,测试报告会使用到第三方的库HTMLTestRunner,下载的地址为:https://github.com/tungwaiyip/HTMLTestRunner,当然针对Python3需要修改下源码部分。把该模块需要放在 /Library/Frameworks/Python.framework/Versions/3.7/lib的目录下。

下面我们编写具体的函数来加载所有的测试模块,路径处理部分我们使用os的模块来进行处理,针对路径处理这部分特别的再说下,不能使用硬编码,使用硬编码只会带来维护的成本性,而且也涉及到不同的操作系统针对路径是有不同的,比如MAC和Linux下是没有C盘的,但是Windows操作系统是有的,这部分需要特别的注意下,下面的函数主要体现的是加载所有测试模块的代码,以及生成测试报告的过程,具体源码如下:

 执行如上的代码后,会在report的文件夹下生成基于HTML的测试报告。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

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

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

相关文章

Linux C 编程入门 (GCC 和 Makefile的使用和编写)

Linux C 编程入门 在 Windows 下我们可以使用各种各样的 IDE 进行编程,比如强大的 Visual Studio。Ubuntu 下也有一些可以进行编程的工具,但是大多都只是编辑器,也就是只能进行代码编辑,如果要编译的话就需要用到 GCC 编译器&…

C语言判断水仙花数(ZZULIOJ1027:判断水仙花数)

题目描述 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如153135333。 现在要求输入一个三位数&#…

【华为HCIP | 华为数通工程师】IPV4与IPV6 高频题(2)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

代码分析之今日头条

加密的过程应该由两部分组成

代码安全之代码混淆及加固(Android)

​ 目录 代码安全之代码混淆及加固(Android)🔒 摘要 引言 正文 代码混淆 代码加固 总结 参考资料 摘要 本文将介绍如何通过代码混淆和加固来保护Android应用的代码安全性。代码混淆是将代码进行加密,使其难以被反编译获得…

css实现鼠标悬停时元素的显示与隐藏

css实现鼠标悬停时元素的显示与隐藏 跟着B站黑马学习小兔鲜项目,有个点记录一下 就是当鼠标悬浮在商品列表上时,列表中的商品会显示出来,离开时,商品隐藏,如下: 感觉这个功能经常会遇到,但一直…

身份认证系统迁移至浪潮信息KOS5.8过程记录

身份认证系统迁移至浪潮信息KOS5.8过程记录 目录 身份认证系统迁移至浪潮信息KOS5.8过程记录项目背景简介环境介绍 实施01.迁移前准备02.迁移登录浪潮信息KeyarchOS迁移平台 03.操作总结本次操作过程使用X2Keyarch时发现的技术亮点: 项目背景 CentOS 停更危机 2020 …

Unity--互动组件(Toggle Group)||Unity--互动组件(Slider)

Toggle Group 属于同一组的切换开关受到限制,因此一次只能打开其中一个开关,按下其中一个开关时,其他的开关将会自动关闭; Allow Switch Off:(允许关闭) 如果禁用此设置,则按下当前…

【C++】类型转换 | IO流 | 空间配置器

C语言类型转换 C语言总共有两种形式的类型转换:隐式类型转换 和 显示类型转换。 C语言的转换格式虽然很简单,但也存在不少缺陷: 隐式类型转换有些情况下可能会引发意料之外的结果,比如数据精度丢失。显示类型转换的可视性比较差…

为什么软件可以被破解,但是压缩包却破解不了?

为什么软件可以被破解,但是压缩包却破解不了? 软件的加密和压缩包的加密不是同一种加密。 压缩包的加密是传统意义上数据的加密,就是用一个密钥(密码),对原始数据进行一些数学运算,得到一个密文…

手机维修店服务预约小程序的效果怎样

手机维修店在每个城市的商业街或商场里都很常见,目前人手一个或多个手机,虽然手机质量有了提升,但各种毛病依然无法避免,因此手机维修店虽然不是人挤人,但整体生意还可以,各种服务也愈加完善。 而市场接受…

UE5 - UI Material Lab 学习笔记

1、学习资料收集 UI Material Lab : https://www.unrealengine.com/marketplace/zh-CN/product/ui-material-lab 视频1:https://www.bilibili.com/video/BV1Hm4y1t7Kn/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 视…