Подтвердить что ты не робот

Покрытие кода 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'
    }
}
4b9b3361

Ответ 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