androidStudio+jacoco获取应用代码覆盖率报告

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

android stu

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中的源码配置路径是否与本地项目一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值