Покрытие кода Gradle jacoco - затем опубликуйте / покажите в Jenkins

Я пытаюсь настроить покрытие кода для проекта приложения Java.

Название проекта: NewApp

Структура проекта:

  • src / java / ** (исходный код)
  • src / java-test (модульные тесты - Jnuit)
  • test / it-test (интеграционный тест)
  • test / at-tests (приемочные испытания)
  • tomcat / * (содержат сценарии запуска / остановки tomcat)
  • xx / .. etc, необходимые для обычного приложения.

Версия Gradle: 1.6

Окружающая среда: Linux

У меня есть запущенный скрипт сборки gradle, который извлекает зависимости приложения (NewApp) (то есть служебные банки, используемые приложением для процесса сборки) из репозитория артефактов сборки (artifactory / maven для ex) и создает приложение.

На этом этапе я хотел получить покрытие кода с помощью плагина JaCoCo для моего проекта приложения NewApp.

Я следил за документацией для Gradle / Jacoco, но, похоже, он не создает никаких отчетов / ... папку для jacoco и т.д., где я могу найти, что сделал отчет о покрытии Jacoco.

Мои вопросы: 1. Для получения покрытия кода с помощью модульных тестов (Junit) я предполагаю, что все, что мне нужно сделать, это следующее, и это НЕ потребует от меня запуска / остановки tomcat перед запуском модульного теста (тестовая задача, например, "gradle test" ), чтобы получить покрытие кода для / с помощью модульных тестов. Посоветуйте пожалуйста / поправьте. Код (только для части модульного тестирования Gradle jacoco) - я использую:

apply plugin: 'jacoco'

test {
      include 'src/java-test/**'
}

jacocoTestReport {
    group = "reporting"
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled true
        html.enabled true
        csv.enabled false
    }
    //classDirectories = fileTree(dir: 'build/classes/main', include: 'com/thc/**')
    //sourceDirectories = fileTree(dir: 'scr/java', include: 'com/thc/**')
    additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
}

и для интеграционных тестов:

task integrationTest(type: Test) {
        include 'test/java/**'
}

Поскольку jacocoTestReport зависит от тестовой задачи (задач), они будут вызываться сначала, а затем, наконец, jacocoTestReport сообщит о том, что он нашел для покрытия кода.

  1. Чтобы получить покрытие кода для интеграционных тестов, я предполагаю, что я должен сначала запустить tomcat (т.е. перед запуском / вызовом тестовой цели для интеграционных тестов), затем вызвать задачу «gradle integrationTest» или «gradle test», а затем остановить tomcat - чтобы получить код отчет о покрытии. Из других сообщений в блоге я также обнаружил, что нужно настроить переменную JAVA_OPTS для назначения агента jacoco перед запуском tomcat.

например: установка переменной JAVA_OPTS, например:

export JACOCO="-Xms256m -Xmx512m -XX:MaxPermSize=1024m -javaagent:/production/jenkinsAKS/jobs/NewApp/workspace/jacoco-0.6.3.201306030806/lib/jacocoagent.jar=destfile=/production/jenkinsAKS/jobs/NewApp/workspace/jacoco/jacoco.exec,append=true,includes=*"
export JAVA_OPTS="$JAVA_OPTS $JACOCO"
  1. Будучи новичком в Gradle / groovy - я не уверен, какой код мне следует написать в build.gradle (скрипт сборки), чтобы заставить работать вышеуказанные тесты интеграции / модуля, если они включают запуск / остановку tomcat. Если кто-то может предоставить образец сценария для этого, я попробую.

  2. Я не получаю никакого покрытия кода прямо сейчас, когда я публикую покрытие кода Jacoco в Jenkins (с использованием действия Jenkins post build для публикации отчетов Jacoco). На панели инструментов сборки Jenkins отображается 0% покрытия кода (т. Е. Столбцы показывают весь красный цвет, а зеленый - фактическое покрытие кода).

Нужен ваш совет, чтобы разобраться в этом.


person AKS    schedule 07.08.2013    source источник


Ответы (2)


  1. Вопрос: Я предполагаю, что ваши модульные тесты не зависят от tomcat. В этом случае вы правы, вы не должны запускать tomcat заранее.

    Для создания отчета о покрытии необходимо выполнить

    gradle jacocoTestReport
    

    без jacocoTestReport gradle не вызовет jacoco для создания отчетов.

    Еще одна вещь, касающаяся вашего фрагмента. Я предполагаю, что вы изменили основной исходный код по умолчанию на source/java. в этом случае вам не нужно устанавливать additionalSourceDirs.

  2. Интеграционные тесты: Да, вам нужно сначала запустить tomcat или, по крайней мере, вы должны убедиться, что tomcat запущен. Вам стоит взглянуть на Gradle 1.7. В нем есть новое правило упорядочивания задач под названием finalizedBy.

    С этим вы могли бы сделать что-то вроде

    task integrationtests(type: Test) {
      dependsOn startTomcat
      finalizedBy stopTomcat
    }
    

    где start / stopTomcat - это настраиваемые задачи. Если вам нужно оставаться на Gradle 1.6, вам нужно построить цепочку dependsOn:

    stopTomcat -dependsOn-> integrationtests -dependsOn-> startTomcat
    

    Я полагаю, что статья в блоге правильная, у меня нет опыта в этом.

  3. Запуск / остановка Tomcat: вы можете сделать это следующим образом

    task startTomcat() << {
      def tomcatStartScript = "${project.rootDir}/tomcat/startScript"
      tomcatStartScript.execute()
    }
    

    Сценарий остановки может быть написан аналогичным образом. (Кое-что из документа Groovy: Выполнение)

  4. Jenkins & Jacoco: следует исправить при выполнении jacocoTestReport

person Peter    schedule 07.08.2013
comment
Я попробую. Кроме того, мне также нужно убедиться, что у нас есть тесты (особенно интеграционные), иначе отчет по-прежнему будет показывать 0% на некоторых. Таким образом, должны быть модульные / интеграционные тесты, которые я проверю в проекте. Большое спасибо, Пит, за твои объяснения. - person AKS; 07.08.2013
comment
Поскольку я не использую встроенный / предоставленный плагин tomcat Cargo / Gradle и хотел, чтобы папка tomcat, находящаяся в моем исходном коде, запускала экземпляр на сервере, я использовал эту ссылку для запуска / остановки tomcat, но он запускал tomcat с / без & (работать в фоновом режиме) просто зависает, и я никогда не добираюсь до задачи intergrationTest. если я вручную убью запущенный экземпляр tomcat, он продолжится, не пройдёт тесты (поскольку tomcat убит / недоступен), а задача stopTomcat_local тоже не удалась. Я создал следующую структуру зависимостей: stopTomcatLocal - ›зависит от integrationTest -› зависит от startTomcatLocal - person AKS; 13.09.2013

Все заработало.

Gradle 1.7 - загрузите .zip, который содержит двоичные файлы / src и документацию. - Перейдите в папку: если вы разархивируете вышеуказанный .zip в C: \ gradle-1.7 C: \ gradle-1.7 \ samples \ testing \ jacoco \ quickstart

  • Запускаем: gradle build jacocoTestReport

  • После сборки вы увидите новую папку «build». - папка jacoco создается с помощью classdumps и .exec, если вызывается только задача сборки. - создается папка jacoco и jacocoHtml - если обе сборки вызываются jacocoTestReport

повеселись.

Я также заметил, что лучше включать:

следующий раздел в build.gradle

/////
 tasks.withType(Compile) {
 options.debug = true
 options.compilerArgs = ["-g"]
 }
 ////
person AKS    schedule 09.08.2013
comment
Другие полезные ссылки: forum.gradle.org/gradle/topics/ - person AKS; 10.08.2013