Spring Boot - JaCoCo Code Coverage
Spring Boot - JaCoCo Code Coverage

Обзор

JaCoCo (Java Code Coverage) — это инструмент покрытия Java-кода с открытым исходным кодом, который в основном используется для оценки полноты тестирования Java-программ. Отслеживая код, выполняемый в процессе тестирования, JaCoCo может предоставить различные индикаторы покрытия, которые помогут разработчикам обеспечить качество тестирования кода. Эти метрики включают покрытие инструкций, покрытие ветвей, цикломатическую сложность, покрытие строк, покрытие методов и покрытие классов.

В практических приложениях JaCoCo можно встроить в такие инструменты сборки, как Maven и Ant, а также использовать в качестве подключаемого модуля Eclipse. Кроме того, он поддерживает технологию JavaAgent, которая позволяет отслеживать выполнение Java-программ и собирать данные о покрытии. Отчет о покрытии, созданный JaCoCo, может помочь разработчикам выявить части кода, которые не были протестированы, тем самым помогая им улучшить тестовые сценарии.

JaCoCo предназначен для обеспечения гибкой интеграции с другими инструментами разработки и тестирования, такими как Sonar и Jenkins, для повышения качества кода и управления процессом тестирования. Его принцип состоит в том, чтобы контролировать выполнение кода программы во время выполнения теста и обеспечивать тестовое покрытие кода посредством ряда правил и ограничений. Такие инструменты играют важную роль в повышении полноты и глубины тестирования программного обеспечения.


Как интегрировать

Интеграция JaCoCo в ваш Java-проект обычно включает в себя следующие шаги:

Добавить зависимость JaCoCo

Для проектов Maven,тебе нужно быть внутриpom.xmlДобавить в файлJaCoCoзависимость。Например:

Язык кода:javascript
копировать
<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плагиниполагаться。Например:

Язык кода:javascript
копировать
plugins {
  id 'jacoco' version '0.8.3' // Используйте последнюю версию
  // Другие плагины
}

Настроить плагин JaCoCo

существоватьpom.xmlилиbuild.gradleв файле,нуждаться Настроить плагин Поведение JaCoCo. Сюда входит установка целей охвата, формата и пути для выходных отчетов и т. д.

Например,существоватьMavenизpom.xmlсередина,Возможно, вам потребуется настроить задачи жизненного цикла, такие как подготовка агента и отчет и проверка:

Язык кода:javascript
копировать
<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>

Запускайте тесты и создавайте отчеты о покрытии

  • использоватьMavenизmvn testЗаказили ВОЗGradleизgradle testЗаказ运行你изтест。
  • После завершения тестаJaCoCo создает отчеты о покрытии.,в целомсуществоватьtarget/site/jacocoв каталоге(Для проектов Maven)。

Анализ отчета о покрытии

  • HTML-отчет, созданный Открыть,Анализируйте данные о покрытии.
  • Определите области кода, которые не охвачены,И добавьте соответствующие тестовые варианты использования.

Интеграция в процессы непрерывной интеграции/непрерывного развертывания (CI/CD).(Необязательный):

  • Интегрируйте JaCoCo в свою цепочку инструментов CI/CD, например Jenkins, Travis CI, GitLab CI и т. д.
  • существоватьCI/CDКонфигурациясередина Добавьте шаги в Запускайте тесты и создавайте отчеты о покрытии。

Использование инструментов командной строки JaCoCo(Необязательный):

  • Используйте инструменты командной строки, предоставляемые JaCoCo, для создания отчетов.,нравитьсяjacoco coverage report
  • Инструменты командной строки можно настроить для интеграции с IDE или инструментами сборки.

Обратите внимание, что конкретные шаги интеграции и конфигурация могут различаться в зависимости от используемого инструмента сборки, IDE и настроек проекта. Поэтому рекомендуется ознакомиться с последней официальной документацией JaCoCo.


Далее давайте возьмем Spring Boot в качестве примера, чтобы увидеть, как завершить интеграцию.

pom добавить плагин

Добавьте следующую конфигурацию в pom.xml

Язык кода:javascript
копировать
<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


Code Demo

Язык кода:javascript
копировать
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;
    }
}
Язык кода:javascript
копировать
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.html Содержит весь вывод.

Как видно на изображении, boot-jarcoo — это имя проекта, а com.artisan.service — пакет. Показывает 68 % покрытие кода и 50 % покрытие ветвей.

Нажмите com.artisan.service, чтобы ввести детали.

ShippingService, код внутри покрыт на 68%, а ветка покрыта на 50%.

Введите класс ShippingService.

Открыть calculateShippingfee(int) метод

Здесь Джакоко очень четко показывает различные уровни освещения. Он использует ромбовидные значки разных цветов для обозначения покрытия кода ветки. И используйте цвет фона, чтобы представить покрытие кода линии.

  • Зеленые ромбы указывают на то, что все ветки закрыты.
  • Желтый ромб означает, что код частично закрыт. , какой-то неопытныйтестизветвь。
  • Красный ромб указывает на то, что в течение этого периода ветки не использовались.

Затем добавьте больше кода, чтобы охватить частично покрытую ветку.

Язык кода:javascript
копировать
  @Test
    public void secondRangeWeight() {
        ShippingService shippingService = new ShippingService();
        assertEquals(10, shippingService.calculateShippingFee(4));
    }

Run Maven Build использовать снова clean и test команда, Снова раз в браузере Открыть calculateShippingfee(int) тестовое покрытие метода.

Вы можете видеть, что желтый бриллиант все еще там. Это означает, что мы не рассмотрели сценарии с весами больше 5. Давайте добавим еще один тестовый пример

Язык кода:javascript
копировать
   @Test
    public void lastRangeWeight() {
        ShippingService shippingService = new ShippingService();
        assertEquals(15, shippingService.calculateShippingFee(10));
    }

Вы можете видеть, что все сцены полностью покрыты.


Исключить нерелевантные классы

Обратите внимание, что класс App не очень важен для отчетов о покрытии. В некоторых случаях подобное покрытие может исказить общий отчет о покрытии кода. Чтобы избежать влияния таких нерелевантных классов на покрытие кода, мы можем исключить их с помощью плагина Jacoco.

Язык кода:javascript
копировать
<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

Теперь, предполагая, что мы используем CI/CD для развертывания кода, мы можем захотеть проверить, сколько строк покрытия кода или процент покрытия кода и т. д. были завершены. Для этого нам нужно настроить плагин Jacoco

Язык кода:javascript
копировать
<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 Проверьте это.

Чтобы проверить эту функцию, сначала удалим

Язык кода:javascript
копировать
    @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%,Затем Сновабежит。


Полный ПОМ

Язык кода:javascript
копировать
<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>
boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода