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 25buildToolsVersion "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)@LargeTestpublic class MainActivityInstrumentationTest {private static final String STRING_TO_BE_TYPED = "LIU ZHENG YANG";@Rulepublic ActivityTestRule mActivityRule = new ActivityTestRule<>( MainActivity.class);@Testpublic 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))); //比对文本}@Testpublic 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 '
使用
先执行如下的命令行,清除之前的残留配置。
./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
更多相关文章
- Deepin/Ubuntu/Ubuntukylin/Xubunt/Lubuntu/Kubuntu Android(安
- Android中使用Junit进行单元测试
- Android(安卓)Studio 无法安装调试 apk 问题
- Android(安卓)单例模式与SharedPreferences一起使用
- 配置Andriod环境变量
- [Android]更改Configuration来读取不同的Apk Resource
- Android(安卓)Studio jcenter集成butterknife:8.x.0
- Android(安卓)selinux配置和用法
- Android开发四年面试相关知识整理