Покрытие кода 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 тестовый файл покрытия в браузере

Удачи!!!

Другие вопросы по тегам