Покрытие кода Jacoco в Android Studio со вкусами
Я пытался провести тестовое освещение Jacoco некоторое время. Я пробовал несколько возможных решений, о которых сообщалось в этих темах:
Покрытие тестового кода Android с помощью плагина JaCoCo Gradle
Как получить отчет о покрытии jacoco с помощью плагина Android gradle 0.10.0 или выше?
Я запускаю тесты в эмулированном устройстве, используя genymotion. Вот что я добавил в build.gradle:
apply plugin: 'jacoco'
android{
jacoco {
version "0.7.1.201405082137"
}
buildTypes{
debug{
testCoverageEnabled = true
}
}
}
jacoco {
toolVersion "0.7.1.201405082137"
}
Для запуска я использую что-то вроде
./gradlew clean
./gradlew createFLAVOR_NAMEDebugCoverageReport
Соответствующие сгенерированные файлы / папки:
/build/intermediates/coverage-instrumented-classes
/build/intermediates/jacoco
/build/outputs/code-coverage/connected/flavors/MyFlavor/coverage.ec
Однако, нет ничего @ build / reports / jacoco / test / html / index.html или какого-либо html-отчета о покрытии страницы / кода @ / build / output.
Я также попытался создать отдельную задачу для создания отчета о покрытии:
def coverageSourceDirs = [
'src/main/java',
]
task jacocoTestReport(type: JacocoReport, dependsOn: "connectedAndroidTestFLAVOR_NAMEDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: './build/intermediates/classes/debug',
excludes: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
])
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/jacoco/connectedAndroidTestMyFlavorDebug.exec")
// Bit hacky but fixes https://code.google.com/p/android/issues/detail?id=69174.
// We iterate through the compiled .class tree and rename $$ to $.
doFirst {
new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
Затем ./gradlew очистить и ./gradlew jacocoTestReport. Вывод такой же, как и выше, поэтому нет html-страницы с отчетом о покрытии или любым другим файлом покрытия.
В настоящее время я использую Android Studio v1.0.2 с последней версией Gradle. Я довольно новичок в обучении, поэтому я могу пропустить что-то простое здесь.
Спасибо
2 ответа
Потратив целый день в погоне за этой проблемой, я выяснил, в чем проблема. В отличие от примеров, я видел, что файл, сгенерированный сборкой testDebug, не является файлом.exec @ $ buildDir / jacoco / testDebug.exec.
В моей версии для gradle и studio сгенерированный файл представляет собой файл.ec @ build / output /code-покрытие /connected/flavors/myFlavor/cover.ec
Я не нашел соответствующей информации, связанной с этим. Это может быть недавнее изменение, однако, создав пользовательскую задачу JacocoReport и изменив переменную executeData соответственно, я решил проблему. Вот моя реализация:
task jacocoTestReport(type: JacocoReport) {
def coverageSourceDirs = [
'src/main/java'
]
group = "Reporting"
description = "Generates Jacoco coverage reports"
reports {
xml{
enabled = true
destination "${buildDir}/reports/jacoco/jacoco.xml"
}
csv.enabled false
html{
enabled true
destination "${buildDir}/jacocoHtml"
}
}
classDirectories = fileTree(
dir: 'build/intermediates/classes',
excludes: ['**/R.class',
'**/R$*.class',
'**/BuildConfig.*',
'**/Manifest*.*',
'**/*Activity*.*',
'**/*Fragment*.*'
]
)
sourceDirectories = files(coverageSourceDirs)
additionalSourceDirs = files(coverageSourceDirs)
executionData = files('build/outputs/code-coverage/connected/flavors/smartcompanion/coverage.ec')
}
Отчет о тестировании покрытия с использованием Jacoco со вкусами Android:
Давайте рассмотрим, есть ли у вас вкусы с названиями "бесплатный" и "платный"
Шаг 1: Создайте файл jacoco.gradle в каталоге модулей вашего проекта (по умолчанию приложение), где существует build.gradle, он должен быть рядом с файлом build.gradle. структура каталогов, как показано ниже
приложение> jacoco.gradle
Шаг 2: Вставьте приведенный ниже код в файл, который мы создали на шаге 1. Код имеет понятные комментарии, чтобы понять
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.5.201505241946"
}
project.afterEvaluate {
// Grab all build types and product flavors
def buildTypes = android.buildTypes.collect { type ->
type.name
}
def productFlavors = android.productFlavors.collect { flavor ->
flavor.name
}
// When no product flavors defined, use empty
if (!productFlavors) productFlavors.add('')
//iterate over the flavors
productFlavors.each {
productFlavorName ->
//iterate over build types like debug,release,prod etc.
buildTypes.each {
buildTypeName ->
//sourceName — e.g. freeDebug ,sourcePath — e.g. free/debug
def sourceName, sourcePath
if (!productFlavorName) {
sourceName = sourcePath = "${buildTypeName}"
} else {
sourceName = "${productFlavorName}${buildTypeName.capitalize()}"
sourcePath = "${productFlavorName}/${buildTypeName}"
}
// testTaskName — e.g. testFreeDebugtest task that the coverage task depends on,
def testTaskName = "test${sourceName.capitalize()}UnitTest"
// Create coverage task of form 'testFlavorTypeCoverage' depending on 'testFlavorTypeUnitTest'
task "${testTaskName}Coverage" (type:JacocoReport, dependsOn: "$testTaskName") {
group = "Reporting"
description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build."
classDirectories = fileTree(
dir: "${project.buildDir}/intermediates/classes/${sourcePath}",
excludes: [
'**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/*$ViewBinder*.*',
'**/BuildConfig.*',
'**/Manifest*.*'
]
)
def coverageSourceDirs = [
"src/main/java",
"src/$productFlavorName/java",
"src/$buildTypeName/java"
]
additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")
reports {
//enables and disable the type of file you need
xml.enabled = false
html.enabled = true
}
}
}
}
}
Шаг 3: выполните команды ниже в терминале Android Studio, чтобы собрать приложение
./gradlew чистой сборки
Шаг 4: при успешной сборке выполните приведенную ниже команду, чтобы сгенерировать отчет о тестировании (замените строку "testFreeDebugUnitTestCoverage " на ваш конкретный тип флейвора / сборки, например для команды платной версии будет./gradlew testPaidDebugUnitTestCoverage)
./gradlew testFreeDebugUnitTestCoverage
Шаг 5:
Должно выдать сообщение об успешном завершении в терминале, теперь перейдите в каталог
>app > build > reports >jacoco >${testName} >look for html or xml file report file
- Шаг 6: Теперь вы можете открыть и просмотреть html тестовый файл покрытия в браузере
Удачи!!!