2016-06-25 3 views
7

Попытка получить покрытие кода на моих тестах Robolectric в Android с использованием Jacoco, но он просто отказывается признать мои тесты Robolectric при создании отчетов.Android - покрытие кода Jacoco игнорирует 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 
      } 
     } 
    } 
} 

С помощью этой установки я могу получить отчеты Coverage, но я получаю покрытие 0%, несмотря на Robolectric тесты в "SRC/тест/Java".

Если добавить следующий код в этот файл:

android { 
    testOptions { 
     unitTests.all { 
      jacoco { 
       includeNoLocationClasses = true 
      } 
     } 
    } 
} 

я получаю следующее сообщение об ошибке, когда Gradle пытается синхронизировать:

Error:No such property: includeNoLocationClasses for class: org.gradle.testing.jacoco.plugins.JacocoTaskExtension_Decorated

Я знаю, что мне нужно иметь Gradle 2.13 до использовать это значение includeNoLocationClasses так в graddle-wrapper.properties я следующее:

#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 1.5

В моих программах Gradle файл я следующее:

//... 

apply from: 'jacoco.gradle' 

//.. 

testOptions { 
    unitTests.returnDefaultValues = true 
} 

//... 

debug { 
    testCoverageEnabled true 
} 

И команды я использую для запуска покрытия является:

./gradlew createDebugCoverageReport

Так что мне интересно, почему я получаю ошибку includeNoLocationClasses, несмотря на использование правильной версии Gradle? И за пределами этого, может быть, я что-то делаю неправильно, когда Якоко не собирает тесты Robolectric в src/test.java?

+0

Я заметил, что этот код в настоящее время не рекомендуется (в Gradle-андроид-плагин 3.x): андроид { testOptions { unitTests.all { jacoco { includeNoLocationClasses = истинные }} }} – Alix

+0

Донал, небольшая помощь. Пока я пытаюсь выполнить конфигурацию, о которой вы говорили, я получаю. ** «Ошибка: не удалось получить неизвестное свойство« android »для корневого проекта« MyProject »типа org.gradle.api.Project.» ** Любая идея, почему! – CoDe

+0

Извините @CoDe Я не помню, и код, над которым я работал, был отложен. Если я смогу вспомнить, я дам вам знать. –

ответ

6

Я не вижу тебя build.gradle полностью, но иметь тот флаг, вы должны:

  1. Использование Gradle2.13+
  2. Использование jacoco0.7.6.201602180812

You» убедитесь, что вы используете gradle надлежащей версии. Итак, я думаю, проблема заключается только в использовании неправильного jacoco.

Упоминание jacoco {toolVersion = "0.7.6.201602180812"} не влияет gradle DSL. Вы должны добавить новую jacoco плагин:

buildscript { 
    repositories { 
     jcenter() 
    } 

    dependencies { 
     classpath 'org.jacoco:org.jacoco.core:...' 
    } 
} 

И вы должны применить плагин, который вы уже делаете:

apply from: 'jacoco' 

После такого configuraiton вам не нужно jacoco {toolVersion = "..."} больше.

Примечание: считайте, что обновили до новых android gradle плагин, 2.2.x уже стабилен. jacoco также имеет новую версию уже 0.7.7.201606060606

еще одно замечание: если вы видите оригинальный вопрос в Android Studio, убедитесь, что вы используете оболочку по умолчанию и убедитесь, что вы заостренный обертка для Gradle 2,13

+0

Спасибо, я не использовал обертку Gradle 2.13 по умолчанию, меняя это, удалил ошибку Jacoco, однако, когда я запускаю команду, чтобы получить тестовое покрытие, Jacoco по-прежнему не собирает мои тесты Robolectric и сообщает о покрытии 0%, несмотря на существующие тесты для классов. –

+0

Можете ли вы запустить его с '--debug' или' --info'? Он может пропустить, если он не может найти файл exec. Поэтому тщательно проверяйте свои пути. –

+0

Когда я добавляю -info в команду, я вижу это: «Выполнение задачи: приложение: connectedDebugAndroidTest» (последняя проверка занимает 0,0 секунд) из-за: Задача не объявила никаких выходов. Не найдено ни одного теста, нечего делать. Но я думаю, что «связанный» означает, что он ищет в androidTest для контрольно-измерительных тестов? У меня нет ни одного из них, только тесты модуля Robolectric в приложении/src/test/java, каждый тест выполняется с помощью моего TestRunner, который расширяет RobolectricGradleTestRunner, и каждый тест аннотируется с помощью @Test - по какой-то причине Jacoco не собирает тесты? –

Смежные вопросы