概述
单元测试是最基础的测试,有效的单元测试将直接提升产品质量。软件开发工程师应当将编写和运行测试作为开发过程的一部分,
良好的单元测试能够在开发早期发现软件缺陷,让工程师对自己写的代码感到自信。
本文将描述如何使用JUnit4框架在Android工程中进行单元测试,开发环境为Android Studio,Android中有两种单元测试:
Local Unit Tests和Instrumented Tests,Instrumented Tests依赖于设备,可进行单元、组件、界面测试,
本文重点描述如何进行本地单元测试(Local Unit Tests)。
注:文中提到的例子在Google Samples的BasicSample基础上进行了部分修改。
单元测试组成
配置管理
使用版本管理控制软件,推荐使用git,目前最好的版本控制软件,没有之一。
https://git-scm.com/downloads
构建管理工具
Android Studio默认集成工具为gradle。
https://docs.gradle.org/current/userguide/userguide.html
测试框架
单元测试框架junit4
http://junit.org/junit4/
模拟对象框架mockito
http://mockito.org/
模拟真机功能Robolectric。
http://robolectric.org/
持续集成平台
自动化构建工具,推荐使用jenkins。
https://jenkins.io/index.html
Android单元测试介绍
单元测试目录
工程目录app->src->test目录

添加依赖
在工程app/build.gralde文件中增加如下依赖1
2
3
4
5dependencies {
// Unit testing dependencies.
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
}
添加代码覆盖率支持
增加jacoco支持1
apply plugin: 'jacoco'
1 | ependencies { |
// 增加jacoco,工具版本可以根据最新版本进行修改1
2
3jacoco {
toolVersion = "0.7.6.201602180812"
}
增加覆盖率统计和Lint选项
Android节点buildTypes增加testCoverageEnabled = true
Lint选项设置为遇到错误不终止。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22android {
compileSdkVersion 23
buildToolsVersion '23.0.2'
defaultConfig {
applicationId "com.example.android.testing.unittesting.BasicSample"
minSdkVersion 8
versionCode 1
versionName "1.0"
targetSdkVersion 23
}
buildTypes {
debug {
testCoverageEnabled = true
}
}
productFlavors {
}
lintOptions {
// I prefer avoiding a build fail if there is any warning, for they are only warnings
abortOnError false
}
}
图形化运行单元测试工具
android studio自动集成了单元测试覆盖率统计工具,选中编写好的测试类,右键点击Run ‘XXXXXX’ with Coverage。

查看覆盖率
出现覆盖率面板,按F4或双击相关行,可以打开源代码查看具体哪些行没有覆盖到。

查看代码覆盖情况
两种颜色表明覆盖和未覆盖两种状态,此时开发工程师应当分析是否需要增加新的测试代码对未进行测试的语句行覆盖。

Jenkins配置说明
创建项目

配置仓库
推荐使用git,目前最好的版本控制软件,没有之一。

构建触发器
一般选择定时检测版本库,有提交就自动构建。

增加构建Gradle命令


构建后操作-增加Lint结果

在Lint files项填入**/app/build/outputs/lint-results-debug.xml

构建后操作-增加JUnit测试报告
在测试报告项填入/build/test-results//*.xml

构建后操作-增加覆盖率报告
1 | Path to exec files项增加**/build/jacoco/*.exec |

邮件通知
填写接收构建失败邮件的邮箱地址,需要确认在Jenkins的系统管理中增加了邮件服务器和管理员的配置。

自动集成效果

点击各目录可查看详细的问题信息

点击文件名可查看具体的代码行覆盖情况
