Пошаговая настройка инструмента покрытия кода JaCoCo для проекта Java с использованием инструментов сборки Maven и Gradle

Прежде всего, инструменты покрытия кода показывают, какой процент вашей кодовой базы покрывается вашими тестами.

В этой статье мы фактически запачкаем руки и добавим покрытие кода в java-проект, который использует инструмент сборки Maven или Gradle.

В следующей статье я кратко объяснил 10 причин, по которым покрытие кода играет решающую роль для качества и успеха продукта в долгосрочной перспективе.



Существует множество инструментов для разных проектов, и мы сосредоточимся на JaCoCo, что означает Ja va Co de Co verage tool.

Инструменты покрытия кода Java

Существуют разные инструменты покрытия кода для разных языков, и я собираюсь сосредоточиться на Java. Самые известные инструменты покрытия кода:

  1. JaCoCo - https://www.jacoco.org/jacoco/index.html
  2. Кобертура - https://cobertura.github.io/cobertura/
  3. Открытый клевер - https://openclover.org/
  4. JCov - https://wiki.openjdk.java.net/display/CodeTools/jcov

Самый последний выпуск JaCoCo был выпущен в октябре 2019 года по сравнению с Cubertura, то есть в 2013 году.

Вот сравнение инструментов покрытия кода Atlassian с их продуктом Atlassian Clover.

Судя по моему опыту работы, JaCoCo кажется наиболее часто используемым инструментом покрытия открытого исходного кода, и мы собираемся сосредоточиться на этом.

Что такое JaCoCo?

JaCoCo - это инструмент покрытия с открытым исходным кодом, который измеряет покрытие

  • инструкции
  • Линии
  • ветви

JaCoCo может инструментировать байт-код Java с помощью java-агента динамически или статически, что делается заранее путем изменения кода, который будет тестироваться, чтобы измерить его охват.

JaCoCo - один из самых активных инструментов покрытия кода с открытым исходным кодом, который поддерживает до Java 14 с самым последним выпуском в 2019 году.

JaCoCo также предлагает интеграцию с системами CI, такими как Jenkins, а также с плагинами для IDE, таких как Eclipse и IntelliJ. Это плагины для JaCoCo на основе Maven и Gradle.

Как настроить JaCoCo с Maven?

Вот что вам нужно для настройки JaCoCo в проекте на основе Maven. Давайте создадим проект весенней загрузки на основе maven, а затем настроим его с помощью инструмента покрытия кода JaCoCo.

Шаг 1. Создайте проект.

Перейдите к https://start.spring.io/, чтобы сгенерировать проект с соответствующей версией инструмента сборки (maven), языком (Java), версией Spring по умолчанию.

Шаг 2. Импортируйте проект в IDE (например, Eclipse).

Вышеупомянутый сгенерирует zip demo.zip файл, и вы можете извлечь его в своей рабочей области. Приступим, я буду использовать Eclipse IDE

cd demo 
mvn eclipse:clean 
mvn eclipse:eclipse

После запуска mvn eclipse:eclipse проект готов к импорту в Eclipse. Щелкните правой кнопкой мыши окно проводника проекта Eclipse IDE (слева) и выберите Import, а в открывшемся окне используйте Existing Projects into Workspace из категории General, как показано ниже.

После нажатия Next вы увидите следующее окно и с помощью Browse... выберите корень вашего проекта в рабочей области. После выбора, если вы успешно выполнили команду mvn eclipse:eclipse, ваш проект должен появиться в списке, как показано ниже.

Шаг 3. Добавьте плагин JaCoCo в pom.xml

Теперь, когда проект добавлен в вашу среду IDE, давайте изменим pom.xml, чтобы добавить конфигурацию JaCoCo.

Как показано выше, все, что нужно для работы покрытия кода JaCoCo, - это добавить плагин JaCoCo в раздел build файла pom.xml вашего проекта.

Шаг 4. Создайте отчет о покрытии кода.

Чтобы создать отчет о покрытии кода, запустите mvn test в проекте, и вы увидите следующие строки, относящиеся к jacoco, ближе к концу консоли.

...
[INFO] --- jacoco-maven-plugin:0.8.5:report (report) @ demo ---
[INFO] Loading execution data file /Users/raf/workspace/demo/target/jacoco.exec
...

Поскольку мы указали плагин JaCoCo <phase>test</phase>, это означает, что на этапе тестирования создается отчет в соответствии с <goal>report</goal> целью выполнения.

Как настроить JaCoCo с Gradle?

Gradle - еще одна альтернатива инструменту сборки Maven. Давайте настроим JaCoCo в проекте Java, который использует Gradle.

Шаг 1. Создайте проект.

Перейдите к https://start.spring.io/, чтобы сгенерировать проект с соответствующей версией инструмента сборки (Gradle), языком (Java), версией Spring по умолчанию.

Теперь нажмите «Создать», чтобы загрузить проект.

Шаг 2. Импортируйте проект в IDE (например, Eclipse).

Давайте обновим build.gradle файл проекта и в plugins включим eclipse, как показано ниже.

plugins {
        id 'org.springframework.boot' version '2.3.1.RELEASE'
        id 'io.spring.dependency-management' version '1.0.9.RELEASE'
        id 'java'
        id 'eclipse'
}

Теперь вы можете запустить команду ./gradlew eclipse в каталоге проекта, чтобы сгенерировать необходимые файлы конфигурации Eclipse.

Затем давайте импортируем проект как Existing Gradle Project, как показано ниже.

На следующем экране укажите, где находится проект, и продолжайте нажимать кнопку «Далее», пока, наконец, не закончите, и проект появится в окне проводника проекта.

Шаг 3. Добавьте конфиги JaCoCo в build.gradle

Заглянув в документацию https://docs.gradle.org/current/userguide/jacoco_plugin.html, чтобы настроить JaCoCo на Gradle, нам нужно добавить jacoco под plugins в файле build.gradle, как показано ниже.

plugins {
        id 'org.springframework.boot' version '2.3.1.RELEASE'
        id 'io.spring.dependency-management' version '1.0.9.RELEASE'
        id 'java'
        id 'eclipse'
        id 'jacoco'
}

Как только вышеперечисленное добавлено, вы можете запускать следующие команды Gradle; однако пока ничего не происходит, поскольку мы еще не настроили JaCoCo.

./gradlew jacocoTestReport 
./gradlew jacocoTestCoverageVerification

Давайте добавим конфигурации сборки JaCoCo в build.gradle

jacoco {
    toolVersion = "0.8.5"
    reportsDir = file("$buildDir/jacoco")
}

Давайте создадим зависимость между test и jacocoTestReport задачами

  1. Когда тест будет запущен, выполните jacocoTestReport перед завершением.
  2. При запуске jacocoTestReport сначала запустите test, а после jacocoTestReport
test {
    finalizedBy jacocoTestReport
}
jacocoTestReport {
    dependsOn test
}

Вот полный build.grdle файл

Gradle build.gradle с покрытием кода JaCoCo

Шаг 4. Создайте отчет о покрытии кода.

Теперь, когда мы выполнили базовую настройку JaCoCo с Gradle, давайте запустим отчет о покрытии, и мы можем сделать это, используя любую из следующих команд

./gradlew test
./gradlew jacocoTestReport

Как показано ниже, при запуске ./gradlew test он также запускает jacocoTestReport из-за указанной выше зависимости

Теперь перейдите к проекту в Eclipse, и в разделе build/jacoco/test/html вы найдете index.html, как показано ниже.

И это в основном отчет о покрытии кода JaCoCo, как показано ниже.

Выше мы рассмотрели настройку JaCoCo с помощью инструментов сборки Maven и Gradle.

Я использовал Eclipse IDE, но это относительно простой процесс, и все, что имеет значение, - это настройка pom.xml и build.gradle

Цели выполнения JaCoCo

JaCoCo имеет 11 целей выполнения, и вы можете увидеть список, запустив mvn jacoco:help, и некоторые из них перечислены ниже.

  1. Команда mvn jacoco:check - проверяет соответствие метрики покрытия.
  2. Команда mvn jacoco:dump - Запросить дамп по TCP / IP у агента JaCoCo, работающего в режиме TCP-сервера.
  3. Команда mvn jacoco:merge - объединяет набор данных выполнения, т.е. jacoco.exec, в один файл.
  4. Команда mvn jacoco:prepare-agent - подготавливает свойство, указывающее на агент времени выполнения JaCoCo, которое может быть передано в качестве аргумента виртуальной машины тестируемому приложению.
  5. Команда mvn jacoco:report - создание отчета о покрытии кода в нескольких форматах (HTML, XML и CSV).

Правила JaCoCo для принудительного применения показателей покрытия кода

Вы можете добавить правила в свою конфигурацию JaCoCo, чтобы обеспечить соблюдение определенных показателей покрытия кода.

Правила могут применяться к следующим типам элементов со списком ограничений.

  • ПУЧОК
  • УПАКОВКА
  • КЛАСС
  • ИСХОДНЫЙ ФАЙЛ
  • МЕТОД

Пределы применяются к следующим счетчикам

  • ИНСТРУКЦИЯ
  • ЛИНИЯ
  • ФИЛИАЛ
  • СЛОЖНОСТЬ
  • МЕТОД
  • КЛАСС

Вы можете определить минимум или максимум для следующих

  • ОБЩЕЕ КОЛИЧЕСТВО
  • COVEREDCOUNT
  • MISSEDCOUNT
  • ПОКРЫТИЕ
  • MISSEDRATIO

Если ничего не указано, то по умолчанию используется следующее

rule element: BUNDLE
limit counter: INSTRUCTION
limit value: COVEREDRATIO

Вот несколько примеров из документации

В этом примере требуется, чтобы общее покрытие инструкций составляло 80%, и нельзя пропускать занятия.

<rules>
  <rule>
    <element>BUNDLE</element>
    <limits>
      <limit>
        <counter>INSTRUCTION</counter>
        <value>COVEREDRATIO</value>
        <minimum>0.80</minimum>
      </limit>
      <limit>
        <counter>CLASS</counter>
        <value>MISSEDCOUNT</value>
        <maximum>0</maximum>
      </limit>
    </limits>
  </rule>
</rules>

Вот пример использования excludes. В этом примере требуется покрытие строки минимум 50% для каждого класса, кроме тестовых.

<rules>
  <rule>
    <element>CLASS</element>
    <excludes>
      <exclude>*Test</exclude>
    </excludes>
    <limits>
      <limit>
        <counter>LINE</counter>
        <value>COVEREDRATIO</value>
        <minimum>50%</minimum>
      </limit>
    </limits>
  </rule>
</rules>

Вот несколько примеров на основе Gradle. Как показано ниже, у вас может быть одно или несколько правил, и каждое правило может по умолчанию применяться к BUNDLE, или вы можете сузить его до CLASS и т. Д., Используя тег element.

jacocoTestCoverageVerification {
  violationRules {
    rule {
      element = 'CLASS'      
      limit {
        minimum = 1
      }
      excludes = [
        'package.ClassA',
        'package.ClassB'
      ]    
    }
    rule { 
      limit {
        counter = 'INSTRUCTIONS' 
        value = 'MISSEDRATIO'
        minimum = 0.3 
      } 
    }
  }
}

Давайте рассмотрим приведенную выше конфигурацию

  • У нас может быть больше одного правила
  • Каждое правило может применяться к типу элемента, т. Е. BUNDLE, PACKAGE, CLASS, SOURCEFILE и METHOD, используя поле element.
  • Предел принимает счетчик, который может быть ИНСТРУКЦИЯ, СТРОКА, ВЕТВЬ, СЛОЖНОСТЬ, МЕТОД или КЛАСС с использованием поля counter.
  • Предел принимает значение TOTALCOUNT, COVEREDCOUNT, MISSEDCOUNT, COVEREDRATIO или MISSEDRATIO с использованием поля value.
  • Предел также принимает minimum или maximum

Если счетчик для лимита не указан, по умолчанию используется ИНСТРУКЦИИ, а если значение не указано, то по умолчанию используется COVEREDRATIO.

Вывод

Спасибо, что прочитали эту статью. Я опубликовал статью о том, как внести свой вклад в развитие открытого исходного кода, если эта тема вас интересует.



Никогда не поздно развить привычки и что-то знать, и вот статья, которую я опубликовал, о вещах, которые я хотел бы знать в начале своей карьеры.



Если вы программист на Java и вас интересует стандарт кодирования, то шаблоны из следующей статьи могут оказаться для вас полезными.



Не стесняйтесь читать мои предыдущие статьи https://medium.com/@rhamedy и подписывайтесь на меня, если я буду читать такие статьи в будущем. Не стесняйтесь связаться со мной в LinkedIn.