单元测试实践-android

概述

单元测试是最基础的测试,有效的单元测试将直接提升产品质量。软件开发工程师应当将编写和运行测试作为开发过程的一部分,
良好的单元测试能够在开发早期发现软件缺陷,让工程师对自己写的代码感到自信。
本文将描述如何使用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目录


UnitTest

添加依赖

在工程app/build.gralde文件中增加如下依赖

1
2
3
4
5
dependencies {
// Unit testing dependencies.
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
}

添加代码覆盖率支持

增加jacoco支持

1
apply plugin: 'jacoco'

1
2
3
4
5
ependencies {
// Unit testing dependencies.
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'
}

// 增加jacoco,工具版本可以根据最新版本进行修改

1
2
3
jacoco {
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
22
android {
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。


UnitTest

查看覆盖率

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


UnitTest

查看代码覆盖情况

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


UnitTest

Jenkins配置说明

创建项目


UnitTest

配置仓库

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


UnitTest

构建触发器

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


UnitTest

增加构建Gradle命令


UnitTest

UnitTest

构建后操作-增加Lint结果


UnitTest

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


UnitTest

构建后操作-增加JUnit测试报告

在测试报告项填入/build/test-results//*.xml


UnitTest

构建后操作-增加覆盖率报告

1
2
3
4
5
Path to exec files项增加**/build/jacoco/*.exec
Path to class directories项增加**/build/intermediates/classes
Path to source directories增加**/src/main/java
Exclusions项增加:
**/R.class, **/R$*.class, **/*$ViewInjector*.*,**/BuildConfig.*,**/Manifest*.*

UnitTest

邮件通知

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


UnitTest

自动集成效果


UnitTest

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


UnitTest

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


UnitTest

热评文章