android+jacoco多模块项目中统计子模块代码覆盖率

时间:2024-04-09 14:48:38

上一次做了单项目的代码覆盖率统计,但是在实际的项目中,都是已模块开发为主。

研究了一下怎么去统计子模块中的代码覆盖率。

整体思路:

1:既然是多模块的代码覆盖率统计,所以子模块必须也要是用jacoco插桩的方式打开子模块代码覆盖率统计开关;

2:处理子模块与主模块的依赖关系,使子模块也要用debug的方式打包(android正常打包是以release方式);

3:生成jacoco报告。

代码模块结构:

android+jacoco多模块项目中统计子模块代码覆盖率

实践:
一:插桩

1、子模块插桩:

每个模块都需要添加gradle 所以写一个通用的gradle进行插桩

公用的gradle代码:

apply plugin: 'jacoco'
android {
    publishNonDefault true
//    defaultPublishConfig "debug"
    buildTypes {
        debug{
            /**打开覆盖率统计开关**/
            testCoverageEnabled = true
        }
    }
}

android+jacoco多模块项目中统计子模块代码覆盖率

然后在每个需要插桩的子模块中添加公用的gradle:

我这里是(一定要放在library的后面,否则可能会报错):

apply from: '../gradleCommon/build.gradle'

android+jacoco多模块项目中统计子模块代码覆盖率


2、主模块(app):

    主模块没有添加公用的 ,看自己的情况而定吧。

二:子模块的依赖关系
    我们需要将所有的依赖项从: 
compile project(':sharemodule')
的形式改变为 
debugCompile project(path:':sharemodule',configuration:'debug')

        当你把所有的子模块的依赖都用debugCompile方式时,可能会让app中的主类报错,这是因为有的项目中app的主类是继承了子类中的主类,需要将这个依赖改回compile方式依赖就行。

android+jacoco多模块项目中统计子模块代码覆盖率

到这里就可以用gradle中的installDebug 安装app 并用命令启动,开始测试( 可参考上一篇文章),

adb shell am instrument 项目名称/com.xx.xx.xx.JacocoInstrumentation (JacocoInstrumentation 具体路径)

结束测试后拿到ec文件。

根据参考的博客jacocoagent.jar包重复的问题,这个一直没找到好的方法,我这边采用了在写一个公用的gradle 里面只有一句话:

android {
    publishNonDefault true
}

android+jacoco多模块项目中统计子模块代码覆盖率

当需要生成报告时,只需要注解掉build.gradle中的代码即可。

在app中的gradle添加如下代码:

task jacocoTestReport(type: JacocoReport) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."

    reports {
        xml.enabled true
        html.enabled true
    }

    def excludesFilter = ['**/R.class',
                          '**/R$*.class',
                          '**/*$ViewInjector*.*',
                          '**/BuildConfig.*',
                          '**/Manifest*.*',]

    sourceDirectories = files("src")
    classDirectories = fileTree(dir: "./build/intermediates/classes/debug", excludes: excludesFilter)
    project.rootProject.allprojects.each { project ->
        if (project.name != "shell_en_agile" && project.name != "DolphinRecordTest" && project.name != "DolphinBrowserEN") {
            sourceDirectories += files((project.projectDir).toString() + "/src")
            classDirectories += fileTree(dir: (project.projectDir).toString() + "/build/intermediates/classes/debug", excludes: excludesFilter)
        }
    }

    executionData = fileTree(dir: "$buildDir/outputs/coverage.ec")  //需要修改
}

        先在gradle里面执行createDebugCoverageReport 在app/build/outputs里面生成code-coverage文件

将code-coverage/connected里面原始的ec文件删除,并加入刚才生成的coverage.ec文件。

执行gradle jacocoTestReport 生成报告。

有的地方说的不是很明白 看看参考博文吧。

参考:http://blog.csdn.net/cyanolive1/article/details/51782379