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

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

一文带你揭秘如何采取非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 {           <br> /**打开覆盖率统计开关*/            <br>testCoverageEnabled = true            <br>minifyEnabled false //获取代码覆盖率需要设为false            <br>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版本


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


image.png


执行完毕后。


image.png


我们看下实际的效果


image.png


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


image.png


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

 

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

相关文章
|
5月前
|
JSON 测试技术 API
Apipost与Apifox测试功能对决,谁更适合开发者?
在API开发中,调试工具的选择至关重要。本文对比了国产工具Apipost与Apifox的功能差异,涵盖调试能力、环境管理、团队协作、文档生成、自动化测试等方面。Apifox在细节处理、协作支持及生态集成上表现更优,适合复杂项目与团队开发;而Apipost则适合基础调试需求。通过全面评估,开发者可依据项目特点选择合适工具,提升开发效率与质量。
Apipost与Apifox测试功能对决,谁更适合开发者?
|
5月前
|
人工智能 测试技术 项目管理
测试不再碎片化:AI智能体平台「项目资料套件」功能上线!
在实际项目中,需求文档分散、整理费时、测试遗漏等问题常困扰测试工作。霍格沃兹推出AI智能体测试平台全新功能——项目资料套件,可将多个关联文档打包管理,并一键生成测试用例,提升测试完整性与效率。支持套件创建、文档关联、编辑删除及用例生成,适用于复杂项目、版本迭代等场景,助力实现智能化测试协作,让测试更高效、更专业。
|
5月前
|
存储 人工智能 测试技术
用AI提升测试效率:智能体平台的「需求文档管理」功能上线啦!
霍格沃兹测试开发学社推出AI智能体测试平台,全新「需求文档管理」功能助力高效测试准备。集中管理需求文档,支持多种上传方式,智能生成测试用例,提升测试效率与准确性,助力迈向智能化测试新时代。
|
5月前
|
人工智能 自然语言处理 前端开发
深度解析Playwright MCP:功能、优势与挑战,AI如何提升测试效率与覆盖率
Playwright MCP通过AI与浏览器交互,实现自然语言驱动的自动化测试。它降低门槛、提升效率,助力测试工程师聚焦高价值工作,是探索性测试与快速验证的新利器。
|
5月前
|
人工智能 Java 测试技术
单元测试覆盖率的自动控制技术
Jacoco是Java程序覆盖率工具,可以在pom.xml通过配置来自动控制程序的覆盖率
142 5
|
5月前
|
测试技术
自动化测试登录后的功能
在自动化测试的时候,往往许多功能需要登录以后才可以进行操作的,在这里我介绍一种方法,在登录以后将Cookies信息存入本地文件,在测试登录以后操作的时候再从本地文件把信息调出来存入Cookies
110 4
|
7月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文为基于FPGA的4-ASK调制与帧同步系统硬件测试版,采用Verilog实现,包含ILA在线采集与VIO SNR设置模块,支持高斯信道误码统计,适用于通信系统教学与实践。
127 2
|
7月前
|
敏捷开发 运维 数据可视化
DevOps看板工具中的协作功能:如何打破开发、测试与运维之间的沟通壁垒
在DevOps实践中,看板工具通过可视化任务管理和自动化流程,提升开发与运维团队的协作效率。它支持敏捷开发、持续交付,助力团队高效应对需求变化,实现跨职能协作与流程优化。
|
存储 缓存 安全
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
Android14 适配之——现有 App 安装到 Android14 手机上需要注意些什么?
1050 0
|
传感器 物联网 Android开发
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)
635 1

热门文章

最新文章