Как получить покрытие для проекта Android с помощью тестов Espresso

Раньше я писал тесты для Android с использованием Robotium и получал покрытие с помощью Эммы.

Недавно я перешел на использование тестов эспрессо, и у меня возникли проблемы с получением покрытия тестов приборостроения. Я могу получить покрытие только для юнит-тестов, которые используют Robolectric. В настоящее время я использую Gradle и Jacoco для этого. Лучший учебник, который я нашел, который помог мне добраться до этой точки, был: https://blog.gouline.net/2015/06/23/code-coverage-on-android-with-jacoco/

Можно ли получить покрытие тестов Эспрессо, в которых используется инструментарий Android?

1 ответ

Решение

Плагин для Android имеет встроенную функцию.

Просто установите testCoverageEnabled параметр для true в вашем build.gradle файл:

android {
   buildTypes {
      debug {
         testCoverageEnabled = true
      }
   }
}

Тогда используйте:

./gradlew connectedCheck

или же

./gradlew createDebugCoverageReport

Он выдаст отчет о тестовом покрытии в каталоге модуля:

/build/outputs/reports/coverage/debug/

Просто откройте index.html

Пример:

Отчет о покрытии в Android с Jacoco (покрытие кода Java)

Плагин Android Gradle>=3.x

добавить новую версию Jacoco в зависимости classpath

проект build.gradle файл

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'org.jacoco:org.jacoco.core:0.8.0'
    }
}

приложение build.gradle файл

// app/build.gradle

apply plugin: 'com.android.application'
apply plugin: 'jacoco'

jacoco {
    toolVersion = '0.8.0'
}

tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true
}

...

Создать задачу, например, jacocoTestReport

task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'createDebugCoverageReport']) {

    reports {
        xml.enabled = true
        html.enabled = true
    }

    def fileFilter = ['**/R.class', '**/R$*.class', '**/BuildConfig.*', '**/Manifest*.*', '**/*Test*.*', '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])
    executionData = fileTree(dir: project.buildDir, includes: [
            'jacoco/testDebugUnitTest.exec', 'outputs/code-coverage/connected/*coverage.ec'
    ])
}

Узнайте больше здесь

Плагин Android Gradle <3.x
Плагин Android Gradle>=3.x