在Android工作室的Jacoco Code Coverage

我正在尝试生成Jacoco代码覆盖率报告。 我已经为我的测试类使用了AndroidTestCase。

我发现使用testCoverageEnabled为true并使用默认的android -studio默认jacoco,./ gradlew connectedCheck或createDebugCoverageReport创建成功/失败测试用例的百分比,但没有覆盖率报告。

然后我尝试了jacoco {toolVersion“0.7.1.201405082137”}和任务jacocoTestReport(types:JacocoReport,dependsOn:“testDebug”)。 我试图用各种任务来改变dependsOn值。 该报告显示0(零)测试覆盖率,这是不可能的,因为至少有一半的类被测试。

在过去的几天里,我已经按照各种已接受的堆栈溢出答案。 结果是否定的。

我的gradle文件:

buildscript { repositories { mavenLocal() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.0.0' } } apply plugin: 'com.android.application' apply plugin: 'jacoco' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "test.gradle.com.myapplicationtestgradle" minSdkVersion 21 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile( 'proguard-android.txt'), 'proguard-rules.pro' } debug { testCoverageEnabled true } } jacoco { version "0.7.1.201405082137" } packagingOptions { exclude 'LICENSE.txt' } } jacoco { toolVersion "0.7.1.201405082137" } task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") { group = "Reporting" description = "Generate Jacoco coverage reports" // exclude auto-generated classes and tests def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', 'android/**/*.*'] def debugTree = fileTree(dir: "${project.buildDir}/intermediates/classes/debug", excludes: fileFilter) def mainSrc = "${project.projectDir}/src/main/java" sourceDirectories = files([mainSrc]) classDirectories = files([debugTree]) additionalSourceDirs = files([ "${buildDir}/generated/source/buildConfig/debug", "${buildDir}/generated/source/r/debug" ]) executionData = fileTree(dir: project.projectDir, includes: ['**/*.exec', '**/*.ec']) reports { xml.enabled = true xml.destination = "${buildDir}/jacocoTestReport.xml" csv.enabled = false html.enabled = true html.destination = "${buildDir}/reports/jacoco" } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('junit:junit:4.11') { exclude module: 'hamcrest-core' } } 

Solutions Collecting From Web of "在Android工作室的Jacoco Code Coverage"

我看到你已经让它工作了,但是,有一个更简单的方法来获取unit testing执行数据。 我最近也在研究这个问题,实际上我今天早些时候写了一篇文章。

在我的情况下,我不想创建额外的Gradle任务,因为我希望将报告生成为现有工作流的一部分。 我也不想明确添加Jacoco插件,因为Google已经为Instrumentation Tests的覆盖率报告重复了Jacoco Ant任务。

除了设置属性android.jacoco.versionbuildTypes.debug.testCoverageEnabled ,我testDebug JVM参数中添加了以下内容以生成执行数据:

 project.afterEvaluate { def append = "append=true" def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec" testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile" createDebugCoverageReport.dependsOn testDebug } 

这会将Unit Test执行数据附加到connectedAndroidTest生成的coverage文件中,因此您的报告会反映仪器测试和unit testing,而不是单独的每个变体。

请注意, connectedAndroidTest覆盖coverage文件,请在创建报表时将其考虑在内。 如果任务testDebug没有任何更改,并且您运行createDebugCoverageReport ,它将仅反映您的Instrumentation测试覆盖率。 因此,请更改unit testing。 Linux命令touch在这里可能很有用,虽然我还没有尝试过。

Gradle已经内置了对生成测试覆盖率报告的支持,我们不需要创建任何其他配置或添加任何插件来生成测试覆盖率报告。 基本上,我们唯一需要做的就是在build.gradle文件中将testCoverageEnabled参数设置为true ,如下所示:

 android { buildTypes { debug { testCoverageEnabled = true } } } 

接下来,我们可以从CLI执行以下Gradle任务:

 ./gradlew createDebugCoverageReport 

在Windows上,我们可以这样执行:

 gradlew.bat createDebugCoverageReport 

任务将分析/src/main/java/目录中项目的代码和/src/androidTest/java/目录中的unit testing。 执行此任务后,我们可以在模块的以下目录中find测试覆盖率报告:

 /build/outputs/reports/coverage/debug/ 

当我们打开index.html文件时,我们可以看到来自测试覆盖的可视化报告,可以在Web浏览器中查看。

它看起来如下图所示。

在此处输入图像描述

我在Android应用程序中写了一篇关于测试覆盖率报告的文章,并在不久前发布在我的博客上。 如果您对该主题感兴趣,可以在以下位置阅读:

更新(Robolectric测试的unit testing覆盖率)

如果您想使用Robolectric编写的unit testing创​​建测试覆盖率报告并使用JacocoTravis CICodecov.io生成测试覆盖率报告,请查看我博客上的新文章:

我完全删除了android studio,android sdk,gradle。 然后重新安装一切。 今天我完全删除了android studio,android sdk,gradle。 然后重新安装一切。 之后,我刚刚在app build.gradle中添加了内容。

 debug { testCoverageEnabled true } 

然后我运行./gradlew connectedChec。 一切都很完美。 Android工作室默认Jacoco工作正常。 我认为也可以创建一个jacocoTestReport任务,然后创建代码覆盖。我不知道为什么gradle和android studio以前没有工作。

我调查了与Jacoco合并代码覆盖率报告的正确方法,你可以在这里查看: https ://gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba

我使用了带有Gradle 3.2和Android Gradle Plugin 2.2.2的AndroidStudio 2.2.2