前言

对于Android的单元测试一直有些弄不明白,虽然要进行单元测试并不复杂,但是其中的关系好像有点复杂,包括怎样在Eclipse进行单元测试,又怎样在Android Studio进行单元测试,怎样进行Local的测试而不需要运行真机或虚拟机,各种TestCase有什么不同,为什么Junit4好像很难work的样子…等等问题,我试着一一弄明白这些问题。这篇文章不涉及UI测试。


简介

单元测试是app的基础测试,为你的代码编写单元测试,可以很容易地验证程序的某个单元是否正确。当你改动代码之后,如果程序发生了错误,单元测试则可以帮助你快速发现这些错误。
单元测试以一种可重复的方式测试程序的最小单元,比如方法、类或者组件。为了验证特定代码单元的逻辑是否正确,你应该编写单元测试。通常情况下,单元测试与工程代码分离,测试只会影响到测试单元本身。而mocking框架可以将你的测试单元与其依赖分离。


ADT Eclipse进行单元测试

我们首先来看一下Eclipse怎样进行Android单元测试。

1、建立一个UnitTestDemo工程
2、为工程配置测试环境

然后在AndroidManifest文件Application节点下添加一条语句:

<uses-library android:name="android.test.runner" />

这样配置完成了

3、编写一个待测试的类,这个类我们会在后面多次用到。

public class Calculator {public int add(int a, int b) {return a + b;}public int dec(int a, int b) {return a - b;}}

4、为待测试类编写单元测试类,文件放在哪随意,最好把所有测试都放在新建的一个test包啦。

import junit.framework.TestCase;public class CalculatorTest extends TestCase {public void testAdd() {Calculator calculator = new Calculator();assertEquals(2, calculator.add(1, 1));}public void testDec() {fail("Not yet implemented");}}

5、右击CalculatorTest类,Run As -> Android Junit Test,启动真机或模拟器后即可看到测试结果了。

这样我们就完成了最简单的但也很实用的单元测试了。

如果在Eclipse环境下使用过Junit的同学一定会感到奇怪,IDE没有像编写Java程序那样提示我们:

下一节来说明


认识

为什么我们Android工程只需要写了配置就可以进行单元测试,好像我们都没有导入Junit框架。原因是,Android SDK本身就内置了基于Junit3的测试框架。我们查下API历史,发现从API 1就已经内置了测试框架了。

基于Junit3,整个Android内置的测试框架如下图。

关于各种测试有何不同可以参考:

http://developer.android.com/reference/android/test/package-summary.html
http://stackoverflow.com/questions/2047261/using-android-test-framework/2055455#2055455

因为不涉及UI测试,需要用到Context就继承AndroidTestCase,有个getContext方法;不需要直接就继承TestCase和Junit3一样使用。


Android Studio进行单元测试

有了上面的认识,我们知道了Android SDK本身就内置了以Junit3为基础的Android测试框架,而Android Studio本身就默认帮我们配置好了测试环境,所以直接就可以上测试了。

1、建立一个UnitTestDemo Module
2、编写一个待测试的类,直接拷贝上面的。
3、自动生成测试类,生成的代码位置androidTest目录下,编辑测试代码。

4、右击CalculatorTest类,Run,启动真机或模拟器后即可看到测试结果了。

解决了Eclipse和AS进行基本单元测试的问题,还有两个问题值得探讨:
1、每次测试都要启动真机或者模拟器,有没办法进行本地测试;
2、难道就不能用Junit4吗?


本地测试与Junit4

首先来了解一下两个概念:

Local tests:代码被编译成运行在本地JVM的单元测试,使用Local tests无需依赖Android框架,但可以通过mock注入依赖。
Instrumented(Instrumentation) tests:运行在真机或者模拟器的单元测试,这些测试可以获得真机环境,比如context。当难以通过mock注入Android框架的依赖时,就可以使用这种测试。

现在我们知道上面提到的两个例子都是Instrumentation tests。通过继承AndroidTestCase,我们就能分分钟得到context对象啦。不过使用Instrumentation Test每次都要启动一下真机或者模拟器,消耗较多资源,理论上来讲Local Test可以大幅减少测试时间。

1、配置Local Test环境,选择Unit Tests

2、导入依赖

testCompile 'junit:junit:4.12'

3、新建一个test/java包,必须。

4、和上面一样,自动生成测试类,生成的代码位置test目录下,编辑测试代码。

5、右击CalculatorTest类,Run。这一次无需启动真机或模拟器就可以运行了。

刚才提到本地测试很大原因是为了一个字快,理论上确实应该更快,然而在我的渣机器上还不如Instrumentation Test快…

我们一下子就实现了本地测试并且使用的是Junit4,Junit4是使用注解的测试框架,无需像Junit3一样测试方法必须使用test开头。上面这个例子我们自动生成的测试类同样可以使用Junit3。
如果我们把步骤2中的Junit4依赖去掉,Junit4不能使用这是不言而喻的,原本在Instrumentation Test可以使用的Junit3呢?答案是不能的,因为单元测试需要Runner,翻到最上面Eclipse那个工程可以看到Android默认的Runner是InstrumentationTestRunner,当我们使用Local Test时因为导入了Junit4依赖,AS能找到Junit4的Runner,怎么着也应该能兼容Junit3吧;而如果把Junit4依赖去掉,AS就找不到合适的Runner来Run这个Junit3的Local Test了。
最后Instumentation Test能使用Junit4吗,答案是可以的,但是配置起来比较麻烦,这里就不多纠结了,有爱可以参考。
https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html#build


小结

1、Android内置基于Junit3的测试框架,默认Runner是InsrtumentationTestRunner。
2、Instrumentation Test需要启动真机或模拟器,默认可以使用Junit3,可以通过配置使用Junit4。
3、Local Test无需启动真机或模拟器,导入Junit4依赖后,支持Junit4兼容Junit3。Local Test不能依赖于Android框架,如果需要注入Android依赖,可以通过mock技术。

这篇文章未涉及的主题包括:
mock和UI测试。

讲了这么一大堆怎样实现单元测试,那究竟测试代码应该怎样写呢。可以参考一些牛库的测试,比如OkHttp:
https://github.com/square/okhttp/tree/master/okhttp-tests/src/test/java/okhttp3

参考:

  • https://github.com/googlesamples/android-testing/tree/master/unit
  • https://developer.android.com/training/testing/unit-testing/index.html
  • http://stackoverflow.com/questions/2047261/using-android-test-framework/2055455#2055455

Android:单元测试相关推荐

  1. Android单元测试全解

      自动化测试麻烦吗?说实在,麻烦!有一定的学习成本.但是,自动化测试有以下优点: 节省时间:可以指定测试某一个activity,不需要一个个自己点 单元测试:既然Java可以进行单元测试,Andro ...

  2. Android 单元测试学习计划

    网上查了一下Android单元测试相关的知识点,总结了一个学习步骤: 1. 什么是单元测试 2. 单元测试正反面: 2.1. 重要性 2.2. 缺陷 2.3. 策略 3. 单元测试的基础知识: 3.1 ...

  3. Android单元测试 - 几个重要问题

    前言 已经一个月没写文章了,由于9月份在plan国庆旅行计划,国庆前前后后去了14天旅行,所以没时间写,哈哈. 言归正传,上一篇文章<Android单元测试 - 如何开始?>介绍了几款单元 ...

  4. Android单元测试框架Robolectric3.0介绍(二)

    文章中的所有代码在此:https://github.com/geniusmart/LoveUT ,由于 Robolectric 3.0 和 3.1 版本(包括后续3.x版本)差异不小,该工程中包含这两 ...

  5. Android单元测试研究与实践

    处于高速迭代开发中的Android项目往往需要除黑盒测试外更加可靠的质量保障,这正是单元测试的用武之地.单元测试周期性对项目进行函数级别的测试,在良好的覆盖率下,能够持续维护代码逻辑,从而支持项目从容 ...

  6. Android单元测试 - Sqlite、SharedPreference、Assets、文件操作 怎么测?

    前言 上篇<Android单元测试 - 几个重要问题> 讲解了"何解决Android依赖.隔离Native方法.静态方法.RxJava异步转同步"这几个Presente ...

  7. android单元测试作用,Android单元测试源码解读

    Android手机操作系统是一个开源的操作系统.程序员们可以在模拟器的帮助下对其进行修改,来实现各种功能需求,满足用户的应用.在这里我们先来了解一下Android单元测试的相关内容. 在网络上找了半天 ...

  8. android单元测试android环境,基于Robolectric的Android单元测试 —环境搭建与部署运行...

    移动端的测试中,因为回归一些逻辑分支比较多的功能时工作量比较大,且不太适合用UI完成,尝试通过单元测试来完成.几经波折终于完成了一个功能的UT用例并在CI上部署运行,现总结如下: 一.Robolect ...

  9. Android单元测试 Instrumentation

    开发中我们需要对部分功能进行单元测试,启动Activity来测试部分小功能,有点小题大作,杀鸡用牛刀. 我们可以用Android单元测试 Instrumentation 本篇只是入门,起到抛砖的效果 ...

  10. (转)Android单元测试

    关键字: camera unit test android源代码中每个app下中都自带了一个test用例,下面主要介绍下camra单元测试用例 在AndroidManifest.xml中标明了测试用例 ...

最新文章

  1. Java三大主流开源工作流引擎技术分析
  2. htmlcss网页设计代码案例_网页设计案例|定价表版块设计方案鉴赏
  3. BZOJ4723[POI2017]Flappy Bird——模拟
  4. 用户级线程与内核级线程
  5. javascript实现面向对象的继承
  6. CentOS 5.5下搭建部署独立SVN服务器全程详解
  7. jenkins-系统管理-节点管理进去报错
  8. 向github传项目
  9. 【SSO-CAS】sso 之 cas 实现的几个问题
  10. 蓝桥杯官网试题 欧拉的鸡蛋
  11. ps知识的教学 day01
  12. Excel 2010去掉网格线
  13. Linux中GoogleChrome谷歌浏览器安装好了打不开怎么办?
  14. java实现正态分布累积分布,标准正态分布变量的累积概率分布函数
  15. 一组数据,带你读懂“2021中国民营企业500强”背后深意
  16. EPS概念及EPC相关网元
  17. 关于虚拟机复制文件时:无法确定本地文件类型。您可能没有执行此操作的权限。 正在取消文件复制操作。的决解方法
  18. Pega How To系列之二:如何做数据验证 ---- CheneyWang
  19. 陈经纶2021年高考成绩查询时间,北京2021高考成绩排名榜单,北京各高中高考成绩喜报...
  20. 线性丢番图方程的C++实现

热门文章

  1. PCM开发板模块实验指导--有刷直流马达正反转实验
  2. Tiled Map 地图素材大全下载
  3. 华为防火墙笔记-GRE
  4. 苹果展开新显示器带动高阶需求:Mini LED背光技术
  5. airpods版本号_airpods蓝牙版本是多少,苹果AirPods正式版使用评测
  6. java火车票售票系统_基于java的火车票售票系统,界面Swing
  7. Python函数——Numpy size()
  8. 在单片机C语言中const是什么意思
  9. 二.ARM裸机学习之S5PV210刷机
  10. Camels and Bridge[ARC105C][二分+Dp]