我正在尝试生成Jacoco代码覆盖率报告.我已经在我的测试类中使用了AndroidTestCase.
我发现使用testCoverageEnabled为true并使用默认的android -studio默认jacoco,./ gradlew connectedCheck或createDebugCoverageReport创建成功/失败测试用例的百分比,但没有覆盖率报告.
然后我尝试了jacoco {toolVersion"0.7.1.201405082137"}和任务jacocoTestReport(类型: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'
}
}
piotr.wittch..
44
Gradle已经内置了对生成测试覆盖率报告的支持,我们不需要创建任何其他配置或添加任何插件来生成测试覆盖率报告.基本上,我们需要做的唯一的事情就是设置testCoverageEnabled
参数true
的build.gradle
文件,如下所示:
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
接下来,我们可以从CLI执行以下Gradle任务:
./gradlew createDebugCoverageReport
在Windows上,我们可以这样执行:
gradlew.bat createDebugCoverageReport
任务将分析/src/main/java/
目录中的项目代码和目录中的单元测试/src/androidTest/java/
.执行此任务后,我们可以在模块的以下目录中找到测试覆盖率报告:
/build/outputs/reports/coverage/debug/
当我们打开index.html
文件时,我们可以看到来自测试覆盖的可视化报告,可以在Web浏览器中查看.
它看起来如下图所示.
我在Android应用程序中写了一篇关于测试覆盖率报告的文章,并在不久前发布在我的博客上.如果您对该主题感兴趣,可以在以下位置阅读:
https://web.archive.org/web/20171210224809/http://blog.wittchen.biz.pl/test-coverage-report-for-android-application(旧博客,附有用户评论)
http://wittchen.io/2015/06/03/test-coverage-in-android-applications/(新博客,没有用户评论)
更新(Robolectric测试的单元测试覆盖率)
如果您想使用Robolectric编写的单元测试创建测试覆盖率报告并使用Jacoco,Travis CI和Codecov.io生成测试覆盖率报告,请查看我博客上的新文章:
https://web.archive.org/web/20171013015925/http://blog.wittchen.biz.pl/test-coverage-report-with-travis-ci-for-robolectric-tests-on-android/(旧博客)
http://wittchen.io/2017/03/19/unit-test-coverage-report-with-travis-ci-for-robolectric-on-android/(新博客,没有用户评论)
Patrick McLa..
12
我看到你已经使它工作了,但是,有一种更简单的方法来获取单元测试执行数据.我最近也在研究这个问题,实际上我今天早些时候写了一篇文章.
在我的情况下,我不想创建额外的Gradle任务,因为我希望生成报告作为现有工作流的一部分.我也不想明确添加Jacoco插件,因为Google已经为Instrumentation Tests的覆盖率报告重复了Jacoco Ant任务.
除了设置的属性android.jacoco.version
和buildTypes.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
}
这会将单元测试执行数据附加到生成的coverage文件中connectedAndroidTest
,因此您的报告会反映仪器测试和单元测试,而不是单独的每个变体.
请注意,connectedAndroidTest
覆盖coverage文件,在创建报告时将其考虑在内.如果任务testDebug
没有任何更改,并且您运行createDebugCoverageReport
,它将仅反映您的仪器测试覆盖率.因此,请更改单元测试.Linux命令touch
在这里可能很有用,尽管我还没有尝试过.
1> piotr.wittch..:
Gradle已经内置了对生成测试覆盖率报告的支持,我们不需要创建任何其他配置或添加任何插件来生成测试覆盖率报告.基本上,我们需要做的唯一的事情就是设置testCoverageEnabled
参数true
的build.gradle
文件,如下所示:
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
接下来,我们可以从CLI执行以下Gradle任务:
./gradlew createDebugCoverageReport
在Windows上,我们可以这样执行:
gradlew.bat createDebugCoverageReport
任务将分析/src/main/java/
目录中的项目代码和目录中的单元测试/src/androidTest/java/
.执行此任务后,我们可以在模块的以下目录中找到测试覆盖率报告:
/build/outputs/reports/coverage/debug/
当我们打开index.html
文件时,我们可以看到来自测试覆盖的可视化报告,可以在Web浏览器中查看.
它看起来如下图所示.
我在Android应用程序中写了一篇关于测试覆盖率报告的文章,并在不久前发布在我的博客上.如果您对该主题感兴趣,可以在以下位置阅读:
https://web.archive.org/web/20171210224809/http://blog.wittchen.biz.pl/test-coverage-report-for-android-application(旧博客,附有用户评论)
http://wittchen.io/2015/06/03/test-coverage-in-android-applications/(新博客,没有用户评论)
更新(Robolectric测试的单元测试覆盖率)
如果您想使用Robolectric编写的单元测试创建测试覆盖率报告并使用Jacoco,Travis CI和Codecov.io生成测试覆盖率报告,请查看我博客上的新文章:
https://web.archive.org/web/20171013015925/http://blog.wittchen.biz.pl/test-coverage-report-with-travis-ci-for-robolectric-tests-on-android/(旧博客)
http://wittchen.io/2017/03/19/unit-test-coverage-report-with-travis-ci-for-robolectric-on-android/(新博客,没有用户评论)
我看到的唯一问题是在Android Studio上使用JUnit时/ src/androidTest/java不是默认值./ src/test/java是目录.任何线索如何覆盖该目录?
2> Patrick McLa..:
我看到你已经使它工作了,但是,有一种更简单的方法来获取单元测试执行数据.我最近也在研究这个问题,实际上我今天早些时候写了一篇文章.
在我的情况下,我不想创建额外的Gradle任务,因为我希望生成报告作为现有工作流的一部分.我也不想明确添加Jacoco插件,因为Google已经为Instrumentation Tests的覆盖率报告重复了Jacoco Ant任务.
除了设置的属性android.jacoco.version
和buildTypes.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
}
这会将单元测试执行数据附加到生成的coverage文件中connectedAndroidTest
,因此您的报告会反映仪器测试和单元测试,而不是单独的每个变体.
请注意,connectedAndroidTest
覆盖coverage文件,在创建报告时将其考虑在内.如果任务testDebug
没有任何更改,并且您运行createDebugCoverageReport
,它将仅反映您的仪器测试覆盖率.因此,请更改单元测试.Linux命令touch
在这里可能很有用,尽管我还没有尝试过.
什么是`testDebug`以及我在哪里添加它?