android studio+jacoco获取代码覆盖率

最近在做android测试时代码的覆盖率,网上查了好长一段时间,遇到了很多坑,在这里简单记录一下,主要参考了这篇文章https://www.jianshu.com/p/671fad23c2ce

jacoco简介

jacoco是Java Code Coverage的缩写,顾名思义,是Java代码覆盖率统计的主流工具之一。在安卓项目的代码覆盖率统计使用了jacoco的离线插桩方式,在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试(单元测试、UI测试或者手工测试等)插过桩的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

android studio+jacoco配置

1.配置build.gradle

使用Android Studio打开项目,打开build.gradle文件,添加以下内容:
添加jacoco插件并设置版本
在这里插入图片描述

apply plugin: 'jacoco' //加载代码覆盖库jacoco

jacoco {
    
    
    toolVersion = "0.7.9" //代码覆盖库jacoco版本号
}

在buildTypes中启用jacoco
在这里插入图片描述

testCoverageEnabled = true

添加生成报告的相关设置
在这里插入图片描述

//代码覆盖率相关配置
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(
            //检测覆盖率的class所在目录(以项目class所在目录为准)
            dir: './build/intermediates/javac/debug/classes',        
            //增加以上目录中不需要检测的文件列表
//            excludes: ['**/R*.class',
//                       '**/*$InjectAdapter.class',
//                       '**/*$ModuleAdapter.class',
//                       '**/*$ViewInjector*.class'
//            ]
    )
    //设置需要检测覆盖率的目录
    sourceDirectories = files(coverageSourceDirs)
    //存储APP运行时产生报告的路径 
    executionData = files("$buildDir/outputs/code-coverage/connected/code_coverage.ec") 
}

2.配置AndroidManifest.xml

确认APP有开启文件读写权限
在这里插入图片描述

3.配置项目代码

在基类Activity中的onDestory中添加生成代码覆盖率的方法

public class BaseActivity extends AppCompatActivity {
    
    

    public static String DEFAULT_COVERAGE_FILE_PATH = Environment.getExternalStorageDirectory()+"/";

    @Override
    protected void onDestroy() {
    
    
        generateCoverageFile();
        super.onDestroy();
    }

    /**
     * 生成executionData
     */
    public void generateCoverageFile() {
    
    
        OutputStream out = null;
        try {
    
    
            out = new FileOutputStream(DEFAULT_COVERAGE_FILE_PATH + "/code_coverage.ec", false); //在SDcard根目录下生产检测报告,文件名自定义
            Object agent = Class.forName("org.jacoco.agent.rt.RT").getMethod("getAgent").invoke(null);
            // 这里之下就统计不到了
            out.write((byte[]) agent.getClass().getMethod("getExecutionData", boolean.class).invoke(agent, false));           
        } catch (Exception e) {
    
                
        } finally {
    
    
            if (out != null) {
    
    
                try {
    
    
                    out.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
    }
}

4.生成代码覆盖率文件

项目build成功后,点击Gradle->app->install->installDebug安装应用
在这里插入图片描述
启动应用,手动点击或者执行自动化脚本,执行完成后退出应用并杀掉进程,使用adb shell命令进入scard目录下,查看是否生成code_coverage.ec文件,如果生成该文件使用adb pull把文件pull到本地

5.生成报告

把pull出的code_coverage.ec文件放到项目app/build/outputs/code-coverage/connected/目录下,如果没有该目录,可手动创建,注意这里的路径要跟上面build.gradle里面写的“executionData”一致
在这里插入图片描述
点击Gradle->app->reporting->jacocoTestReport,会在项目的app\build\reports目录下生成报告
在这里插入图片描述
报告会在项目的以下位置生成
在这里插入图片描述
打开html目录下面的index.html文件即可在网页中查看代码覆盖率
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.常见问题

未生成code_coverage.ec文件
1.检查项目配置是否正确
2.确认获取代码覆盖率的方法是在哪个生命周期中添加的,例如在onDestory中添加则需要操作完成后杀掉应用进程才会生成覆盖率文件
已生成code_coverage.ec文件,但生成的报告中数据为空
检查build.gradle中的配置地址是否与本地项目一致
在这里插入图片描述
报告中无法查看代码执行情况
检查build.gradle中的源码配置路径是否与本地项目一致
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/y954227239/article/details/117450085
今日推荐