如何找到用于手动测试的android应用程序的代码覆盖率?

时间:2019-06-24 09:47:39

标签: android testing gradle code-coverage jacoco

我想查找Android应用程序(Android Studio + Gradle)的手动测试和自动测试(appium)的代码覆盖范围。

在StackOverflow上已经有一些与此问题相关的问题,但是没有一个对我有用。我已按照以下问题的步骤操作:Android Coverage launch with JaCoCo 在sdcard /中生成的jacoco.exec文件为37个字节,基本上为空。

build.gradle的当前配置:

override fun onCreate() {
        super.onCreate()
        Fabric.with(this, Crashlytics())
        val defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()
        val customExceptionHandler = DefaultExceptionHandler(defaultExceptionHandler)
        Thread.setDefaultUncaughtExceptionHandler(customExceptionHandler)
    }

jacoco.java:

apply plugin: 'com.android.application'

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(
            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('$$', '$'))
            }
        }
    }
}
// this is for the report
...

1 个答案:

答案 0 :(得分:0)

将这些更改放入build.gradle文件中

apply plugin: 'jacoco' 

也添加 testCoverageEnabled true 到buildTypes中的debug {}。 我不能强调testCoverageEnabled的重要性,它会检测文件,如果没有它,您将无法获得覆盖。确保正确添加了这一行。

要正确设置“ build.gradle”,请检查“ build / intermediates”。

向AndroidManifest.xml添加读写外部存储权限

在MainActivity.java的onDestroy()函数中添加以下行:

Log.d("StorageSt", Environment.getExternalStorageState());
        String coverageFilePath = Environment.getExternalStorageDirectory() + File.separator+ "coverage.exec";
        File coverageFile = new File(coverageFilePath);
        super.onStop();
        if(BuildConfig.DEBUG)
        {
            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,true,false);
            }
            catch (Exception e) {}

运行您的应用程序,您将在/ sdcard /中找到coverage.exec。如果模拟器上的覆盖范围是37bytes,请在真实设备上尝试或构建APK,然后将其放入模拟器中进行安装。

然后您可以将coverage.exec拉入计算机,并使用jacoco从中生成HTML报告。