Статьи

Создание отчетов о покрытии кода для модульных и интеграционных тестов с помощью плагина JaCoCo Maven

Когда я начал использовать Java 7, я сразу заметил, что плагин Cobertura Maven не поддерживает его . Это было огромной проблемой для меня, потому что я использовал отчеты о покрытии кода каждый день. Я провел некоторое исследование и нашел библиотеку покрытия кода JaCoCo . Это выглядело интересно, и я решил попробовать.

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

Хотя этот пост был чрезвычайно ценным для меня, он немного расплывчатый. Я чувствовал, что более подробное объяснение использования плагина JaCoCo Maven будет полезным.

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

Требования нашей сборки следующие:

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

Давайте начнем.

Примечание . Пример приложения этого блога основан на примере приложения моего блога под названием « Интеграционное тестирование с Maven» . Если вы еще не читали его, я рекомендую прочитать его перед чтением этого блога.

Настройка плагина JaCoCo Maven

Мы используем плагин JaCoCo Maven для двух целей:

  1. Он предоставляет нам доступ к агенту времени выполнения JaCoCo, который записывает данные покрытия выполнения.
  2. Он создает отчеты о покрытии кода из данных выполнения, записанных агентом времени выполнения JaCoCo.

Мы можем настроить плагин JaCoCo Maven, выполнив следующие действия:

  1. Добавьте плагин JaCoCo Maven в раздел плагинов нашего POM-файла.
  2. Настройте отчет о покрытии кода для модульных тестов.
  3. Настройте отчет о покрытии кода для интеграционных тестов.

Эти шаги описаны более подробно ниже.

Добавление плагина JaCoCo Maven в файл POM

Мы можем добавить плагин JaCoCo Maven в наш POM-файл, добавив следующую декларацию плагина в раздел плагинов :

1
2
3
4
5
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.3.201306030806</version>
</plugin>

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

Настройка отчета о покрытии кода для модульных тестов

Мы можем настроить отчет о покрытии кода для модульных тестов, добавив два выполнения к объявлению плагина. Эти исполнения описаны в следующем:

  1. Первое выполнение создает свойство, которое указывает на агент времени выполнения JaCoCo . Убедитесь, что данные выполнения записаны в файл target / lighting-reports / jacoco-ut.exec . Установите имя свойства в surefireArgLine . Значение этого свойства передается в качестве аргумента VM при запуске наших модульных тестов.
  2. Второе выполнение создает отчет о покрытии кода для модульных тестов после выполнения модульных тестов. Убедитесь, что данные выполнения считываются из файла target / lighting-reports / jacoco-ut.exec и что отчет о покрытии кода записывается в каталог target / site / jacoco-ut .

Соответствующая часть конфигурации нашего плагина выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.3.201306030806</version>
    <executions>
        <!--
           Prepares the property pointing to the JaCoCo runtime agent which
           is passed as VM argument when Maven the Surefire plugin is executed.
       -->
        <execution>
            <id>pre-unit-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                <!--
                   Sets the name of the property containing the settings
                   for JaCoCo runtime agent.
               -->
                <propertyName>surefireArgLine</propertyName>
            </configuration>
        </execution>
        <!--
           Ensures that the code coverage report for unit tests is created after
           unit tests have been run.
       -->
        <execution>
            <id>post-unit-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                <!-- Sets the output directory for the code coverage report. -->
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

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

Настройка отчета о покрытии кода для интеграционных тестов

Мы можем настроить отчет о покрытии кода для интеграционных тестов, добавив два выполнения в объявление плагина. Эти исполнения описаны в следующем:

  1. Это первое выполнение создает свойство, которое указывает на агент времени выполнения JaCoCo . Убедитесь, что данные выполнения записаны в файл target / lighting-reports / jacoco-it.exec . Установите имя свойства в failsafeArgLine . Значение этого свойства передается в качестве аргумента VM при выполнении наших интеграционных тестов.
  2. Создайте выполнение, которое создает отчет о покрытии кода для интеграционных тестов после выполнения интеграционных тестов. Убедитесь, что данные выполнения считываются из файла target / lighting-reports / jacoco-it.exec и что отчет о покрытии кода записывается в каталог target / site / jacoco-it .

Соответствующая часть конфигурации нашего плагина выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.3.201306030806</version>
    <executions>
        <!-- The Executions required by unit tests are omitted. -->
        <!--
           Prepares the property pointing to the JaCoCo runtime agent which
           is passed as VM argument when Maven the Failsafe plugin is executed.
       -->
        <execution>
            <id>pre-integration-test</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                <!--
                   Sets the name of the property containing the settings
                   for JaCoCo runtime agent.
               -->
                <propertyName>failsafeArgLine</propertyName>
            </configuration>
        </execution>
        <!--
           Ensures that the code coverage report for integration tests after
           integration tests have been run.
       -->
        <execution>
            <id>post-integration-test</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <!-- Sets the path to the file which contains the execution data. -->
                <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                <!-- Sets the output directory for the code coverage report. -->
                <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

Вот и все. Теперь мы настроили плагин JaCoCo Maven. Наш следующий шаг — настроить плагин Maven Surefire. Давайте выясним, как мы можем это сделать.

Настройка плагина Maven Surefire

Мы используем плагин Maven Surefire для запуска модульных тестов нашего примера приложения. Поскольку мы хотим создать отчет о покрытии кода для наших модульных тестов, мы должны убедиться, что агент JaCoCo работает при выполнении наших модульных тестов. Мы можем убедиться в этом, добавив значение свойства surefireArgLine в качестве значения параметра конфигурации argLine .

Конфигурация плагина Maven Surefire выглядит следующим образом (необходимые изменения выделены):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.15</version>
    <configuration>
        <!-- Sets the VM argument line used when unit tests are run. -->
        <argLine>${surefireArgLine}</argLine>
        <!-- Skips unit tests if the value of skip.unit.tests property is true -->
        <skipTests>${skip.unit.tests}</skipTests>
        <!-- Excludes integration tests when unit tests are run. -->
        <excludes>
            <exclude>**/IT*.java</exclude>
        </excludes>
    </configuration>
</plugin>

Мы почти закончили. Нам остается только настроить плагин Maven Failsafe. Давайте выясним, как мы можем это сделать.

Настройка Maven Failsafe Plugin

Интеграционные тесты нашего примера приложения выполняются плагином Maven Failsafe. Поскольку мы хотим создать отчет о покрытии кода для наших интеграционных тестов, мы должны убедиться, что агент JaCoCo работает во время наших интеграционных тестов. Мы можем сделать это, добавив значение свойства failsafeArgLine в качестве значения параметра конфигурации argLine .

Конфигурация плагина Maven Failsafe выглядит следующим образом (необходимые изменения выделены):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.15</version>
    <executions>
        <!--
            Ensures that both integration-test and verify goals of the Failsafe Maven
            plugin are executed.
        -->
        <execution>
            <id>integration-tests</id>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
            <configuration>
                <!-- Sets the VM argument line used when integration tests are run. -->
                <argLine>${failsafeArgLine}</argLine>
                <!--
                    Skips integration tests if the value of skip.integration.tests property
                    is true
                -->
                <skipTests>${skip.integration.tests}</skipTests>
            </configuration>
        </execution>
    </executions>
</plugin>

Создание отчетов о покрытии кода

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

Пример приложения этого блога имеет три профиля сборки, которые описаны ниже:

  • Профиль dev используется во время разработки и является профилем по умолчанию для нашей сборки. Когда этот профиль активен, запускаются только модульные тесты.
  • Профиль интеграционного теста используется для запуска интеграционных тестов.
  • Профиль all-tests используется для запуска модульных и интеграционных тестов.

Мы можем создавать различные отчеты о покрытии кода, выполняя следующие команды в командной строке:

  • Команда mvn clean test запускает модульные тесты и создает отчет о покрытии кода для модульных тестов в каталог target / site / jacoco-ut .
  • Команда mvn clean verify -P интеграционный тест запускает интеграционные тесты и создает отчет о покрытии кода для интеграционных тестов в каталог target / site / jacoco-it .
  • Команда mvn clean verify -P all-tests запускает модульные и интеграционные тесты и создает отчеты о покрытии кода для модульных и интеграционных тестов.

Это все на сегодня. Как всегда, пример приложения этого поста доступен на Github .