单元测试,就是对我们写的代码进行最小粒度的测试,可以测试函数的执行情况及运行时间。在新版本的Android Studio中,我们新建一个工程,就会自动生成单元测试目录及自动添加测试框架的依赖。
关于Android单元测试的相关知识,在这里不作讲解,大家可以参考其它文章。代码覆盖率报告是表现单元测试的覆盖情况,这里也不对它的进行阐述。
关于单元测试,需要依赖Junit4框架和AndroidJunit4框架。如果要进行UI相关的测试需要依赖espresso框架。为了模拟一些无法测试的情况,可能还需要依赖mockito框架。关于这些知识,大家可以参考这些文章:
Android单元测试只看这一篇就够了
Mock及Mockito的使用
Android利用Espresso进行UI自动化测试的方法详解
Android代码覆盖率工具的使用
掌握了以上文章中的内容,大家就可以写单元测试了,并且可以生成单元测试覆盖率报告。
通过./gradlew createDebugCoverageReport这个命令,它会自动在各个工程中生成一份覆盖率报告。无法把它们合并在一起。并且必须在各个library工程中写单元测试。这样显示很麻烦。我们期望的是只在app主工程中写单元测试,并且生成的报告包括依赖工程。因为app主工程已经依赖了其它library工程。
想达到这种效果,我们就需要在app主工程的build.gradle文件中加入以下内容
apply plugin: 'com.android.application'
apply plugin: 'jacoco'
jacoco {
//编译如果出现could not read execution data请修改这个版本号
toolVersion = "0.8.2"
}
task jacocoTestReport(type: JacocoReport) {
group = "Reporting"
description = "Generate Jacoco coverage reports"
sourceDirectories = files() //源码
classDirectories = files() //class字节码
//定义需要过滤的代码
def fileFilter = ['**/R.class', '**/R$*.class','**/BuildConfig.*', '**/Manifest*.*','android/**/*.*']
project.rootProject.allprojects.each { project ->
if (project.name != "app") { //报告中去除app工程中的代码
sourceDirectories += files("${project.projectDir}" + "/src/main/java")
classDirectories += fileTree(dir: "${project.projectDir}" + "/build/intermediates/classes/debug", excludes: fileFilter)
}
}
//build时打印路径
sourceDirectories.files.each {
logger.lifecycle(it.path)
}
classDirectories.files.each {
logger.lifecycle(it.path)
}
//设置ec文件源
executionData = fileTree(dir: "$buildDir", includes: ["outputs/code-coverage/connected/*.ec"])
reports {//报告生成目录
xml.enabled = false
html.enabled = true
html.destination file("${buildDir}/reports/allReports")
}
}
添加配置后,在工程根目录运行命令./gradlew createDebugCoverageReport
执行此task后就会在xxx/build/outputs/code-coverage/connected路径下生xxx.ec文件。
再执行./gradlew jacocoTestReport
就会在xxx/build/reports/allReports目录下生成所有工程的单元测试覆盖率报告。
注意,不要忘了在library工程的build.gradle文件中打开覆盖率报告开关:
buildTypes {
debug {
testCoverageEnabled = true
}
...
}
另外,library工程不要添加任何与单元测试有关的框架和代码。单元测试框架只需要在app主工程中添加即可。