安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)

摘要:
本文将向您展示如何使用非检测来启动应用程序,创建实时覆盖率统计数据,并一键触发覆盖率测试报告。在上一篇文章中,我带您解决了Android应用程序的手动测试或自动测试的覆盖率统计。我们使用了检测的方法来启动应用程序。许多人会问,是否可以正常启动应用程序进行测试,然后收集覆盖率,而不使用检测方法来启动应用程序。答案是肯定的。我们怎么做?在这里,我们带你揭开神秘面纱。

   一文带你揭秘如何采取非instrumentation启动app,打造实时统计覆盖率,一键触发覆盖率测试报告。


  在上篇文章,一文带你解决Android app手工测试或者自动化测试覆盖率统计(撸代码版),我们采用了instrumentation的方式去启动app,很多人会问,如果我们不用instrumentation启动app的方式,正常启动app进行测试,然后收集覆盖率可以吗,答案,是可以的,如何做呢,下面带你去揭晓其中的奥秘。

        首先呢,我们还是基于我们的工作,去申请我们的读写的权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  

申请后,我们在安装app的时候一定要给予这两个权限,接下来呢,我们去配置jacoco相关的。

在项目的build.gradle配置相关的,如下配置

apply plugin: 'jacoco'
jacoco {    
toolVersion = "0.8.4"    
description("$buildDir/coverage.exec")   
 reportsDir = file("$buildDir/reports/jacoco")
}

  

        首先我们去添加jacoco的插件,接着呢,我们去规定版本,然后去规定我们的覆盖文件的位置,接下来我们去告知下测试报告的位置。这样我们配置好了依赖,我们需要在debug打开覆盖率。还是同一个的build.gradle配置

 debug {           
/**打开覆盖率统计开关*/
testCoverageEnabled = true
minifyEnabled false //获取代码覆盖率需要设为false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }

  

配置完毕后呢,我们去编写一个jacoco的工具类,用来处理覆盖率文件的写入。具体代码如下
package com.example.studayapp.test;

import android.content.Context;
import android.os.Environment;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class JacocoUtils {
    static String TAG = "JacocoUtils";

    private static String DEFAULT_COVERAGE_FILE_PATH = "coverage.exec";

    /**
     * 生成ec文件
     *
     * @param isnew 是否重新创建exec文件
     */
    public static void generateEcFile(boolean isnew) {
        Log.d(TAG, "生成覆盖率文件: " + DEFAULT_COVERAGE_FILE_PATH);
        OutputStream out = null;
        File mCoverageFilePath = new File(Environment.getExternalStorageDirectory(),DEFAULT_COVERAGE_FILE_PATH);

        try {
            if (isnew && mCoverageFilePath.exists()) {
                Log.d(TAG, "清除旧的exec文件");
                mCoverageFilePath.delete();
            }
            if (!mCoverageFilePath.exists()) {
                mCoverageFilePath.createNewFile();
            }
            out = new FileOutputStream(mCoverageFilePath.getPath(), true);

            //反射:获取org.jacoco.agent.rt.IAgent
            Object agent = Class.forName("org.jacoco.agent.rt.RT")
                    .getMethod("getAgent")
                    .invoke(null);

            //反射:getExecutionData(boolean reset),获取当前执行数据,
            // 以jacoco二进制格式转储当前执行数据
            // getExecutionData(boolean reset),reset如果为true,则之后清除当前执行数据
            out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class)
                    .invoke(agent, false));

        } catch (Exception e) {
            Log.e(TAG, "generateEcFile: " + e.getMessage());
        } finally {
            if (out == null)
                return;
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

  


        我们通过反射:获取org.jacoco.agent.rt.IAgent,然后,反射:getExecutionData(boolean reset),获取当前执行数据,最后写入执行的数据。

        这样我们收集的数据的脚本下好呢,那么我们应该怎么去收集我们的数据呢,之前的文章是通过系统的返回键后去生成的,这样呢,其实在我们实际的工作中呢,是不常见呢,很多的时候呢,我们需要在特定的时候才去触发呢,这里呢,我的做法呢,是在设置中,增加一个按钮,生成测试覆盖率的 按钮来统一处理。

        

<Button                    
android:id="@+id/statistics"
android:layout_width="match_parent" android:layout_height="wrap_content" android:text="统计覆盖率">
</Button>

          在布局文件呢,我们去创建一个按钮,然后呢,我们去在这个按钮去监听点击事件。

    

statistics=(Button) findViewById(R.id.statistics);
        statistics.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                JacocoUtils.generateEcFile(true);
            }
        });

  

    这样呢,我们去安装我们的app的debug版本
安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)第1张

    然后呢,我们去正常测试,最后呢,我们去点击我们的按钮。生成完毕后,如下。

安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)第2张

我们去在项目的目录下,我们去pull下来即可。

adb pull /sdcard/coverage.exec .

     然后,我们在build.gradle创建一个任务。

def coverageSourceDirs = [
        '../app/src/main/java'
]
task jacocoTestReport(type: JacocoReport) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled = true
        html.enabled = true
    }
    classDirectories = fileTree(
            dir: './build/intermediates/javac/debug/classes',
            excludes: ['**/R*.class',

                       '**/*$InjectAdapter.class',
                       '**/*$ModuleAdapter.class',
                       '**/*$ViewInjector*.class'
            ])
    sourceDirectories = files(coverageSourceDirs)
    executionData = files("$buildDir/coverage.exec")

    doFirst {
        new File("$buildDir/intermediates/javac/debug/classes/").eachFileRecurse { file ->
            if (file.name.contains('$$')) {
                file.renameTo(file.path.replace('$$', '$'))
            }
        }
    }
}

  然后点击

安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)第3张

执行完毕后。

安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)第4张

我们看下实际的效果

安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)第5张

可以看到有测试报告,我们打开看下。

安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)第6张

这是最后的覆盖率测试的统计数据。

        这里的数据呢,只是统计到了全量代码的,还有增量代码覆盖率统计,多个覆盖率文件的不同的如何进行组合。后续的文章会持续分享。

安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)第7张

 

免责声明:文章转载自《安卓app功能或自动化测试覆盖率统计(不用instrumentation启动app)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇module/config/module.config.php文件内涵定义Anders谈C# 4.0:新功能和展望下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jacoco统计自动化测试代码覆盖率

一.下载jacoco, ant工具 jacoco: http://www.eclemma.org/jacoco/; ant: http://ant.apache.org 并添加到环境变量; 二.不停jvm, dump出覆盖率数据 在部署的tomcat服务中,/bin/catalina.sh中JAVA_OPTS参数值添加: -javaagent:/data1...

[转]敏捷开发中编写高质量Java代码

本文转自:http://dev.yesky.com/103/11164603.shtml 敏捷开发的理念已经流行了很长的时间,在敏捷开发中的开发迭代阶段中,我们可以通过五个步骤,来有效的提高整个项目的代码质量。 Java项目开发过程中,由于开发人员的经验、Java代码编写习惯,以及缺乏统一的标准和管理流程,往往导致整个项目的代码质量较差,难于维 护,需要...

Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率

Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分。 运行测试并查看代码覆盖率请注意“解决方案资源管理器”中的解决方案的名称。假定解决方案的名称为 CUnitTest。 此解决方案包含测试代码。1)在“解决方案资源管理器”的“...

为什么测试覆盖率如此重要

摘要:就软件质量而言,测试覆盖率是软件测试中的重要指标。接下来一起了解测试范围、测试技术,测试标准以及如何改进它。 由于软件中普遍存在的错误,全世界都见证了一些灾难性事件。2008年在英国希思罗机场5号航站楼开业。 工程师对终端的工作充满信心,这与他们的严格测试标准有关。由于行李处理系统在现实情况运行时陷入了瘫痪,导致系统完全关闭。在接下来的10天里,大约...

推荐系统指标评测——覆盖率与基尼系数的算法与应用

评测指标是衡量推荐系统优劣的数据支持,目前应用广泛的有:点击率、转化率、精准率、召回率、F1值、覆盖率、多样性等等。不同的指标衡量的标准和目的是不一样的...今天就来介绍一下覆盖率和多样性是如何计算和应用的。 更多推荐系统资源,请参考——《推荐系统那点事儿》 覆盖率 如何评价推荐系统的优劣,可以通过推荐的内容覆盖率来衡量。当然它并不是唯一的准则....覆盖...

mock测试及jacoco覆盖率

单元测试是保证项目代码质量的有力武器,但是有些业务场景,依赖的第三方没有测试环境,这时候该怎么做Unit Test呢,总不能直接生产环境硬来吧? 可以借助一些mock测试工具来解决这个难题(比如下面要讲的mockito),废话不多说,直奔主题: 一、准备示例Demo 假设有一个订单系统,用户可以创建订单,同时下单后要检测用户余额(如果余额不足,提醒用户充值...