Я хотел генерировать отчеты о покрытии кода на своих тестах JUnit в моем проекте Android, поэтому я добавил плагин JaCoCo gradle. Это мой уровень проекта build.gradle
файл:JaCoCo не работает с Robolectric test
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() })
}
}
Он отлично работает, запустив ./gradlew jacocoFullReport
. Но, к сожалению, охват не сообщается для тестов, которые запускаются с RobolectricTestRunner
(инструкции, которые, очевидно, вызывают в тестах, не сообщаются как покрытые). Тесты без @RunWith
аннотации или запустите с MockitoJUnitTestRunner
отчетный отчет просто отлично.
Любая помощь была бы оценена, чтобы исправить эту проблему.
Обновление 1: Я заметил, что должен использовать RobolectricGradleTestRunner
. Но это не помогло.
Я хочу сказать, что это, безусловно, возможно, но я понятия не имею, как это исправить. Мне удалось получить покрытие кода, работающее на Robolectric на старой работе, но это было год назад, и у меня больше нет доступа к этому коду. Извините, я не могу больше помочь! –
'testCoverageEnabled' в более поздних версиях gradle использует Jacoco, вам не нужно применять плагин. Попробуйте без плагина. –
@NikolaDespotoski Я считаю, что установка testCoverageEnabled to true работает только с андроидными инструментальными тестами, для которых требуется подключенное устройство. И этого я пытаюсь избежать, используя Robolectric. – Longi