Отчеты о покрытии кода JUnit тестами с помощью Maven плагина JaCoCo

Это продолжение туториала по JUnit 5. Введение опубликовано здесь.

Научитесь создавать отчеты о покрытии кода для тестов JUnit с помощью подключаемого модуля JaCoCo Maven.

Оглавление

  1. Плагин JaCoCo Maven

    • Библиотека JaCoCo

    • Конфигурация JaCoCo

  2. Как создать отчет о покрытии кода

  3. Как улучшить процент покрытия кода

  4. Часто задаваемые вопросы

    • Настройка папки назначения отчета

    • Запуск JaCoCo в Eclipse

  5. Вывод

1. Плагин JaCoCo Maven

1.1. JaCoCo

JaCoCo - это библиотека покрытия кода, разработанная командой EclEmma. JaCoCo встраивает агент среды выполнения в JVM, который сканирует пути, пройденные кодом автоматизированных тестов, и создает отчет для этих путей.

Мы можем импортировать отчет JaCoCo в другие более полные инструменты обеспечения качества кода DevOps, такие, как SonarQube и Jenkins. Эти интеграции помогают сделать весь процесс обеспечения качества кода более измеримым и прозрачным для команд разработчиков.

Для интеграции с тестами JUnit отличным вариантом является использование maven плагина для JaCoCo. Проверьте последнюю версию по этой ссылке.

1.2. Конфигурация JaCoCo

Данный фрагмент кода взят из рабочей конфигурации для примеров проекта JUnit5.

pom.xml

<build>
<plugins>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <argLine>
            --illegal-access=permit
        </argLine>
        <testFailureIgnore>true</testFailureIgnore>
        <forkCount>2</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>${surefireArgLine}</argLine> 
    </configuration>
</plugin>

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.7</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <destFile>${project.build.directory}/coverage-reports/jacoco.exec</destFile>
                <propertyName>surefireArgLine</propertyName>
            </configuration>
        </execution>
        <execution>
            <id>default-report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
                <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
            </configuration>
        </execution>
        <execution>
            <id>default-check</id>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <rules>
                    <rule>
                        <element>BUNDLE</element>
                        <limits>
                            <limit>
                                <counter>COMPLEXITY</counter>
                                <value>COVEREDRATIO</value>
                                <minimum>0.70</minimum>
                            </limit>
                        </limits>
                    </rule>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

</plugins>
</build>

Обратите внимание, что цель перед выполнением default-prepare-agent подготавливает агента к настройке и добавлению в командную строку. Этот агент выполняет анализ кода для целей отчетности.

Цель после выполнения default-report гарантирует, что отчеты будут созданы в выходной папке. Ранее инициализированный агент собирает информацию о тестовом покрытии при запуске тестов и создает отчет.

Наконец, созданное изменение командной строки должно быть вставлено в параметр, maven-surefire-plugin как показано в configuration/argLine.

Примечание

Невыполнение этих шагов приведет к ошибке «Skipping JaCoCo execution due to missing execution data file».

Обратитесь к странице параметров проверки JaCoCo, чтобы убедиться, что показатели покрытия кода соблюдаются.

2. Как создать отчет о покрытии кода

Запустите команду mvn package. Команда package вызовет фазу test во время упаковки проекта в jarили warфайл.

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

Команда пакета Maven

mvn package

Обратите внимание на сообщения в выводе на консоль, связанные с покрытием и циклометрической сложностью.

Вывод на Консоль

[INFO] --- jacoco-maven-plugin:0.8.7:prepare-agent (default-prepare-agent) @ JUnit5Examples ---
[INFO] surefireArgLine set to -javaagent:C:\\devsetup\\m2\\org\\jacoco\\org.jacoco.agent\\0.8.7\\org.jacoco.agent-0.8.7-runtime.jar
=destfile=C:\\devsetup\\gitrepo\\Junit5Examples\\JUnit5Examples\\target\\coverage-reports\\jacoco.exec

...
//===TEST EXECUTIONS RESULTS===
...

Please refer to C:\devsetup\gitrepo\Junit5Examples\JUnit5Examples\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.7:report (default-report) @ JUnit5Examples ---
[INFO] Loading execution data file C:\devsetup\gitrepo\Junit5Examples\JUnit5Examples\target\coverage-reports\jacoco.exec
[INFO] Analyzed bundle 'JUnit5Examples' with 1 classes
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ JUnit5Examples ---
[INFO] Building jar: C:\devsetup\gitrepo\Junit5Examples\JUnit5Examples\target\JUnit5Examples-0.0.1-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Теперь мы можем проверить папку target в каталоге сборки проекта.

Папки, созданные в папке target
Папки, созданные в папке target

Теперь перейдите в папку target/site. Папка jacoco находится там. В ней содержится отчет об анализе покрытия кода.

Папка отчетов jacoco
Папка отчетов jacoco

Теперь откройте файл 'target\site\jacoco\index.html' в браузере. Вы должны увидеть аналогичный отчет в браузере. Очевидно, что количество успехов и неудач будет зависеть от конкретного проекта.

Страница отчета JaCoCo
Страница отчета JaCoCo

3. Как улучшить процент покрытия кода

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

Чтобы продемонстрировать это, давайте добавим больше тестов в наш файл AppTest.java.

Раньше у нас была только один тест работы add(). Покрытие нашего кода составляло 25%. Добавим еще два теста. Вновь добавленные тесты должны довести процент покрытия кода до 75%.

AppTest.java

@Test
void testCalAdd()
{
    Assertions.assertEquals( 4 , Calculator.add(2, 2));
}

@Test
void testCalSubtract()
{
    Assertions.assertEquals( 2 , Calculator.subtract(4, 2));
}

@Test
void testCalMultiply()
{
    Assertions.assertEquals( 4 , Calculator.multiply(2, 2));
}

Теперь еще раз проверьте отчет о покрытии.

Улучшенный процент покрытия кода
Улучшенный процент покрытия кода

В отчете также показано, какие методы были выполнены, а какие были пропущены или выполнены частично.

Выполненные классы и методы
Выполненные классы и методы

Щелкните на имена классов, чтобы узнать, какие строки являются частью плана выполнения теста и по-прежнему не выполняются.

Код выполняется или не выполняется в классе
Код выполняется или не выполняется в классе

4. Часто задаваемые вопросы

4.1. Настройка папки назначения отчета

Используйте свойство 'configuration\outputDirectory' maven цели report⁣, чтобы настроить пользовательскую папку назначения для сгенерированного отчета JaCoCo.

Отчет по умолчанию создается в папке 'target/jscoco/site/'.

<execution>
    <id>default-report</id>
    <phase>test</phase>
    <goals>
        <goal>report</goal>
    </goals>
    <configuration>
        <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
        <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
    </configuration>
</execution>

4.2. Запуск JaCoCo в Eclipse

Лучший способ интегрировать JaCoCo с Eclipse - это использовать Eclipse плагин EclEmma.

Вышеупомянутая ссылка содержит самую последнюю информацию для выполнения анализа покрытия кода с помощью JaCoCo в Eclipse IDE.

5. Вывод

В этом руководстве по JaCoCo мы научились настраивать jacoco-maven-plugin в коде приложения и запускать отчет об анализе покрытия кода.

Мы также научились интерпретировать отчет и улучшить процент покрытия, добавив больше тестов.

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

Хорошего изучения!!!