Maven - пример покрытия кода JaCoCo

Изображение://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]