Изображение://wp-content/uploads/2018/11/Jacoco.png[изображение]
В этой статье мы покажем вам, как использовать JaCoCo Maven плагин для создания отчета о покрытии кода для проекта Java.
Протестировано с
, Maven 3.5.3
, JUnit 5.3.1
, jacoco-maven-плагин 0.8.2
1. Плагин JaCoCo Maven
1.1 Объявите следующий плагин JaCoCo в файле
pom.xml
.
pom.xml
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- attached to Maven test phase -->
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Он будет выполнять задачу «отчета» JaCoCo на этапе тестирования Maven.
2. Модульный тест
2.1 Простой Java-код для возврата сообщения и проверка пустой строки.
MessageBuilder.java
package com.mkyong.examples;
public class MessageBuilder {
public String getMessage(String name) {
StringBuilder result = new StringBuilder();
if (name == null || name.trim().length() == 0) {
result.append("Please provide a name!");
} else {
result.append("Hello " + name);
}
return result.toString();
}
}
2.2 Модульное испытание выше класса.
TestMessageBuilder.java
package com.mkyong.examples;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestMessageBuilder {
@Test
public void testNameMkyong() {
MessageBuilder obj = new MessageBuilder();
assertEquals("Hello mkyong", obj.getMessage("mkyong"));
}
}
2.3 Запустите
mvn test
, отчет о покрытии кода JaCoCo будет сгенерирован в` target/site/jacoco/** `
Терминал
$ mvn clean test [INFO]-------------------------------------------------------[INFO] T E S T S[INFO]-------------------------------------------------------[INFO]Running com.mkyong.examples.TestMessageBuilder[INFO]Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s - in com.mkyong.examples.TestMessageBuilder[INFO][INFO]Results:[INFO][INFO]Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO][INFO][INFO]--- jacoco-maven-plugin:0.8.2:report (report) @ maven-code-coverage ---[INFO]Loading execution data file D:\maven-examples\maven-code-coverage\target\jacoco.exec[INFO]Analyzed bundle 'maven-code-coverage' with 1 classes[INFO]------------------------------------------------------------------------[INFO]BUILD SUCCESS[INFO]------------------------------------------------------------------------[INFO]Total time: 4.164 s[INFO]Finished at: 2018-11-14T16:48:39+08:00[INFO]------------------------------------------------------------------------
2.4 Откройте файл
target/site/jacoco/index.html
, просмотрите отчет о покрытии кода:
Изображение://wp-content/uploads/2018/11/maven-jacoco-code-coverage-report-0.png[изображение]
Изображение://wp-content/uploads/2018/11/maven-jacoco-code-coverage-report-1.png[изображение]
, Зеленый - Код проверен или покрыт.
, Красный - Код не проверен и не покрыт.
, Желтый - Код частично проверен или покрыт.
3. Улучшение юнит-теста
3.1 Добавление еще одного теста для красной линии.
TestMessageBuilder.java
package com.mkyong.examples;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestMessageBuilder {
@Test
public void testNameMkyong() {
MessageBuilder obj = new MessageBuilder();
assertEquals("Hello mkyong", obj.getMessage("mkyong"));
}
@Test
public void testNameEmpty() {
MessageBuilder obj = new MessageBuilder();
assertEquals("Please provide a name!", obj.getMessage(" "));
}
}
Просмотрите отчет еще раз.
Терминал
$ mvn clean test
Целевой/сайт/jacoco/index.html
Изображение://wp-content/uploads/2018/11/maven-jacoco-code-coverage-report-2.png[изображение]
3.2 Добавьте еще один тест для желтой линии, если условие.
TestMessageBuilder.java
package com.mkyong.examples;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestMessageBuilder {
@Test
public void testNameMkyong() {
MessageBuilder obj = new MessageBuilder();
assertEquals("Hello mkyong", obj.getMessage("mkyong"));
}
@Test
public void testNameEmpty() {
MessageBuilder obj = new MessageBuilder();
assertEquals("Please provide a name!", obj.getMessage(" "));
}
@Test
public void testNameNull() {
MessageBuilder obj = new MessageBuilder();
assertEquals("Please provide a name!", obj.getMessage(null));
}
}
Просмотрите отчет еще раз.
Терминал
$ mvn clean test
Целевой/сайт/jacoco/index.html
Изображение://wp-content/uploads/2018/11/maven-jacoco-code-coverage-report-3.png[изображение]
Изображение://wp-content/uploads/2018/11/maven-jacoco-code-coverage-report-4.png[изображение]
Наконец, все линии протестированы, 100% покрытие.
4. Часто задаваемые вопросы
4.1 Убедитесь, что покрытие линий должно соответствовать минимум 90%
pom.xml
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<!-- Add this checking -->
<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>0.9</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
Цель
jacoco: check
прикреплена к фазе проверки Maven.
Терминал
$ mvn clean verify [INFO]Analyzed bundle 'maven-code-coverage' with 1 classes[WARNING]Rule violated for package com.mkyong.examples: lines covered ratio is 0.8, but expected minimum is 0.9
-
Примечание ** Дополнительные примеры JaCoCo check :
4.2 Как обновить стандартную папку вывода JaCoCo?
pom.xml
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<!-- default target/jscoco/site/** -->
<configuration>
<outputDirectory>target/jacoco-report</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
Скачать исходный код
$ git clone https://github.com/mkyong/maven-examples.git $ cd покрытие maven-code
$ mvn clean test # просмотреть отчет в «target/site/jacoco/index.html»
Рекомендации
, https://en.wikipedia.org/wiki/Java code coverage__tools[Wikipedia:
Инструменты покрытия кода Java], JaCoCo Java Coverage Library
, ссылка://maven/jacoco-java-code-cover-maven-example/[JaCoCo in
Eclipse IDE]
ссылка://тег/покрытие кода/[покрытие кода]ссылка://тег/jacoco/[jacoco]ссылка://тег/специалист/[Maven]