Android单元测试

单元测试是编码工作的一部分,是开发中非常重要的一个环节。现在有一种TDD的开发模式很流行,TDD(Testing Driven Development),以测试驱动开发,这足以说明单元测试对于开发的重要性,尤其对于互联网产品开发显得格外重要,因为互联网产品有一个特点是快速多迭代,正是这个特点,单元测试的价值就更加明显。
一、什么是单元测试?
单元测试(Unit Testing),简称UT,是指对软件中的最小可测试单元进行检查和验证,最小可测试单元通常是指类或者函数。与单元测试相对应的活动是集成测试,集成测试是黑盒测试,主要是测试人员对于业务上的测试。单元测试是代码层面上的测试,是对某个类或某一个方法的测试。
单元测试的目的不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性。也就是说在我们进行版本迭代时,跑一遍单元测试就可以知道哪些模块被破坏了,哪些重构的类不正确,非常方便。
单元测试应由程序员自己完成,它是编码工作的一部分。编写业务代码的程序员自己编写对应的单元测试,不应交给其他程序员或者测试人员代为编写测试代码。
二、为什么要做单元测试?
我们开发人员对单元测试存在几个误区:
这里写图片描述
1、项目没有要求,所以不编写。
写单元测试应该是开发人员的一种习惯,当我们编写了一个类或者方法后,就应该马上编写它对应的测试方法。如果没有测试方法来验证,我们编写的代码是没有质量保证的,也谈不上高质量模块了。
2、单元测试价值不高,完全是浪费时间。
单元测试最直接的体现是减少bug,如果没有单元测试,那么将会有大量的bug进入集成测试,测试人员的测试效率会极低,这些隐藏的bug会花费测试人员大量的时间去寻找规律捕捉,然后交给开发人员,开发人员再需要花很多时间在定位bug上,等到解决了bug后测试人员又需要反复测试bug是否解决以及是否对周边模块产生影响,这样反反复复,浪费了开发人员和测试人员大量的时间。
3、业务逻辑简单,不值得写单元测试。
业务逻辑简单与否是相对而言的,如果你对某一块的业务非常熟悉,你可能会觉得业务逻辑简单,若换一个开发人员来跟进这块业务,可就不会这么认为了。而且更重要的一点是,单元测试相当于一个指导文档,当其他人来了解你的这块业务时,可能不需要走读你的业务代码,只需要看单元测试就知道做了哪些事情。
4、为了完成编码任务,没有时间写单元测试。
如果我们在预估一项任务时,没有把写单元测试的时间考虑在内的话,最后就会出现没有时间写单元测试。所以,预估一项任务所需要的时间不止要计算写业务代码的时间,而且要把写单元测试的时间计算在内。
所以,编写单元测试的优点是什么呢?
这里写图片描述
1、最细粒度的测试,可以测试到某一个类的一个方法,测试人员是没有办法测试一个方法的,所以它是软件质量最有效的保障。
2、一个bug存在的时间越长,越难得到解决,解决它所付出的代价越大。根据成本统计,一个bug在最后时期解决它是最早时期解决的成本的10倍。单元测试就是让我们在最早期发现和解决bug,单元测试发现的bug不需要我们定位就知道它发生在什么地方。
3、写单元测试需要我们隔离依赖,剥离外界环境对他的影响,如果我们发现很难写单元测试或者没有办法写单元测试,我们是时候考虑优化目标代码了。
4、代码重构是一件非常困难的事情,经常会发生重构完成后,软件四处崩溃。如果有了单元测试,重构一个方法,写对应的测试方法,保证每个重构的方法都是正确的,整个重构完成也是我们期望的结果。
三、单元测试有哪些特点?
这里写图片描述
1、自动化。只需要点击运行按钮或执行一条命令就可以自动执行并完成结果分析,整个过程不需要人为参与,也就是说我们不能引入一个需要手动操作的测试用例而打破它的自动化特性。
2、彻底性。
对被测试的类或方法要测试得全面彻底,把所有可能出现的情况都一一写成测试方法。
3、可重复性。
一次编写,多次运行,并且在不修改代码的前提下每次运行的结果都是一样的。有一些测试用例我们需要排除外界环境的影响达到可重复性。
4、独立性。
所有的测试用例都应该是独立的,它不受外界条件的影响,也不依赖于其他的测试用例,并且一个测试用例只测试一个方面的内容,不要把很多测试场景放在一个测试用例里面,造成测试用例出现大量逻辑。
5、专业性。
测试用例的代码风格要和业务代码风格保持一致,保持良好的封装,拒绝冗余的测试代码。
四、如何写单元测试?
这里写图片描述
编写单元测试的基本原则是越重要、越复杂的代码要编写越完全越透彻的测试代码,尽量保证所有的代码被执行到,所有的场景被测试到。
1、接口功能测试。保证接口功能的正确性,需要测试所有的输入参数,输出结果及无效的参数。
2、局部数据结构测试。保证接口中数据结构的正确性,这种测试方法用的比较少。
3、边界条件测试。主要测试在边界条件下或者临近边界条件、超出边界条件时结果是否正确,有变量为Null或empty,主要边界为最大值、最小值;溢出边界为最小值-1、最大值+1、临近边界为最小值+1、最大值-1。数组或集合边界,升序降序调整等。
4、所有独立执行通路测试。保证每一条语句都被执行到,不漏测。
5、所有错误处理通路测试。保证每一个异常都经过了测试。
五、Android单元测试框架Robolectric简介。
目前Android的测试框架有很多,Robolectric有以下几个特点:
1、集成简单。配置gradle即可。

testCompile 'junit:junit:4.12'
testCompile ’org.robolectric:robolectric:3.0

2、在JVM上运行。目前大部分测试框架都需要在真机或者模拟器环境上运行的,因为jvm上的android.jar里面只有方法的定义,没有具体实现,所以可以编译通过,运行时会抛出RuntimeException异常。Robolectric自己实现了一套框架可以在jvm上运行,来替代android的组件。
3、自动化。很容易集成到jenkins上,在jenkins上增加脚本./gradle test
使用Robolectric测试android四大组件:
这里写图片描述

下图是测试Dialog及获取Resource
这里写图片描述

下图是Service的业务代码及测试代码
这里写图片描述

下图测试BroadcastReceiver
这里写图片描述

下图测试ContentProvider
这里写图片描述

最后模拟网络请求,使用okhttp网络请求库可以自定义一个拦截器,在拦截器里返回一个本地的json文件。
这里写图片描述

最后,其实把单元测试落实到项目中并没有那么难!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值