之前研究了如果使用Uiautomator 2.0来自动化模拟人的手动测试,来检测程序的基本功能是否完整。然而,根据经验来检测功能,是人为设定哪些功能是我们需要关注的,认为设定的真的测试完整了吗?这个测试究竟对程序验证到了什么程度?这就需要代码覆盖率来完成。
首先,人为设定哪些需要检测是可行的,也是可信的。程序是程序员设计的,这个程序有什么目的,需要完成什么功能,程序员是知道的,所以我们可以针对这些功能进行一一检查,确保功能正常。
然而,幸运的是,android还提供了一种机制,可以在我们具备了自动化检测的基础上,对代码的覆盖率进行检测,其原理是统计代码的总方法的个数,然后在自动化检测过程中,使用到的方法的个数,使用个数/总个数,就是测试覆盖率。
而且测试覆盖率的方法很简单,完全可以在设计完自动化测试之后,随手测一次。
这个方案有一个假设,当功能正确的时候,其涉及到的方法就是我们希望其运行的方法。也就是,一个行为调用了一系列方法,只有这一系列方法都没有错误,这个行为才能成功完成。
我们相信这个假设的正确性,那么我们就可以选择以此为假设的官方组件,比如mockito或jacoco
我们在已有Uiautomator的测试基础上,可以比较简单的完成覆盖率测试,下面是完整的流程:
1:改写gradle文件,测试环境搭建
2:运行覆盖率测试
3:在目录下找到结果
详细流程:
1:环境搭建
1.1 基本准备:
以本文推荐的简单方法,完成覆盖率测试,需要将测试的代码和程序的代码放到一个工程当中。程序代码在app/src/main里面。而UiAutomator的代码在app/src/AndroidTest里面。
如果因为特殊原因,测试的代码位置不是默认位置,则需要在gradle里面配置测试程序的地址。
需要在文件build.gradle里面,加入一项:
androidTest {
java.srcDirs = ['androidTest/java']
}
其中,‘androidTest/java’是代码路径,根据需要修改,
一般我们不加此项,则测试地址为默认地址
默认地址为java.srcDirs = ['app/src/AndroidTest/java']
1.2加入jacoco
采用gradle的apply,插入后,系统会自己进行下载。
apply plugin: 'jacoco'
此命令也是单独的一项,是最高级项,和上一项中的androidTest 平级。插入命令后面没有{}的内容来表征细节。
1.3设定打开覆盖率测试。
在主项buildTypes 中,添加当前编译的对象,一般是debug或者release。
将testCoverageEnabled = true命令放入debug中,该项如下。
buildTypes {
debug { testCoverageEnabled = true
}
}
完成以上三步,基本准备工作就已经做完。
2:运行覆盖率测试
2.1运行自动化测试
运行覆盖率测试,首先要确保自动化测试能够100%通过,如果有某项测试没有通过,是不能进行覆盖率测试的。
运行自动化测试的方法:
在androidStudio的最右边,在写代码的框的右上角,有一个名为Gradle的选项,点击后能够打开一个侧边栏。
Task/verification/connectedAndroidTest,在这个选项点击右键,然后run,记住一定要点,这样后面进行覆盖率测试才顺利
2.2运行覆盖率测试的地方。
在androidStudio的最右边,在写代码的框的右上角,有一个名为Gradle的选项,点击后能够打开一个侧边栏。
侧边栏目录中,Task/verification/createDebugCoverageReport,在这个选项点击右键,然后run即可。
以上就会在手机上进行一边自动化测试,当测试完成后,覆盖率测试也同步完成了。
3:查看报告。
报告输出在build\reports\coverage里面,会生成各个类的具体细节,同时还有一个在根目录有名为index.html的统一文件,点开后,能够看到总的覆盖率的百分比。
以上,就完成了一次测试覆盖率的测试,在已经实现了自动化测试的基础上,完成覆盖率测试非常简单,作为一个小工具,值得学习和使用。