Chciałem generować raporty dotyczące pokrycia kodu na moich testach JUnit w moim projekcie Android, więc dodałem wtyczkę JaCoCo gradle. To jest mój poziom projekt build.gradle
file:JaCoCo nie działa z testami Robolectric
apply plugin: 'jacoco'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0-beta6'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
subprojects { prj ->
apply plugin: 'jacoco'
jacoco {
toolVersion '0.7.6.201602180812'
}
task jacocoReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
group = 'Reporting'
description = 'Generate Jacoco coverage reports after running tests.'
reports {
xml {
enabled = true
destination "${prj.buildDir}/reports/jacoco/jacoco.xml"
}
html {
enabled = true
destination "${prj.buildDir}/reports/jacoco"
}
}
classDirectories = fileTree(
dir: 'build/intermediates/classes/debug',
excludes: [
'**/R*.class',
'**/BuildConfig*',
'**/*$$*'
]
)
sourceDirectories = files('src/main/java')
executionData = files('build/jacoco/testDebugUnitTest.exec')
doFirst {
files('build/intermediates/classes/debug').getFiles().each { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
}
jacoco {
toolVersion '0.7.6.201602180812'
}
task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') {
group = 'Reporting'
description = 'Generates an aggregate report from all subprojects'
//noinspection GrUnresolvedAccess
dependsOn(subprojects.jacocoReport)
additionalSourceDirs = project.files(subprojects.jacocoReport.sourceDirectories)
sourceDirectories = project.files(subprojects.jacocoReport.sourceDirectories)
classDirectories = project.files(subprojects.jacocoReport.classDirectories)
executionData = project.files(subprojects.jacocoReport.executionData)
reports {
xml {
enabled = true
destination "${buildDir}/reports/jacoco/full/jacoco.xml"
}
html {
enabled = true
destination "${buildDir}/reports/jacoco/full"
}
}
doFirst {
//noinspection GroovyAssignabilityCheck
executionData = files(executionData.findAll { it.exists() })
}
}
Działa świetnie, uruchamiając ./gradlew jacocoFullReport
. Ale niestety zakres nie jest zgłaszany dla testów, które są uruchamiane z RobolectricTestRunner
(instrukcje, które są oczywiście wywoływane w testach, nie są zgłaszane jako zakryte). Testy bez adnotacji i uruchamiania z raportem są w porządku.
Każda pomoc będzie doceniana w celu rozwiązania tego problemu.
Aktualizacja 1: Zauważyłem, że powinienem używać RobolectricGradleTestRunner
. Ale to nie pomogło.
Chcę powiedzieć, że jest to zdecydowanie możliwe, ale nie mam pojęcia, jak to naprawić. Udało mi się uzyskać zasięg kodu pracujący dla Robolectric na starej posadzie, ale to było rok temu i już nie mam już dostępu do tego kodu. Przepraszam, że nie mogę pomóc! –
'testCoverageEnabled' w późniejszych wersjach gradle używa Jacoco, nie musisz stosować wtyczki. Spróbuj bez wtyczki. –
@NikolaDespotoski Uważam, że ustawienie testCoverageEnabled na true działa tylko z testami oprzyrządowania Android, które wymagają podłączonego urządzenia. I tego staram się unikać, używając Robolectric. – Longi