android ui覆盖,Android UI 自动化测试的代码覆盖率

代码覆盖率我们都知道,了解过 jacoco 也知道如何去弄,那么我们想要在跑 UI 自动化脚本的时候如何收集脚本执行过程中的代码覆盖率呢?首先我们知道 jacoco 可以得到测试的代码覆盖率,那么如果这些单测是 UI 的 case,是不是就可以达到我们的要求,我们尝试一下,参考文档

AS 中新建 android 项目

bb6c806b8fc274fe6f3d71ae707ffe4a.png

在 android studio 上新建一个 android 项目,默认 build.gradle 如下:

apply plugin: 'com.android.application'

android {

compileSdkVersion 21

buildToolsVersion "21.1.2"

defaultConfig {

applicationId "com.wuba.wuxian.android_0504"

minSdkVersion 19

targetSdkVersion 21

versionCode 1

versionName "1.0"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'com.android.support:appcompat-v7:22.0.0'

}

执行测试

执行 connectedAndroidTest 任务,在 android studio 中,执行测试任务的任务名为 connectedAndroidTest(被坑了很久)。

58deMacBook-Pro:app wuxian$ gradle clean connectedAndroidTest

:app:clean

:app:preBuild UP-TO-DATE

:app:preDebugBuild UP-TO-DATE

:app:compileDebugNdk UP-TO-DATE

:app:checkDebugManifest

:app:preReleaseBuild UP-TO-DATE

:app:prepareComAndroidSupportAppcompatV72200Library

:app:prepareComAndroidSupportSupportV42200Library

:app:prepareDebugDependencies

:app:compileDebugAidl

:app:compileDebugRenderscript

:app:generateDebugBuildConfig

:app:generateDebugAssets UP-TO-DATE

:app:mergeDebugAssets

:app:generateDebugResValues UP-TO-DATE

:app:generateDebugResources

:app:mergeDebugResources

/Users/wuxian/Documents/sourcecode/self/Android_05042/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.0.0/res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited

:app:processDebugManifest

:app:processDebugResources

:app:generateDebugSources

:app:compileDebugJava

:app:preDexDebug

:app:dexDebug

:app:processDebugJavaRes UP-TO-DATE

:app:validateDebugSigning

:app:packageDebug

:app:zipalignDebug

:app:assembleDebug

:app:preDebugAndroidTestBuild UP-TO-DATE

:app:compileDebugAndroidTestNdk UP-TO-DATE

:app:prepareDebugAndroidTestDependencies

:app:compileDebugAndroidTestAidl

:app:processDebugAndroidTestManifest

:app:compileDebugAndroidTestRenderscript

:app:generateDebugAndroidTestBuildConfig

:app:generateDebugAndroidTestAssets UP-TO-DATE

:app:mergeDebugAndroidTestAssets

:app:generateDebugAndroidTestResValues UP-TO-DATE

:app:generateDebugAndroidTestResources

:app:mergeDebugAndroidTestResources

:app:processDebugAndroidTestResources

:app:generateDebugAndroidTestSources

:app:compileDebugAndroidTestJava

:app:preDexDebugAndroidTest

:app:dexDebugAndroidTest

:app:processDebugAndroidTestJavaRes UP-TO-DATE

:app:packageDebugAndroidTest

:app:assembleDebugAndroidTest

:app:connectedAndroidTest

BUILD SUCCESSFUL

Total time: 47.159 secs

执行成功后,我们去找测试报告,可千万别去 build 下找 reports 目录啊,真心不一样有没有,带 build/outputs/reports/androidTests/connected 目录下打开 index.html。

ec3fa6185278362121cb536441874745.png

20cf7e60200dcfc88fb0d4a3d5bae7b7.png

在 gradle 中加入 jacoco

在 build.gradle 中添加如下信息:

apply plugin: 'jacoco'

....

jacoco{

toolVersion = "0.7.1.201405082137"

}

android {

buildTypes {

debug {

testCoverageEnabled = true

}

添加后的 build.gradle 如下所示:

apply plugin: 'com.android.application'

apply plugin: 'jacoco'

android {

compileSdkVersion 21

buildToolsVersion "21.1.2"

defaultConfig {

applicationId "com.wuba.wuxian.android_0504"

minSdkVersion 19

targetSdkVersion 21

versionCode 1

versionName "1.0"

}

buildTypes {

debug {

testCoverageEnabled = true

}

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'com.android.support:appcompat-v7:22.0.0'

}

jacoco {

toolVersion = "0.7.1.201405082137"

}

执行 jacoco

执行获得代码覆盖率的报告命令为 createDebugCoverageReport

58deMacBook-Pro:app wuxian$ gradle clean createDebugCoverageReport

:app:clean

:app:preBuild UP-TO-DATE

:app:preDebugBuild UP-TO-DATE

:app:compileDebugNdk UP-TO-DATE

:app:checkDebugManifest

:app:preReleaseBuild UP-TO-DATE

:app:prepareComAndroidSupportAppcompatV72200Library

:app:prepareComAndroidSupportSupportV42200Library

:app:prepareDebugDependencies

:app:compileDebugAidl

:app:compileDebugRenderscript

:app:generateDebugBuildConfig

:app:generateDebugAssets UP-TO-DATE

:app:mergeDebugAssets

:app:generateDebugResValues UP-TO-DATE

:app:generateDebugResources

:app:mergeDebugResources

/Users/wuxian/Documents/sourcecode/self/Android_05042/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/22.0.0/res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png: libpng warning: iCCP: Not recognizing known sRGB profile that has been edited

:app:processDebugManifest

:app:processDebugResources

:app:generateDebugSources

:app:compileDebugJava

:app:unzipJacocoAgent

:app:instrumentDebug

:app:preDexDebug

:app:dexDebug

:app:processDebugJavaRes UP-TO-DATE

:app:validateDebugSigning

:app:packageDebug

:app:zipalignDebug

:app:assembleDebug

:app:preDebugAndroidTestBuild UP-TO-DATE

:app:compileDebugAndroidTestNdk UP-TO-DATE

:app:prepareDebugAndroidTestDependencies

:app:compileDebugAndroidTestAidl

:app:processDebugAndroidTestManifest

:app:compileDebugAndroidTestRenderscript

:app:generateDebugAndroidTestBuildConfig

:app:generateDebugAndroidTestAssets UP-TO-DATE

:app:mergeDebugAndroidTestAssets

:app:generateDebugAndroidTestResValues UP-TO-DATE

:app:generateDebugAndroidTestResources

:app:mergeDebugAndroidTestResources

:app:processDebugAndroidTestResources

:app:generateDebugAndroidTestSources

:app:compileDebugAndroidTestJava

:app:preDexDebugAndroidTest

:app:dexDebugAndroidTest

:app:processDebugAndroidTestJavaRes UP-TO-DATE

:app:packageDebugAndroidTest

:app:assembleDebugAndroidTest

:app:connectedAndroidTest

:app:createDebugCoverageReport

BUILD SUCCESSFUL

Total time: 1 mins 6.089 secs

ok,我们去查看代码覆盖率的报告:

报告目录:

7d950e19a26530f45f5b49c2cf4c9bf6.png

报告形式:

72950f1a90a49f7b4a80a338ec5bb551.png

加入 UI 脚本

上面的测试结果报告和代码覆盖率的报告都有了,但是我们的要求是执行 UI 脚本的时候,查看代码覆盖率的。所以我们现在加入 UI 脚本,我选择 Robotium 来编写自动化脚本,原因是 Robotium 是继承自 instrumentation 的框架,至于 uiautomator 的 case 看官方的介绍暂时还没有加入,以后可能会加入。

加入 robotium 依赖 androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.1'

添加依赖后的 build.gradle 如下:

apply plugin: 'com.android.application'

apply plugin: 'jacoco'

android {

compileSdkVersion 21

buildToolsVersion "21.1.2"

defaultConfig {

applicationId "com.wuba.wuxian.android_0504"

minSdkVersion 19

targetSdkVersion 21

versionCode 1

versionName "1.0"

}

buildTypes {

debug {

testCoverageEnabled = true

}

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

compile 'com.android.support:appcompat-v7:22.0.0'

androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.1'

}

jacoco {

toolVersion = "0.7.1.201405082137"

}

同步一下脚本后,我们会发现依赖包中多了一个 robotium 的 jar 包

829ec153dea2233c766e1ca975ed06f1.png

在 app 模块下的 src/androidTest 目录下添加一个 MainActivityTest 的 case 类,这个 case 只是简单的打开关闭应用。

2de97f07893220b664b60bbc038ca96e.png

MainActivityTest 内容如下:

package com.wuba.wuxian.android_0504;

import android.test.ActivityInstrumentationTestCase2;

import com.robotium.solo.Solo;

/**

* Created by wuxian on 15/5/6.

*/

public class MainActivityTest extends ActivityInstrumentationTestCase2 {

private Solo solo;

public MainActivityTest() {

super(MainActivity.class);

}

@Override

public void setUp() throws Exception {

super.setUp();

solo = new Solo(getInstrumentation(), getActivity());

}

public void testStartClose() throws Exception {

Thread.sleep(1000);

}

@Override

public void tearDown() throws Exception {

super.tearDown();

}

}

然后我们执行gradle clean createDebugCoverageReport 命令来执行测试和生成代码覆盖率的报告

71ebf6f2594e4a980dc5b32f39d6c776.gif

我们来看一下代码覆盖率的报告:

2a054357817704cf9e0429ea73b207c8.png

总结

跳过的坑

坑 1

2 天时间研究出来,超出我的预期,刚开始以为 android 项目和普通 java 项目就是简单的添加 jacoco,然后执行 test 和 jacoco 就能得到数据,后来实验的时候得不到数据,就添加了一个 jacocoTestReport 任务,还是不行,原来 android 已经将这些任务都内置到了 android plugin 里面去了。

任务

作用

connectedAndroidTest

执行 android 的 case

createDebugCoverageReport

产生代码覆盖率的报告

connectedCheck

包含上面 2 个任务

坑 2

报告的目录不是普通 java 项目的 build/reports 目录下,而是在 build/outputs/reports 目录下,包含了测试结果 androidTests 和代码覆盖率结果 coverage:

d3a3bf32a98e5cee4b5eaed07e33e071.png

坑 3

要想执行代码覆盖率的任务,需要开启代码覆盖率的权限,就是在 build.gradle 设置testCoverageEnabled = true 如果这个不设置,你执行createDebugCoverageReport 任务时会报错:

58deMacBook-Pro:app wuxian$ gradle clean createDebugCoverageReport

FAILURE: Build failed with an exception.

* What went wrong:

Task 'createDebugCoverageReport' not found in project ':app'.

* Try:

Run gradle tasks to get a list of available tasks. Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 10.169 secs

执行 connectedCheck 不会执行 createDebugCoverageReport 任务

bc6965914f61b5b97fd502934801b182.png

后续

我们已经完成了在跑自动化 case 的时候统计代码覆盖率,如果我们想统计功能测试人员手动执行 case 的代码统计率呢?因为没有了自动化 case 来引导,所以就有点区别,好在Monkey给了点提示,我们明天来研究。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值