Андроид - Jacoco покрытия кода игнорирует тесты Robolectric
пытается получить покрытия кода на моих тестах с использованием Robolectric в Jacoco Android, но он просто отказывается признать мои тесты Robolectric при создании отчета.
мой jacoco.файл Gradle выглядит следующим образом:
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.6.201602180812"
}
project.afterEvaluate {
android.applicationVariants.all { variant ->
def name = variant.name
def testTaskName = "test${name.capitalize()}UnitTest"
tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: "$testTaskName") {
group = "Reporting"
description = "Generate Jacoco coverage reports for the ${name.capitalize()} build."
classDirectories = fileTree(
dir: "${project.buildDir}/intermediates/classes/${name}",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
sourceDirectories = files(['src/main/java'].plus(android.sourceSets[name].java.srcDirs))
executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")
reports {
xml.enabled = true
html.enabled = true
}
}
}
}
С этой настройкой я могу получить отчеты о покрытии, но я получаю 0% покрытия, несмотря на наличие Робоэлектрических тестов в "src/test/java".
если я добавлю в этот файл следующий код:
android {
testOptions {
unitTests.all {
jacoco {
includeNoLocationClasses = true
}
}
}
}
Я получаю следующую ошибку, когда Gradle пытается синхронизировать:
Error: нет такого свойства: includeNoLocationClasses для класса: орг.градля.тестирование.jacoco.подключаемый модуль.JacocoTaskExtension_Decorated
Я знаю, что мне нужно иметь Gradle 2.13, чтобы использовать это значение includeNoLocationClasses так в graddle-wrapper.свойства у меня следующие:
#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions-snapshots/gradle-2.13-20160228000026+0000-all.zip
Я уверен, что я запускаю Gradle 2.13 с Android plugin версии 1.5
в моем файле Gradle приложений у меня есть следующий:
//...
apply from: 'jacoco.gradle'
//..
testOptions {
unitTests.returnDefaultValues = true
}
//...
debug {
testCoverageEnabled true
}
и команда, которую я использую для запуска покрытия:
./ gradlew createDebugCoverageReport
поэтому мне интересно, почему я получаю ошибку includeNoLocationClasses, несмотря на использование правильной версии Gradle? И снаружи, что может быть я делаю что-то неправильно, где Jacoco не поднимая Robolectric тесты в src/тест.Ява ?
1 ответов
Я тебя не вижу build.gradle
полностью, но чтобы иметь этот флаг, вы должны:
- использовать ш
2.13+
- использовать jacoco
0.7.6.201602180812
вы уверены, что вы используете ш правильная версия. Поэтому, я думаю, проблема только в использовании wrong jacoco.
отметить jacoco {toolVersion = "0.7.6.201602180812"}
не влияет ш DSL. Вы должны добавить новые jacoco плагин:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'org.jacoco:org.jacoco.core:...'
}
}
и вы должны применить плагин, который вы уже делаете:
apply from: 'jacoco'
после такой конфигурации вам не нужно jacoco {toolVersion = "..."}
больше.
Примечание: подумайте об обновлении до более нового ш для Android плагин 2.2.x
уже стабильно. jacoco также имеет более новую версию уже 0.7.7.201606060606
еще одно примечание: если вы видите оригинальную проблему в Android Studio, проверьте, что вы используете обертку по умолчанию и убедитесь, что вы указали обертку для gradle 2.13