Android 单元测试 及 覆盖率

android中的测试方法主要有:

InstrumentationTextCase ,Google 官方提供的Espresso。

那么什么是Instrumentation?

Instrumentation和Activity有点类似,只不过Activity是需要一个界面的,而Instrumentation并不是这样的,我们可以将它理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。

Instrumentation 特点

该框架基于JUnit,因此既可以直接使用Junit 进行测试,也可以使用Instrumentation 来测试Android 组件
其为Android 应用的每种组件提供了测试基类
可以在Eclipse 中方便地创建Android Test Project,并将Test Case直接以Android JUnit的方式运行

示例可以参照(转载的):http://blog.csdn.net/gb112211/article/details/45419669

Espresso

至于什么是Esp 这个就可以直接参照我前面的文章:
http://www.jianshu.com/p/37a3f68934cd

下面简单说下配置流程:

在gradle 里面如下配置

android {
compileSdkVersion 25
buildToolsVersion "24.0.1"
defaultConfig {
    applicationId "com.zy.testing"
    minSdkVersion 21
    targetSdkVersion 25
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        testCoverageEnabled true
    }

}
packagingOptions {
    exclude 'LICENSE.txt'
}
}
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.5'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'

上面的步骤即可安装完成
最后再 androidTest包下新建一个测试类,代码如下:

 package com.zy.testing;

/**
 * 项目名称:TestingExample
 * 类描述:
 * 创建人:liu zheng yang(youngforjob@163.com)
 * 创建时间:17/2/8 16:15
 * 修改时间:17/2/8 16:15
 * 修改备注:
 */

import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.action.ViewActions;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;

import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MainActivityInstrumentationTest {

private static final String STRING_TO_BE_TYPED = "LIU ZHENG YANG";

@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
        MainActivity.class);

@Test
public void sayHello(){
    onView(withId(R.id.editText)).perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard()); //设置文本

    onView(withText("Say hello!")).perform(click()); //找到文本设置点击

    String expectedText = "Hello, " + STRING_TO_BE_TYPED + "!";
    onView(withId(R.id.textView)).check(matches(withText(expectedText))); //比对文本
}

@Test
public void  sayBye(){

}
}

下面说一下覆盖率的情况:

大致分为两个部分:
Espresso进行集成测试统计覆盖率,则执行如下命令

./gradlew clean assemble
./gradlew createDebugCoverageReport

运行 ./gradlew createDebugAndroidTestCoverageReport 这个是正对AndroidTest下面的
在debug闭包中添加

debug{
    testCoverageEnabled true
}

使用Robolectric 框架结合,进行覆盖率测试

谷歌对 Robolectric框架支持力度一般,所以发现 JaCoCo 工具在使用此框架时候,需要进行的配置较多。
配置
在 build.gradle 中将 testCoverageEnabled设置为 true

    android { 
        buildTypes { 
            debug { 
                testCoverageEnabled = true 
            } 
        }
    }

在 build.gradle 中增加如下配置

    apply plugin: 'jacoco' 

此框架中需要此配置。 然后在 gradle 文件中插入如下的配置,对JaCoCo进行设置

    jacoco { toolVersion = "0.7.1.201405082137"  //版本号可用最新
    }
    def coverageSourceDirs = [ '../app/src/main/java']
    task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest") { 
            group = "Reporting" 
            description = "Generate Jacoco coverage reports" 
            classDirectories = fileTree( dir: '../app/build/intermediates/classes/debug',
            excludes: ['**/R.class', '**/R$*.class', '**/*$ViewInjector*.*', '**/BuildConfig.*', '**/Manifest*.*']  // 去掉不进行检查的文件 ) 
            additionalSourceDirs = files(coverageSourceDirs) 
            sourceDirectories = files(coverageSourceDirs) 
            executionData = files('../app/build/jacoco/testDebugUnitTest.exec') 
            reports { xml.enabled = true html.enabled = true }
    }
    task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest")

这行的配置,中间的dependsOn一定要设置成 testDebugUnitTest 后续才可以正确执行覆盖率测试。
https://github.com/kvandermast/my-robolectric-app
在这个例子中,此配置成了 testDebug,实际测试发现会报错 Task 'jacocoTestReport' not found in root project '<project name>'.

使用
先执行如下的命令行,清除之前的残留配置。

    ./gradlew clean testDebugUnitTest jacocoTestReport

之后再执行命令行

    ./gradlew jacocoTestReport

执行该命令行后,会执行所有的单元测试用例,然后在如下位置生成报告。 build/reports/jacoco/jacocoTestReport/html 也可以通过浏览器对覆盖率情况进行查看

其实也可以忽略上面的两行命令,因为最新版本Android 库的已经支持Jacoco 了。

运行

./gradlew createDebugAndroidTestCoverageReport

恩, 这里查看 app/build/reports/coverage/debug/index.html

这个方式也是SF上看的:
https://segmentfault.com/a/1190000003901086

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容