Андроид - 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 полностью, но чтобы иметь этот флаг, вы должны:

  1. использовать ш 2.13+
  2. использовать 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