单元测试 UnitTest 简介

单元测试

单元测试就是一个软件中最小单元的测试,通常都是一个类或者方法。

①软件的质量不是功能完整以及功能实现没有问题,而是实现功能的逻辑代码是否正确、是否健壮
②从测试环节的越晚发现问题,解决问题的成本就越高这个角度出发,如果问题能在单元测试阶段发现,这样可以极大的减少开发测试成本,提高开发测试效率

单元测试在测试过程中是比较重要的一环,但是也是很多团队缺失的一环,单元测试的意义是什么?单元测试的实施过程中会有怎样的坑?为什么一些团队没有单元测试呢?是由测试来做单元测试还是开发来做单元测试呢?

单元测试的定义及意义

首先是最经典的测试金字塔,其实针对测试金字塔有很多种搭建方式,
例如:
从常用的测试技术类型来看: 单元测试->接口测试->UI测试,这可能是比较常见的测试金字塔( unit->api->ui )
系统分层测试或测试阶段来看: 单元测试->组件测试->集成测试->系统测试

这只是从测试金字塔角度去谈测试的方法,也可以说是测试的分类,当然如果是严格意义上的测试分类又有很多(例如以是否测试代码:黑盒,白盒,灰盒;是否运行:静态测试,动态测试等等)
单元测试是对软件中的最小单元进行测试和验证,通俗来讲就是代码中的一个函数或一个类,单元测试一定是白盒测试。
为什么提到测试金字塔,因为单元测试不仅是测试阶段的第一环,也是测试金字塔的基础,那代表着什么?

  • 从重要程度来说,单元测试作为地基,承担着保证稳定性的作用,最终决定整个软件质量的不是功能完整,功能实现没有问题,而是实现功能的代码逻辑是否正确,程序是否健壮
  • 从开发测试成本来说,我们知道在开发测试整个环节,越晚发现问题,解决问题的成本越高;越晚发现问题,代表着测试开发流程要不断重复,且重复的成本越高,也就是说如果能将大部分的问题或者明显的代码逻辑问题解决在单元测试阶段,将极大的减少开发测试成本,提高开发测试效率
  • 从测试覆盖来说,测试金字塔越往上执行的测试,可覆盖case会逐渐变小,例如UI测试只能保证页面正常,接口异常不会测试覆盖完整;而接口覆盖完整了,又不能保证代码中所有逻辑都覆盖,某些函数某些类的功能无法覆盖,而通常发现一些复杂的bug,不太好复现的bug基本都是用功能测试用例覆盖不全的
  • 从自动化测试角度来说,都知道UI自动化测试的性价比是最低的,目前接口自动化测试慢慢成为主流,而一些公司也开始注重单元测试或者关注白盒测试,招聘的测试都需要懂开发,需要可以review代码,可以看到测试正在慢慢的下沉渗透

单元测试通常由开发工程师完成,一般会伴随开发代码一起递交至代码库。

单元测试属于最严格的软件测试手段,是最接近代码底层实现的验证手段,可以在软件开发的早期以最小的成本保证局部代码的质量。另外,单元测试都是以自动化的方式执行,所以在大量回归测试的场景下更能带来高收益。
同时,你还会发现,单元测试的实施过程还可以帮助开发工程师改善代码的设计与实现,并能在单元测试代码里提供函数的使用示例,因为单元测试的具体表现形式就是对函数以各种不同输入参数组合进行调用,这些调用方法构成了函数的使用说明。

如何做单元测试

要做好单元测试,首先要知道测试的对象是代码,代码的基本特征和逻辑,这样才能应用的相关的单元测试技术来进行单元测试case设计和进行测试。
要测试什么
单元测试是代码级别的测试,那么到底怎么测试代码。
开发语言是多种多样的,客户端的Java,OC,swift,js等,服务端的Java,PHP,Python,Go等。
先不提单元测试,代码级别的测试还有代码扫描,代码覆盖率的测试,可以找到一些定义好规则的代码漏洞或者代码规范方面的问题,那单元测试肯定做的就是除了这些之外的一些工作了。
单元测试是对代码中的一个函数一个类的测试,

那测试的是什么?

一个函数或者一个类包含什么,函数名(类名)、参数(属性/变量)、函数体(类中的各种方法)、返回结果,在函数的实现的中有各种循环、分支判断、函数调用,我们如果不管代码处理的是什么样的业务逻辑,仅看代码它就是在进行各种数据的处理,这也是为什么有的程序员会厌烦写业务,因为底层就是各种数据的增删改查,当然这其中根据业务还会有各种复杂的判断处理,并且也并不是所有的代码都是在做增删改查。
代码中的循环、每个分支判断、每个函数的输入输出都有可能产生缺陷,而单元测试的话就是测试这些函数、类的功能输入输出、内部条件的判断
我们来看个例子(以开源项目httprunner为例,作者写了大量的单元测试)

在httprunner中loader类实现的功能是将yaml格式文件或者json格式文件亦或者存有两种格式文件的文件夹的接口测试case加载实现为程序中的case model,拿类中其中一个功能函数为例;

mockito——让你轻松地进行单元测试的强大工具

【摘要】 相信每一个程序猿在写Unit Test的时候都会碰到一些令人头疼的问题:如何测试一个rest接口;如何测试一个包含客户端调用服务端的复杂方法;如何测试一个包含从数据库读取数据的复杂方法。。。这些问题mockito都可以帮我们轻松地解决。
Mockito是啥?Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外…

Mockito是啥?

Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试。简单来说,创建mock对象之后,这个对象里面的方法是怎么实现的可以不用去关心,我们只需要给这个方法定义一个输入、输出即可。

什么情况下使用Mockito:

假设现在要测试method A, method A里面又依赖Method B、Method C、Method D,而依赖的这3个method又不好去构建(如ObsClient需要真实AK SK,HttpClient需要构建客户端与服务器,Database相对好构建,但是假设Method C只是从table1、table2联合查询,你还得分别往table1、table2 insert数据,很繁琐),这时候可以考虑Mockito进行优雅测试,当然如果你想去构建真实的测试场景,未免有点舍本逐末了~~~

Mockito的使用:

1、引进依赖

Maven依赖如下:

org.mockito mockito-core 1.10.19 test

代码中:import org.mockito.Mockito

2、创建Mock对象

这里需要注意的是scala中只能对伴生对象或者Class创建mock对象,不能直接对Object创建mock对象。Scala中使用Mockito.mock(classOf[…])来创建mock对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值