問題描述
我最近開始在我的一個項目中集成 android-gradle-plugin
1.1.0.該項目使用 robolectric 2.4
來運行單元測試.
I recently started integrating android-gradle-plugin
1.1.0 in one of my projects. The project uses robolectric 2.4
to run unit tests.
這是一個多模塊項目,具有非常復雜的依賴關系(一些模塊依賴于其他模塊).類似的東西:
It's a multi module project with very complex dependencies (Some modules depend on other modules). Something like that:
--> application-module (dependsOn: module1, module2, module-core)
--> module1 (dependsOn: module-core)
--> module2 (dependsOn: module-core)
--> module-core (dependsOn: module3, module4)
--> module3 (library dependencies)
--> module4 (library dependencies)
如需更清晰的圖片,請參閱 jacoco-example 項目.
For a more cleared picture please see jacoco-example project.
我試圖集成 JaCoCo 來為單元測試生成報告,但在我看來它只運行 androidTests
基本上是儀器測試.
I tried to integrate JaCoCo to generate reports for the unit tests, but it seems to me that it runs only androidTests
which are basically instrumentation tests.
經過一些谷歌搜索后,我在 GitHub 和其他文章上遇到了一些項目,但它們主要集中在以前版本的 android-gradle-plugin
或正在使用其他第三方android-unit-test
例如這里這樣的插件.
After some google'ing I've come across a few projects on GitHub and other articles, but they mainly are focused on previous versions of the android-gradle-plugin
or are using other third party plugins like android-unit-test
for example here.
可能是我失去了使用谷歌搜索的能力.但是有人可以指出我可以找到一些關于 android gradle 插件中的新內容以及如何僅針對單元測試運行 jacoco 任務的文檔的方向嗎?
May be I've lost my ability to google. But can somebody point me in a direction where I can find some documentations regarding the new stuff in android gradle plugin and how to run the jacoco task only for unit tests?
更新
采用 nenick 的例子的腳本:
apply plugin: "jacoco"
configurations {
jacocoReport
}
task jacocoReport(dependsOn: 'testDebug') << {
ant {
taskdef(name:'jacocoreport',
classname: 'org.jacoco.ant.ReportTask',
classpath: configurations.jacocoReport.asPath)
mkdir dir: "${buildDir}/test-coverage-report"
mkdir dir: "${buildDir}/reports/jacoco/test/"
jacocoreport {
executiondata = files("${buildDir}/jacoco/testDebug.exec")
structure(name: "${rootProject.name}") {
classfiles {
fileset (dir: "${buildDir}/intermediates/classes/debug") {
//exclude(name: '**/*_*.class')
exclude(name: '**/R.class')
exclude(name: '**/R$*.class')
exclude(name: '**/BuildConfig.class')
}
}
sourcefiles {
fileset dir: "src/main/java"
fileset dir: "${buildDir}/generated/source/buildConfig/debug"
fileset dir: "${buildDir}/generated/source/r/debug"
}
}
xml destfile: "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
html destdir: "${buildDir}/test-coverage-report/"
}
}
}
dependencies {
jacocoReport 'org.jacoco:org.jacoco.ant:0.7.2.201409121644'
}
之后,./gradlew jacocoReport
執行并生成報告,但它顯示 0(零)測試覆蓋率,這是不可能的,因為至少有一半的類都經過測試.
After that the ./gradlew jacocoReport
executes and generates the report, but it shows 0 (zero) test coverage, which is impossible because at least half of all classes are tested.
UPDATE_2
試用了這個示例.將下一個任務添加到我的一個 gradle 構建文件中:
Tried out this example. Adding the next task to one of my gradle build files:
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: "${buildDir}/intermediates/classes/debug",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
sourceDirectories = files("${buildDir.parent}/src/main/java")
additionalSourceDirs = files([
"${buildDir}/generated/source/buildConfig/debug",
"${buildDir}/generated/source/r/debug"
])
executionData = files("${buildDir}/jacoco/testDebug.exec")
reports {
xml.enabled = true
html.enabled = true
}
}
同樣的問題,生成了報告,但代碼覆蓋率仍然為零.
Same issue, the reports are generated, but the code coverage is still zero.
UPDATE_3
UPDATE_2 中的任務似乎有效,但僅適用于帶有 apply plugin: 'com.android.application'
的模塊(報告正確生成).但是對于 android 庫模塊(apply plugin: 'com.android.library'
),報告顯示零覆蓋率,盡管模塊包含的測試比應用程序模塊多.
It seams that the task from UPDATE_2 worked but only for the module with apply plugin: 'com.android.application'
(The reports a generated correctly). But for modules that are android libraries (apply plugin: 'com.android.library'
) the reports show zero coverage, although the modules contain more tests then the application module.
UPDATE_4
創建了一個簡單的示例項目來演示我的問題.目前,如果您運行 ./gradlew jacocoReport
會生成報告,但不會顯示模塊項目的測試覆蓋率.請參閱此 鏈接
Created a simple example project that demonstrates my issue. Currently if you run ./gradlew jacocoReport
the report is generated, but no test coverage is displayed for the module projects. See this link
簡短說明:當測試是 AndroidUnitTests(白化 JUnit 4 和 Robolectric)時,JaCoCo 報告顯示了所有模塊的覆蓋范圍.
Short note: When the tests were AndroidUnitTests (whiteout JUnit 4 and Robolectric) JaCoCo reports showed coverage for all the modules.
有什么想法嗎?
推薦答案
經過一番折騰,我決定創建一個 開源 Gradle 插件 .
After the hassle, I decided to create an open source Gradle plugin for that.
根 build.gradle
buildscript {
repositories {
mavenCentral() // optional if you have this one already
}
dependencies {
classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0'
}
}
apply plugin: 'com.vanniktech.android.junit.jacoco'
然后直接執行
./gradlew jacocoTestReportDebug
它將在調試模式下運行 JUnit 測試,然后在相應的構建目錄中以 XML 和 HTML 形式為您提供 Jacoco 輸出.
It'll run the JUnit tests in Debug Mode and then give you the Jacoco output in XML and HTML form in the corresponding build directory.
它還支持風味.將創建紅色和藍色 2 種口味的任務
It also supports flavors. Having 2 flavors red and blue those tasks would be created
- jacocoTestReportRedDebug
- jacocoTestReportBlueDebug
- jacocoTestReportRedRelease
- jacocoTestReportBlueRelease
這篇關于Jacoco 和單元測試代碼覆蓋率與 android-gradle-plugin >= 1.1的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!