Пошаговая настройка инструмента покрытия кода JaCoCo для проекта Java с использованием инструментов сборки Maven и Gradle
Прежде всего, инструменты покрытия кода показывают, какой процент вашей кодовой базы покрывается вашими тестами.
В этой статье мы фактически запачкаем руки и добавим покрытие кода в java-проект, который использует инструмент сборки Maven или Gradle.
В следующей статье я кратко объяснил 10 причин, по которым покрытие кода играет решающую роль для качества и успеха продукта в долгосрочной перспективе.
Существует множество инструментов для разных проектов, и мы сосредоточимся на JaCoCo, что означает Ja va Co de Co verage tool.
Инструменты покрытия кода Java
Существуют разные инструменты покрытия кода для разных языков, и я собираюсь сосредоточиться на Java. Самые известные инструменты покрытия кода:
- JaCoCo - https://www.jacoco.org/jacoco/index.html
- Кобертура - https://cobertura.github.io/cobertura/
- Открытый клевер - https://openclover.org/
- 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
задачами
- Когда тест будет запущен, выполните
jacocoTestReport
перед завершением. - При запуске
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
, и некоторые из них перечислены ниже.
- Команда
mvn jacoco:check
- проверяет соответствие метрики покрытия. - Команда
mvn jacoco:dump
- Запросить дамп по TCP / IP у агента JaCoCo, работающего в режиме TCP-сервера. - Команда
mvn jacoco:merge
- объединяет набор данных выполнения, т.е.jacoco.exec
, в один файл. - Команда
mvn jacoco:prepare-agent
- подготавливает свойство, указывающее на агент времени выполнения JaCoCo, которое может быть передано в качестве аргумента виртуальной машины тестируемому приложению. - Команда
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.