Отчеты о покрытии кода JUnit тестами с помощью Maven плагина JaCoCo
Это продолжение туториала по JUnit 5. Введение опубликовано здесь.
Научитесь создавать отчеты о покрытии кода для тестов JUnit с помощью подключаемого модуля JaCoCo Maven.
Оглавление
Плагин JaCoCo Maven
Библиотека JaCoCo
Конфигурация JaCoCo
Как создать отчет о покрытии кода
Как улучшить процент покрытия кода
Часто задаваемые вопросы
Настройка папки назначения отчета
Запуск JaCoCo в Eclipse
Вывод
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/site
. Папка jacoco
находится там. В ней содержится отчет об анализе покрытия кода.
Теперь откройте файл 'target\site\jacoco\index.html'
в браузере. Вы должны увидеть аналогичный отчет в браузере. Очевидно, что количество успехов и неудач будет зависеть от конкретного проекта.
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 и других параметрах конфигурации, чтобы проверить соответствие метрики покрытия кода.
Хорошего изучения!!!