美文网首页
Android 单元测试 及 覆盖率

Android 单元测试 及 覆盖率

作者: 正洋_Android | 来源:发表于2017-02-09 15:41 被阅读731次

    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

    相关文章

      网友评论

          本文标题:Android 单元测试 及 覆盖率

          本文链接:https://www.haomeiwen.com/subject/glqbittx.html