Статьи

Отчеты о модульных и интеграционных испытаниях для проектов Maven в SonarQube

Начиная с SonarQube 4.2. отчет о тестировании не генерируется плагином Sonar Maven во время сборки Maven (см . сообщение в блоге SonarQube ). Поэтому отчет о тестировании должен быть сгенерирован другим плагином, прежде чем плагин Sonar Maven соберет информацию для сервера SonarQube. Здесь может помочь плагин Jacoco Maven. Имеется возможность генерировать отчет о тестировании, понятный для SonarQube. Плагин Jacoco Maven идет еще дальше, у него есть возможность генерировать протокол испытаний для интеграционных испытаний.

В следующих разделах представлено решение, которое соответствует следующим критериям:

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

Дорожная карта для следующего раздела заключается в том, что сначала показана структура проекта Maven для разделения юнит-тестов и интеграционных тестов. Затем показана конфигурация проекта Maven для отдельных прогонов модульных тестов и интеграционных тестов. После этого мы рассмотрим конфигурацию проекта Maven для генерации отчета о тестировании, разделенного на модульное тестирование и интеграционный тест. В конце, конфигурация SonarQube показана для визуализации отчета о тестировании на панели инструментов SonarQube.

Структура проекта Maven

Сначала мы рассмотрим, как выглядит структура проекта Maven по умолчанию для проекта с одним модулем.

1
2
3
4
5
6
7
8
9
my-app
├── pom.xml
├── src
│   ├── main
│   │   └── java
│   │       └──
│   └── test
│       └── java
│           └──

Каталог src / main / java содержит производственный исходный код, а каталог src / test / java содержит исходный код теста. Мы могли бы поместить модульные тесты и интеграционные тесты вместе в этом каталоге. Но мы хотим разделить эти два типа тестов в отдельных каталогах. Поэтому мы добавляем новый каталог с именем src / it / java. Затем модульные тесты помещаются в каталог src / test / java, а интеграционные тесты помещаются в каталог src / it / java, поэтому новая структура проекта выглядит следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
my-app
├── pom.xml
├── src
│   ├── it
│   │   └── java
│   │       └──
│   ├── main
│   │   └── java
│   │       └──
│   └── test
│       └── java
│           └──

Модульные и интеграционные тестовые прогоны

К счастью, конфигурация запуска модульного теста является частью конфигурации проекта Maven по умолчанию. Maven запускает эти тесты автоматически, если выполнены следующие критерии:

  • Тесты находятся в каталоге src / test / java и
  • имя класса теста начинается с Test или заканчивается Test или TestCase.

Maven запускает эти тесты во время теста фазы жизненного цикла сборки Maven .

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

  • интеграционные тесты хранятся в каталоге src / it / java и
  • имя класса интеграционного теста либо начинает IT, либо заканчивается IT или ITCase и
  • Интеграционные тесты выполняются во время фазы тестирования жизненного цикла сборки в Maven .

Во-первых, Maven должен знать, что он должен включить каталог src / it / java в путь своего тестового класса. Здесь может помочь плагин Build Helper Maven. Он добавляет каталог src / it / java в путь к тестовому классу.

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
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.8</version>
  <executions>
    <execution>
      <id>add-test-source</id>
      <phase>process-test-sources</phase>
      <goals>
        <goal>add-test-source</goal>
      </goals>
      <configuration>
        <sources>
          src/it/java
        </sources>
      </configuration>
     </execution>
     <execution>
       <id>add-test-resources</id>
       <phase>generate-test-resources</phase>
       <goals>
         <goal>add-test-resource</goal>
       </goals>
       <configuration>
          <resources>
            <resource>
              src/it/resources
            </resource>
          </resources>
       </configuration>
     </execution>
   </executions>
 </plugin>

Приведенный выше фрагмент кода должен быть вставлен в раздел <project> <build> <plugins> в корневом каталоге проекта.

Жизненный цикл сборки Maven содержит этап, называемый интеграционным тестом. На этом этапе мы хотим запустить интеграционный тест. Поэтому мы привязываем подключаемый модуль Maven Failsafe к тесту фазовой интеграции:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.13</version>
  <configuration>
    <encoding>${project.build.sourceEncoding}</encoding>
  </configuration>
  <executions>
    <execution>
      <id>failsafe-integration-tests</id>
      <phase>integration-test</phase>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Опять же, приведенный выше фрагмент кода также должен быть вставлен в раздел <project> <build> <plugins> в корневом каталоге проекта. Затем Maven Failsafe Plugin автоматически запускает интеграционные тесты, когда имя их класса начинается с IT или заканчивается IT или ITCase.

Генерация протокола испытаний

Мы хотим использовать плагин Jacoco Maven для создания отчета о тестировании. Он должен сгенерировать два отчета о тестировании, один для модульного теста и один для интеграционных тестов. Таким образом, плагин имеет два отдельных агента, которые должны быть подготовлены. Затем они генерируют отчет во время тестовых прогонов. Жизненный цикл сборки Maven содержит собственные этапы подготовки перед этапами тестирования ( тестирование и интеграционное тестирование ). Этап подготовки к этапу тестирования называется классами процесса тестирования, а этап подготовки к этапу тестирования интеграции называется предварительным тестированием. На этих двух этапах мы связываем плагин Jacoco Maven , поэтому конфигурация этого плагина выглядит как следующий фрагмент кода (опять же, он является частью раздела <project> <build> <plugins> ):

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
<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.7.2.201409121644</version>
  <executions>
    <execution>
      <configuration>
        <destFile>${sonar.jacoco.reportPath}
      </configuration>
      <id>pre-test</id>
      <phase>process-test-classes</phase>
      <goals>
        <goal>prepare-agent</goal>
      </goals>
    </execution>
<!-- we want to execute <span class="hiddenSpellError" pre="execute " data-mce-bogus="1">jacoco</span>:prepare-agent-integration in test phase,-->
but before executing maven failsafe plugin -->
    <execution>
      <configuration>
        <destFile>${sonar.jacoco.itReportPath}</destFile>
      </configuration>
      <id>pre-itest</id>
      <phase>pre-integration-test</phase>
      <goals>
        <goal>prepare-agent-integration</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Элемент конфигурации destFile — это путь к месту, где должны храниться отчеты о тестировании. Важно использовать свойства $ { sonar.jacoco.reportPath} и $ { sonar. jacoco.itReportPath}. Эти свойства используются SonarQube для поиска отчетов о тестировании для визуализации.

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

Визуализация отчета об испытаниях SonarQube

Теперь мы хотим визуализировать наши тестовые отчеты в SonarQube. Поэтому мы должны запустить плагин Sonar Maven 3 (команда mvn sonar: sonar ) в нашем проекте после успешной сборки.

Когда мы открываем наш проект на панели инструментов SonarQube, мы видим только отчет о модульном тесте для каждого модуля. Причина в том, что визуализация отчета по интеграционному тесту должна настраиваться в SonarQube отдельно. Эти шаги настройки очень хорошо описаны в документации SonarQube .

Резюме

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

  • Maven 3.2.5
  • Плагины Maven:
    • Плагин Maven Surefire
    • Maven Failsafe Плагин
    • Построить помощник Maven плагин
    • Jacoco Maven Плагин
    • Sonar Maven 3 Плагин
  • SonarQube 4.5.1
  • Java 7

связи

  1. Сообщение в блоге SonarQube Выполнение юнит-теста в SonarQube
  2. Сайт проекта плагина Jacoco Maven
  3. Введение в жизненный цикл сборки Maven
  4. Сайт проекта Maven Failsafe Plugin
  5. Сайт проекта Build Helper Maven Plugin
  6. Документация SonarQube о покрытии кода с помощью интеграционных тестов для Java Projec
  7. Пример проекта Maven на GitHub
Ссылка: Отчеты о модульных и интеграционных испытаниях для проектов Maven В SonarQube от нашего партнера по JCG Сандры Парсик в блоге SKM IT WORLD .