Недавно я начал интегрировать android-gradle-plugin
1.1.0 в один из моих проектов. В проекте используется robolectric 2.4
для запуска модульных тестов.
Это проект с несколькими модулями с очень сложными зависимостями (некоторые модули зависят от других модулей). Что-то вроде этого:
--> application-module (dependsOn: module1, module2, module-core)
--> module1 (dependsOn: module-core)
--> module2 (dependsOn: module-core)
--> module-core (dependsOn: module3, module4)
--> module3 (library dependencies)
--> module4 (library dependencies)
Для более очищенного изображения см. проект jacoco-example.
Я попытался интегрировать JaCoCo для создания отчетов для модульных тестов, но мне кажется, что он работает только androidTests
, которые являются в основном инструментальными тестами.
После некоторых google'ing я столкнулся с несколькими проектами в GitHub и другими статьями, но в основном они ориентированы на предыдущие версии android-gradle-plugin
или используют другие сторонние плагины, такие как android-unit-test
например, здесь.
Возможно, я потерял способность Google. Но может кто-нибудь указать мне в направлении, где я могу найти документацию относительно нового материала в плагине android gradle и как запустить задачу jacoco только для модульных тестов?
UPDATE
Принял script из nenick example:
apply plugin: "jacoco"
configurations {
jacocoReport
}
task jacocoReport(dependsOn: 'testDebug') << {
ant {
taskdef(name:'jacocoreport',
classname: 'org.jacoco.ant.ReportTask',
classpath: configurations.jacocoReport.asPath)
mkdir dir: "${buildDir}/test-coverage-report"
mkdir dir: "${buildDir}/reports/jacoco/test/"
jacocoreport {
executiondata = files("${buildDir}/jacoco/testDebug.exec")
structure(name: "${rootProject.name}") {
classfiles {
fileset (dir: "${buildDir}/intermediates/classes/debug") {
//exclude(name: '**/*_*.class')
exclude(name: '**/R.class')
exclude(name: '**/R$*.class')
exclude(name: '**/BuildConfig.class')
}
}
sourcefiles {
fileset dir: "src/main/java"
fileset dir: "${buildDir}/generated/source/buildConfig/debug"
fileset dir: "${buildDir}/generated/source/r/debug"
}
}
xml destfile: "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
html destdir: "${buildDir}/test-coverage-report/"
}
}
}
dependencies {
jacocoReport 'org.jacoco:org.jacoco.ant:0.7.2.201409121644'
}
После этого ./gradlew jacocoReport
выполняет и генерирует отчет, но он показывает 0 (нулевое) охват теста, что невозможно, потому что тестируется по меньшей мере половина всех классов.
UPDATE_2
Пробовал этот пример. Добавление следующей задачи в один из моих файлов сборки gradle:
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: "${buildDir}/intermediates/classes/debug",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
sourceDirectories = files("${buildDir.parent}/src/main/java")
additionalSourceDirs = files([
"${buildDir}/generated/source/buildConfig/debug",
"${buildDir}/generated/source/r/debug"
])
executionData = files("${buildDir}/jacoco/testDebug.exec")
reports {
xml.enabled = true
html.enabled = true
}
}
Такая же проблема, отчеты генерируются, но охват кода по-прежнему равен нулю.
UPDATE_3
Это означает, что задача из UPDATE_2 работала, но только для модуля с apply plugin: 'com.android.application'
(отчеты генерируются правильно). Но для модулей, которые являются библиотеками Android (apply plugin: 'com.android.library'
), отчеты показывают нулевое покрытие, хотя модули содержат больше тестов, чем программный модуль.
UPDATE_4
Создал простой пример, демонстрирующий мою проблему. В настоящее время, если вы запустите ./gradlew jacocoReport
, отчет создается, но для проектов модулей не отображается охват тестирования. См. Ссылку
Краткое примечание:. Когда тесты были AndroidUnitTests (whiteout JUnit 4 и Robolectric), отчеты JaCoCo показали покрытие для всех модулей.
Любые идеи?