Покрытие кода Jacoco в студии android
Я пытаюсь создать отчет о покрытии кода Jacoco.
Я использовал AndroidTestCase для своих тестовых классов.
Я нашел использование testCoverageEnabled true и используя стандартную jacoco по умолчанию для android -studio,
. /gradlew connectedCheck или createDebugCoverageReport
создайте процент успешных/неудачных тестов, но не получите отчет о покрытии.
Затем я попробовал jacoco {toolVersion "0.7.1.201405082137" } и выполнил задачу jacocoTestReport (тип: JacocoReport, dependsOn: "testDebug" ). Я попытался изменить значение dependOn с помощью различной задачи. Отчет показывает 0 (ноль) охват теста, что невозможно, потому что тестируется по меньшей мере половина всех классов.
За последние пару дней я соблюдал различные принятые ответы о переполнении стека. Результат отрицательный.
Мой gradle файл:
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
}
}
apply plugin: 'com.android.application'
apply plugin: 'jacoco'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "test.gradle.com.myapplicationtestgradle"
minSdkVersion 21
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile(
'proguard-android.txt'), 'proguard-rules.pro'
}
debug {
testCoverageEnabled true
}
}
jacoco {
version "0.7.1.201405082137"
}
packagingOptions {
exclude 'LICENSE.txt'
}
}
jacoco {
toolVersion "0.7.1.201405082137"
}
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
// exclude auto-generated classes and tests
def fileFilter = ['**/R.class', '**/R$*.class',
'**/BuildConfig.*', '**/Manifest*.*',
'android/**/*.*']
def debugTree = fileTree(dir:
"${project.buildDir}/intermediates/classes/debug",
excludes: fileFilter)
def mainSrc = "${project.projectDir}/src/main/java"
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
additionalSourceDirs = files([
"${buildDir}/generated/source/buildConfig/debug",
"${buildDir}/generated/source/r/debug"
])
executionData = fileTree(dir: project.projectDir, includes:
['**/*.exec', '**/*.ec'])
reports {
xml.enabled = true
xml.destination = "${buildDir}/jacocoTestReport.xml"
csv.enabled = false
html.enabled = true
html.destination = "${buildDir}/reports/jacoco"
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('junit:junit:4.11') {
exclude module: 'hamcrest-core'
}
}
Ответы
Ответ 1
Я вижу, что у вас уже есть работа, однако есть более простой способ получения Unit Test данных выполнения. Я недавно изучал это, я фактически сделал полную запись ранее сегодня.
В моей ситуации я не хотел создавать дополнительную задачу Gradle, поскольку я хотел, чтобы отчет был сгенерирован как часть существующего рабочего процесса. Я также не хотел явно добавлять плагин Jacoco, так как Google уже дублирует задачи Jacoco Ant для отчетов о покрытии для контрольных тестов.
В дополнение к настройке свойств android.jacoco.version
и buildTypes.debug.testCoverageEnabled
я добавил следующие аргументы testDebug
JVM для генерации данных выполнения:
project.afterEvaluate {
def append = "append=true"
def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec"
testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile"
createDebugCoverageReport.dependsOn testDebug
}
Это добавляет данные о выполнении Unit Test в файл покрытия, сгенерированный connectedAndroidTest
, поэтому ваш отчет отражает как контрольные тесты, так и тесты единиц, а не каждый вариант отдельно.
Обратите внимание, что connectedAndroidTest
перезаписывает файл покрытия, учитывайте это при создании отчета. Если задача testDebug
не имеет каких-либо изменений, и вы запустите createDebugCoverageReport
, это отразит только ваш охват Testmentation Test. Итак, внесите изменения в свои модульные тесты. Здесь может быть полезной команда Linux touch
, хотя я еще не пробовал.
Ответ 2
Gradle уже имеет встроенную поддержку для генерации отчетов о тестовом покрытии, и нам не нужно создавать никаких дополнительных конфигураций или добавлять какие-либо плагины для генерации отчета о тестовом покрытии. По сути, единственное, что нам нужно сделать, это установить для параметра testCoverageEnabled
значение true
в файле build.gradle
следующим образом:
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
Далее мы можем выполнить следующую задачу Gradle из CLI:
./gradlew createDebugCoverageReport
В Windows мы можем выполнить это так:
gradlew.bat createDebugCoverageReport
Задача проанализирует код нашего проекта в каталоге /src/main/java/
и модульные тесты, помещенные в каталог /src/androidTest/java/
.
После выполнения этой задачи мы можем найти отчет о покрытии тестов в следующем каталоге модуля:
/build/outputs/reports/coverage/debug/
Когда мы открываем файл index.html
, мы видим визуальный отчет из тестового покрытия, который можно просмотреть в веб-браузере.
Это выглядит как на изображении ниже.
![enter image description here]()
Я написал статью об отчете о тестировании в приложении Android и опубликовал ее в своем блоге некоторое время назад. Если вы заинтересованы в этой теме, вы можете прочитать ее по адресу:
Обновление (Покрытие модульных испытаний для испытаний Robolectric)
Если вы хотите создать отчет о покрытии тестов из модульных тестов, написанных с помощью Robolectric, и создать отчет о покрытии тестов с помощью Jacoco, Travis CI и Codecov.io, посмотрите новую статью в моем блоге:
Ответ 3
Я полностью удалил студию Android, android sdk, gradle. Затем переустановите все. Сегодня я полностью удалил андроид-студию, android sdk, gradle. Затем переустановите все. После этого я просто добавил в приложение build.gradle.
debug {
testCoverageEnabled true
}
Затем я запускаю. /gradlew connectedChec. Все работает отлично. Студия Android по умолчанию Jacoco отлично работает для меня. Я думаю, что также можно создать jacocoTestReport Task, а затем создать покрытие кода. Я не знаю, почему gradle и андроид-студия не работали ранее.
Ответ 4
Я исследовал правильный способ получения объединенного отчета о покрытии кода с помощью Jacoco, вы можете проверить его здесь: https://gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba
Я использовал AndroidStudio 2.2.2 с Gradle 3.2 и Android Gradle Плагин 2.2.2