使用JaCoCo启动Android Coverage

Tba*_*ams 1 android code-coverage jacoco eclemma android-gradle-plugin

我们有一个Android应用程序,我们正在使用Gradle/Android Studio构建,并使用JaCoCo为我们的单元测试生成代码覆盖率报告; 这很有效.我们也有兴趣为手动测试生成覆盖率报告; 也就是说,显示任意应用程序启动中涵盖的代码.似乎JaCoCo的前任EclEmma能够做到这一点,但我无法找到任何关于JaCoCo的确认方式(尽管我开始假设它不可能因为缺乏话语).

我尝试过使用Eclipse中的EclEmma只是为了得到一些东西,但是最新的版本因为这个错误而失败了,我也无法立即使旧版本工作.

任何人都可以确认是否可以使用JaCoCo在任意应用程序启动时生成覆盖数据?如同,运行应用程序,按下按钮,关闭应用程序并获得有关您按下的按钮执行了哪些代码的报告.如果没有,是否有另一种工具可以实现这一目标?

谢谢!

小智 6

apply plugin: 'jacoco'
def coverageSourceDirs = [
        '../app/src/main/java'
]

jacoco{
    toolVersion = "0.7.4.201502262128"
}

task jacocoTestReport(type: JacocoReport) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled = true
        html.enabled = true
    }
    classDirectories = fileTree("enter code here"
            dir: './build/intermediates/classes/debug',
            excludes: ['**/R*.class',
                       '**/*$InjectAdapter.class',
                       '**/*$ModuleAdapter.class',
                       '**/*$ViewInjector*.class'
            ])
    sourceDirectories = files(coverageSourceDirs)
    executionData = files("$buildDir/outputs/code-coverage/connected/coverage.exec")
    doFirst {
        new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
            if (file.name.contains('$$')) {
                file.renameTo(file.path.replace('$$', '$'))
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

//这是报告的

 debug {
            testCoverageEnabled true
        }
Run Code Online (Sandbox Code Playgroud)

//这是离线的

将这些添加到build.gradle文件中.

将目录"resources"添加到app> src> main

将jacoco-agent.properties文件添加到资源.

将destfile =/sdcard/coverage.exec写入文件jacoco-agent.properties

现在将此类添加到您的项目中.

public class jacoco {
    static void generateCoverageReport() {
        String TAG = "jacoco";
        // use reflection to call emma dump coverage method, to avoid
        // always statically compiling against emma jar
        String coverageFilePath = "/sdcard/coverage.exec";
        java.io.File coverageFile = new java.io.File(coverageFilePath);
        try {
            Class<?> emmaRTClass = Class.forName("com.vladium.emma.rt.RT");
            Method dumpCoverageMethod = emmaRTClass.getMethod("dumpCoverageData",
                    coverageFile.getClass(), boolean.class, boolean.class);

            dumpCoverageMethod.invoke(null, coverageFile, false, false);
            Log.e(TAG, "generateCoverageReport: ok");
        } catch (Exception  e) {
            new Throwable("Is emma jar on classpath?", e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当你的应用程序是onDestroy时调用该函数

jacoco.generateCoverageReport();

你可以运行你的应用程序.测试时可以使用命令"adb pull /sdcard/coverage.exec yourapp/build/outputs/code-coverage/connected/coverage.exec".

最后一个操作运行gradle任务定义上面有"jacocoTestReport".

好.全部完成.在"yourapp/build/reports/jacoco/jacocoTestReport/html /"中打开index.html.