JaCoCo (Java Code Coverage) — это инструмент покрытия Java-кода с открытым исходным кодом, который в основном используется для оценки полноты тестирования Java-программ. Отслеживая код, выполняемый в процессе тестирования, JaCoCo может предоставить различные индикаторы покрытия, которые помогут разработчикам обеспечить качество тестирования кода. Эти метрики включают покрытие инструкций, покрытие ветвей, цикломатическую сложность, покрытие строк, покрытие методов и покрытие классов.
В практических приложениях JaCoCo можно встроить в такие инструменты сборки, как Maven и Ant, а также использовать в качестве подключаемого модуля Eclipse. Кроме того, он поддерживает технологию JavaAgent, которая позволяет отслеживать выполнение Java-программ и собирать данные о покрытии. Отчет о покрытии, созданный JaCoCo, может помочь разработчикам выявить части кода, которые не были протестированы, тем самым помогая им улучшить тестовые сценарии.
JaCoCo предназначен для обеспечения гибкой интеграции с другими инструментами разработки и тестирования, такими как Sonar и Jenkins, для повышения качества кода и управления процессом тестирования. Его принцип состоит в том, чтобы контролировать выполнение кода программы во время выполнения теста и обеспечивать тестовое покрытие кода посредством ряда правил и ограничений. Такие инструменты играют важную роль в повышении полноты и глубины тестирования программного обеспечения.
Интеграция JaCoCo в ваш Java-проект обычно включает в себя следующие шаги:
Добавить зависимость JaCoCo:
Для проектов Maven,тебе нужно быть внутриpom.xml
Добавить в файлJaCoCoзависимость。Например:
<dependencies>
<!-- Другие зависимости -->
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version> <!-- Используйте последнюю версию -->
<scope>test</scope>
</dependency>
</dependencies>
Для проектов Gradle,тебе нужно быть внутриbuild.gradle
Добавить в файлJaCoCoплагиниполагаться。Например:
plugins {
id 'jacoco' version '0.8.3' // Используйте последнюю версию
// Другие плагины
}
Настроить плагин JaCoCo:
существоватьpom.xml
илиbuild.gradle
в файле,нуждаться Настроить плагин Поведение JaCoCo. Сюда входит установка целей охвата, формата и пути для выходных отчетов и т. д.
Например,существоватьMavenизpom.xml
середина,Возможно, вам потребуется настроить задачи жизненного цикла, такие как подготовка агента и отчет и проверка:
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<!-- Обязательное покрытие -->
<execution>
<id>check-code-coverage</id>
<phase>test</phase>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>BUNDLE</element>
<limits>
<limit>
<counter>INSTRUCTION</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum> <!-- Выполняется не менее 80% кода -->
</limit>
<!-- Можно добавить больше правил -->
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Запускайте тесты и создавайте отчеты о покрытии:
mvn test
Заказили ВОЗGradleизgradle test
Заказ运行你изтест。target/site/jacoco
в каталоге(Для проектов Maven)。Анализ отчета о покрытии:
Интеграция в процессы непрерывной интеграции/непрерывного развертывания (CI/CD).(Необязательный):
Использование инструментов командной строки JaCoCo(Необязательный):
jacoco coverage report
。Обратите внимание, что конкретные шаги интеграции и конфигурация могут различаться в зависимости от используемого инструмента сборки, IDE и настроек проекта. Поэтому рекомендуется ознакомиться с последней официальной документацией JaCoCo.
Далее давайте возьмем Spring Boot в качестве примера, чтобы увидеть, как завершить интеграцию.
Добавьте следующую конфигурацию в pom.xml
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
https://www.jacoco.org/jacoco/trunk/doc/maven.html
package com.artisan.service;
/**
* @author маленький мастер
* @version 1.0
* @mark: show me the code , change the world
*/
public class ShippingService {
public int calculateShippingFee(int weight) {
if (weight <= 0) {
throw new IllegalStateException("Please provide correct weight");
}
if (weight <= 2) {
return 5;
} else if (weight <= 5) {
return 10;
}
return 15;
}
}
package com.artisan.service;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* @author маленький мастер
* @version 1.0
* @mark: show me the code , change the world
*/
public class TestShippingService {
@Test
public void incorrectWeight() {
ShippingService shippingService = new ShippingService();
assertThrows(IllegalStateException.class, () -> shippingService.calculateShippingFee(-1));
}
@Test
public void firstRangeWeight() {
ShippingService shippingService = new ShippingService();
assertEquals(5, shippingService.calculateShippingFee(1));
}
}
Перейдите в Maven, выберите команды очистки и тестирования, затем выберите «Запустить сборку Maven».
После завершения теста target/site/jacoco/index.htm
l Содержит весь вывод.
Как видно на изображении, boot-jarcoo — это имя проекта, а com.artisan.service — пакет. Показывает 68 % покрытие кода и 50 % покрытие ветвей.
Нажмите com.artisan.service, чтобы ввести детали.
ShippingService, код внутри покрыт на 68%, а ветка покрыта на 50%.
Введите класс ShippingService.
Открыть calculateShippingfee(int)
метод
Здесь Джакоко очень четко показывает различные уровни освещения. Он использует ромбовидные значки разных цветов для обозначения покрытия кода ветки. И используйте цвет фона, чтобы представить покрытие кода линии.
Затем добавьте больше кода, чтобы охватить частично покрытую ветку.
@Test
public void secondRangeWeight() {
ShippingService shippingService = new ShippingService();
assertEquals(10, shippingService.calculateShippingFee(4));
}
Run Maven Build использовать снова clean и test команда, Снова раз в браузере Открыть calculateShippingfee(int)
тестовое покрытие метода.
Вы можете видеть, что желтый бриллиант все еще там. Это означает, что мы не рассмотрели сценарии с весами больше 5. Давайте добавим еще один тестовый пример
@Test
public void lastRangeWeight() {
ShippingService shippingService = new ShippingService();
assertEquals(15, shippingService.calculateShippingFee(10));
}
Вы можете видеть, что все сцены полностью покрыты.
Обратите внимание, что класс App не очень важен для отчетов о покрытии. В некоторых случаях подобное покрытие может исказить общий отчет о покрытии кода. Чтобы избежать влияния таких нерелевантных классов на покрытие кода, мы можем исключить их с помощью плагина Jacoco.
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>com/artisan/App.class</exclude>
</excludes>
</configuration>
...
</plugin>
</plugins>
https://www.eclemma.org/jacoco/trunk/doc/report-mojo.html#excludes
Перекомпилируйте тест и получите отчет
Теперь, предполагая, что мы используем CI/CD для развертывания кода, мы можем захотеть проверить, сколько строк покрытия кода или процент покрытия кода и т. д. были завершены. Для этого нам нужно настроить плагин Jacoco
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>90%</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
В этом исполнении мы добавили правило. Правила заключаются в том, что для ПАКЕТА значение должно быть LINE, а покрытие LINE должно составлять минимум 90%.
Перейти к Мавен, выберите clean и verify команду и выберите Run Maven Build Проверьте это.
Чтобы проверить эту функцию, сначала удалим
@Test
public void secondRangeWeight() {
ShippingService shippingService = new ShippingService();
assertEquals(10, shippingService.calculateShippingFee(4));
}
@Test
public void lastRangeWeight() {
ShippingService shippingService = new ShippingService();
assertEquals(15, shippingService.calculateShippingFee(10));
}
Снова выбирать clean и verify команду и выберите Run Maven Build Проверьте это.
Вы можете видеть, что это терпит неудачу. Причина ясно показывает, что правило «Покрытие линии равно 0,62, но ожидаемый минимум 0,90» нарушается.
Теперь давайте обновим LINE Минимальная стоимость покрытия составляет 60%,Затем Сновабежит。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>boot2</artifactId>
<groupId>com.artisan</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>boot-jarcoo</artifactId>
<packaging>jar</packaging>
<name>boot-jarcoo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>com/artisan/App.class</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule>
<element>PACKAGE</element>
<limits>
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>60%</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>