承接上文
上一篇单元测试讲了如何在Android Studio中写测试用例,自动化测试并生成测试报告,这一篇主要讲一下扩展工具的使用。
jacoco代码覆盖率
jacoco是一个检测代码覆盖率的插件工具,那什么是代码覆盖率呢?代码覆盖率简单来说就是单元测试用例所测试到的代码比重,被测试到即是被覆盖。覆盖率高自然是好事,但不能完全说明代码质量高没有bug,生成的覆盖率报告可能大部分情况下也就是应付差事,应付差事,付差事。。。
在Android Studio中使用jacoco还是比较简单的,只需要更改Module目录下的gradle文件。首先就是导入jacoco插件并指定使用版本。
apply plugin: 'jacoco'
jacoco {
version "填写版本号,如0.7.9"
}
指定版本的代码在AS2.x时代可以写在android代码块中,不过到了3.0之后就不推荐了,可以写在外面和android、dependencies一个级别。另外需要在buildTypes下的debug(release应该也可以)中添加支持代码覆盖testCoverageEnable为true。然后就是自定义一个gradle task。
task jacocoTestReport(type:JacocoReport,dependsOn:"test"){ // 1
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
classDirectories = fileTree( // 2
dir : "$buildDir/intermediates/classes/debug",
excludes : [
'**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*'
]
)
def coverageSourceDirs = ['src/main/java']
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
additionalClassDirs = files(coverageSourceDirs)
executionData = files("$buildDir/jacoco/testDebugUnitTest.exec") // 3
reports{ // 4
xml.enabled = false
html.enabled = true
csv.enabled = false
}
}
上面的代码有几个点需要注意:
- 注释1中的type指定了类型,这里就是jacoco的报告,然后他是依据后面dependsOn的task去生成的;
- 注释2是指定了生成的类文件的目录,其中exclude是排除以下的文件,如果有以下源码不需要进行识别是否覆盖,这里也就要求了命名的规范性;
- 注释3是最重要的一个部分,这里指向了一个exec文件,jacoco原理上就是根据这个生成的文件去生成自己的报告,不过有一点要注意如果一开始dependsOn的是AndroidTest的任务,这个文件的路径就不一样了而且后缀也不一样,去尝试一下吧;
- 注释4比较显而易见的就是报告生成的类型,最好还是html。
依然是在AS的命令终端执行gradlew+task的命令模式,gradlew jacocoTestReport之后终端会自动执行自动化测试并生成测试报告和代码覆盖率报告。代码覆盖率报告生成的前提是所有的测试用例都通过测试。覆盖率报告的样子可以参考下图,红色代表了没有覆盖到:
jenkins持续集成
jenkins是一种持续集成工具,可以监控持续重复的工作,如apk的打包生成等。它的环境搭建不是这里重点说的,网上的例子也很多。用过这个工具的应该也对它支持gradle构建Android apk有所了解,在自动化测试的部分用到它也是用到了它能够对Android项目自动打包,同时支持插件的扩展。
为了能够支持单元测试,jenkins需要安装junit插件,如果想增加对代码覆盖率的支持,就需要安装本文介绍的jacoco的插件。由于这一部分并不是所有技术人员都会参与,所以主体内容就省略,直接跳转到如何配置构建的命令一步。
上图中就是对一个jenkins任务的配置,这里的构建就是项目在构建时所需要做的一些工作,首先选择合适版本的gradle,然后就是添加gradle所需要执行的tasks。保存之后在该项目的控制面板中点击立即构建,会出现一个正在构建的任务,这个过程可能比较漫长。构建成功之后可以在对应的jenkins的工作目录下的该项目目录找到生成的报告。特别提醒一下,这次构建gradle会自动为我们生成lint报告,方便了代码review。
总结
两篇文章其实也只是简单介绍了Android的自动化单元测试,介绍了移动端自动化测试的可行性。不过也有很多没有涉及或介绍不细之处,如其他的单元(UI)测试框架,对jenkins的使用等等。准备仓促,而且也不是专业测试开发人员,最后列出一下参考文章以拓展。
参考文章
Android单元测试框架Robolectric3.0介绍
Jenkins构建Android项目持续集成之简介篇(这是一个系列)