简单两步实现 Jacoco+Android 代码覆盖率的接入!(最新最全版)(二)

简介: 简单两步实现 Jacoco+Android 代码覆盖率的接入!(最新最全版)(二)

第二步


定义一个JacocoHelper类,主要是用来生成ec文件,根据使用场景可以放在你需要的地方,比如在APP内提供一个按钮,点击触发生成ec文件,也可以通过命令行的方式触发,具体代码如下:

droid.jarvis.jacoco;
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 JacocoHelper {
    private static final String TAG = "JacocoHelper";
    //ec文件的路径
    private static final String DEFAULT_COVERAGE_FILE_PATH = Environment.getExternalStorageDirectory()
            .getPath() + "/coverage.ec";
    /**
     * 生成ec文件
     *
     * @param isNew 是否重新创建ec文件
     */
    public static void generateEcFile(boolean isNew) {
        OutputStream out = null;
        File mCoverageFilePath = new File(DEFAULT_COVERAGE_FILE_PATH);
        try {
            if (isNew && mCoverageFilePath.exists()) {
                Log.d(TAG, "清除旧的ec文件");
                mCoverageFilePath.delete();
            }
            if (!mCoverageFilePath.exists()) {
                mCoverageFilePath.createNewFile();
            }
            out = new FileOutputStream(mCoverageFilePath.getPath(), true);
            Object agent = Class.forName("org.jacoco.agent.rt.RT")
                    .getMethod("getAgent")
                    .invoke(null);
            if (agent != null) {
                out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class)
                        .invoke(agent, false));
            }
        } catch (Exception e) {
            Log.d(TAG, e.toString());
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

在需要生成ec文件的地方调用下面的方法:

JacocoHelper.generateEcFile(true);

生成测试报告


通过上面的两个步骤,我们就完成了Android项目的Jacoco配置,下面再教大家如何使用它来获取我们手工或者自动化测试的代码覆盖率。


首先我们可以通过Android Studio直接编译安装集成了Jacoco的Debug包,然后再在项目的根目录执行下面的命令完成初始化:

./gradlew jacocoInit

接着我们就可以通过执行自动化测试脚本或者手工来开始我们的用例测试了,测试完成后执行下面的命令:

adb pull /storage/emulated/0/coverage.ec .

把得到的coverage.ec文件放到下图所示的位置,其中code-coverage目录就是执行初始化脚本生成的。

image.png

最后我们在项目根目录执行下面的命令来生成报告:

./gradlew jacocoTestReport

在下图所示位置,我们就可以看到覆盖率的报告了

image.png

注意:


上面的命令中用的是./gradlew,但也可以替换为gradle,两者的区别这里跟大家稍微解释一下,gradlew其实就是对gradle的包装和配置,gradlew是gradle Wrapper,Wrapper的意思就是包装。


因为不是每个人的电脑中都安装了gradle,也不一定安装的版本就是要编译项目需要的版本,那么gradlew里面就配置了项目需要的gradle版本,用户只需要运行gradlew就可以按照配置下载对应的gradle到项目的目录中,仅仅给项目本身用。


报告分析


生成的报告如下:

image.png

点击包名你可以看到类的覆盖率情况

image.png

再点击类名,可以看到具体哪些代码被调用到了,又有哪些代码没有被调用到

image.png


落地场景


我们既然可以根据执行的用例拿到代码的覆盖情况,那么我们就可以基于这个数据来做度量和精准测试了,比如:


1、可以让业务QA或者外包使用覆盖率包来完成功能模块的测试工作,这样就可以根据生成的覆盖率数据来度量测试效果了;


2、另外在做精准测试的时候,我们都需要维护用例和代码的关系库,那么如何得到这个关系呢,这时候我们就可以通过在手工或者UI自动化的方式执行用例的过程中把每个用例跟对应覆盖的代码类文件建立映射关系来完成初期的关系库;

相关文章
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
3月前
|
人工智能 IDE 开发工具
Studio Bot - 让 AI 帮我写 Android 代码
Studio Bot - 让 AI 帮我写 Android 代码
161 1
|
9月前
|
IDE 数据可视化 Java
Android自动生成代码,可视化脚手架之基础信息配置
今天的内容比较简单,大致过一下Electron一些基本用法,虽然说这些比较简单,但又是不得不去了解的,正如做Android的我们,也不是一上来就会的,需要一个循序渐进的过程,下一章,我们再去实际的开发功能。
135 0
|
2月前
|
Ubuntu 网络协议 Linux
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
【Linux】Android平板上远程连接Ubuntu服务器code-server进行代码开发
57 0
|
3月前
|
安全 算法 JavaScript
安卓逆向 -- 关键代码定位与分析技术
安卓逆向 -- 关键代码定位与分析技术
42 0
|
3月前
|
安全 Android开发 数据安全/隐私保护
代码安全之代码混淆及加固(Android)
代码安全之代码混淆及加固(Android)
42 0
|
4月前
|
安全 Java Android开发
Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)
Android App开发之安全加固中反编译、代码混淆、第三方加固以及重签名的讲解及实战(图文解释 简单易懂)
74 0
|
6月前
|
XML Java Android开发
Android 解决使用CocosCreator开发产品上架应用市场代码重复问题
Android 解决使用CocosCreator开发产品上架应用市场代码重复问题
278 0
|
7月前
|
JSON dexposed Java
一文总结 Android 隐私合规代码思路
一文总结 Android 隐私合规代码思路
|
7月前
|
SQL 程序员 Android开发
一行代码,利用 android studio自带的 liveTemplate 快速生成单例模式,程序员偷懒神器
一行代码,利用 android studio自带的 liveTemplate 快速生成单例模式,程序员偷懒神器