Ich wollte Code-Coverage-Berichte zu meinen JUnit-Tests in meinem Android-Projekt erstellen, also habe ich das JaCoCo-Gradle-Plugin hinzugefügt. Das ist meine Projektebene build.gradle
Datei:JaCoCo funktioniert nicht mit Robolectric-Tests
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() })
}
}
Es funktioniert großartig von ./gradlew jacocoFullReport
laufen. Aber leider ist die Abdeckung für die Tests, die mit der RobolectricTestRunner
ausgeführt werden, nicht gemeldet (Anweisungen, die offensichtlich in den Tests aufgerufen werden, werden nicht als abgedeckt gemeldet). Tests mit @RunWith
Annotation oder Lauf mit MockitoJUnitTestRunner
Berichterstattung Abdeckung gut.
Jede Hilfe wäre willkommen, um dieses Problem zu beheben.
Update 1: Ich bemerkte, dass ich die RobolectricGradleTestRunner
verwenden sollte. Aber es hat nicht geholfen.
Ich möchte sagen, dass dies auf jeden Fall möglich ist, aber ich habe keine Ahnung, wie man es beheben. Ich habe es geschafft, Code Coverage für Robolectric in einem alten Job zu bekommen, aber das war vor einem Jahr und ich habe keinen Zugriff mehr auf diesen Code. Tut mir leid, ich kann nicht mehr helfen! –
'testCoverageEnabled' in späteren Versionen von Gradle verwendet Jacoco, du musst kein Plugin anwenden. Versuche es ohne das Plugin. –
@NikolaDespotoski Ich glaube, das Setzen von testCoverageEnabled auf "True" funktioniert nur mit Android-Instrumentierungstests, für die ein verbundenes Gerät erforderlich ist. Und das versuche ich mit Robolectric zu vermeiden. – Longi