Статьи

Разделение интеграции и модульных тестов с Maven, Sonar, Failsafe и JaCoCo

Цель : выполнить медленные интеграционные тесты отдельно от модульных тестов и показать как можно больше информации о них в Sonar.

Первая часть — выполнение IT и UT по отдельности — достигается с помощью maven-failsafe-plugin и именования интеграционных тестов * IT (чтобы модульный тест, запускаемый surefire-maven-plugin, игнорировал их, а failsafe будет выполнять их в  этап интеграционных испытаний и сбор результатов на этапе проверки ).

Вторая часть — показ информации об интеграционных тестах в Sonar — немного сложнее. Метрики интеграционных тестов не будут включены в виджет Тестовое покрытие + Успешные тесты. Вы можете добавить виджет Интеграционное тестовое покрытие (IT-покрытие), если вы включили JaCoCo, но альтернативы для показателей успешности тестирования нет. Но не отчаивайтесь, читайте дальше!

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

Версии : Sonar 2.12, Maven 3.0.3

Условие: как работает сонар

Важно понимать, как работает Sonar и как он интегрирован в процесс сборки. Кратко:

  • Sonar запускается после сборки проекта (и, таким образом, различные артефакты уже созданы): либо как действие в Jenkins, либо после выполнения mvn install вручную.
  • Sonar поставляется в комплекте с различными интегрированными плагинами для анализа качества, такими как PMD, Checkstyle, Findbugs (в зависимости от выбранного профиля качества). Вам не нужно добавлять их вручную в POM (но вы можете, если вам нужно их настроить). Однако, если вам нужно что-то, чего еще нет, например, сбор покрытия для интеграционных тестов, вы должны сделать это вручную.
  • Sonar может либо повторно использовать существующие отчеты (checkstyle,…), либо создавать свои собственные.
  • F.ex. если вы выберете JaCoCo в качестве поставщика покрытия кода по умолчанию, Sonar автоматически перезапустит модульные тесты с включенным JaCoCo для сбора метрик покрытия. Вы можете увидеть файл target / sonar / sonar-pom.xml, который он генерирует, чтобы увидеть, что он делает.

Обманывая сонар для демонстрации успеха в ИТ-тестировании

Выполнение модульных тестов через Surefire и интеграционных тестов через Failsafe приводит к невозможности увидеть, когда интеграционные тесты не пройдены. (Поскольку это показано в виджете об успешном выполнении модульного теста, который не поддерживает Failsafe.) Однако можно обмануть Sonar, чтобы показать успешное тестирование как для модульных, так и для интеграционных тестов, указав Failsafe хранить свои отчеты о тестах в том же каталоге, что и Surefire вместо defaultsafe-report по умолчанию, и вот что мы делаем:

<!-- pom.xml, the build/plugins section -->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <configuration>
        <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
    </configuration>
</plugin>

Как отобразить покрытие кода IT в сонаре

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

  1. Добавьте Failsafe к вашей конфигурации Maven, как показано выше.
  2. Добавьте JaCoCo в Maven и объедините его с Failsafe для создания отчета о покрытии при выполнении интеграционных тестов
  3. Поручите Sonar выполнить этап проверки и передать ему путь к отчету об интеграционном тесте.

1. Добавьте Failsafe в вашу конфигурацию Maven, как показано выше

См. Фрагмент pom.xml в разделе «Обманчивый сонар для демонстрации успеха ИТ-теста» выше.

2. Добавьте JaCoCo в Maven и объедините его с Failsafe для создания отчета о покрытии при выполнении интеграционных тестов.

Поскольку Sonar 2.12 не выполняет автоматическую перенастройку Failsafe для сбора покрытия кода, мы должны вручную указать Failsafe загрузку Java-агента JaCoCo, который будет собирать и хранить отчет о покрытии (по умолчанию target / jacoco.exec):

<!-- pom.xml fragment: -->
<build>
 ...
     <!-- Run integration tests (*IT) -->
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <configuration>
            <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
            <argLine>${jacoco.agent.argLine}</argLine>
        </configuration>
    </plugin>
    <!--
        Compute integration test coverage for Sonar
        BEWARE: Sonar doesn't run the verify phase, it has to be forced by setting -Dsonar.phase=verify
    -->
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <configuration>
            <propertyName>jacoco.agent.argLine</propertyName> <!-- default: argLine -->
            <includes>
                <include>com/comoyo/**</include>
            </includes>
            <destFile>${project.build.directory}/jacoco-integration.exec</destFile> <!-- agent -->
            <dataFile>${project.build.directory}/jacoco-integration.exec</dataFile> <!-- report -->
        </configuration>
        <executions>
            <execution>
                <id>agent</id>
                <goals><goal>prepare-agent</goal></goals>
            </execution>
        </executions>
    </plugin>
</build>

Ключевые строки: 10 (argLine) и 28 (подготовка агента перед проверкой — фаза по умолчанию, если она не указана, это init ).

3. Поручите Sonar выполнить этап проверки и передать ему путь к отчету об интеграционном тесте.

Важное замечание: Если вы используете Sonar до версии 2.12, вы должны установить плагин Sonar JaCoCo вручную.

Запускаете ли вы Sonar из Jenkins или локально, мы должны убедиться, что фаза проверки запущена, и передать Sonar путь к сгенерированному отчету о покрытии тестов интеграции JaCoCo. Лучше всего это сделать в Sonar в конфигурации плагина JaCoCo (на уровне проекта?), Но вы также можете сделать это вручную, передав его в maven через «-Dsonar.jacoco.itReportPath = target / jacoco -gration.exec» или установив свойство в pom.xml в проекте / свойства.

Плагин Jenkins Sonar не требует какой-либо специальной настройки, если путь к отчету задан внутри плагина JaCoCo Sonar.

Командная строка ( рекомендуемый способ; первая строка проходит среди других этапов проверки и, таким образом, генерирует отчет):

payment$ mvn clean install -Dtest=false -DfailIfNoTests=false
payment$ mvn sonar:sonar

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

payment$ mvn -Dsonar.phase=verify sonar:sonar

ПРИМЕЧАНИЕ. Если вы установите JaCoCo в качестве поставщика покрытия кода по умолчанию в Sonar, это обеспечит покрытие для модульных тестов, переопределяющее покрытие интеграционных тестов на этапе проверки.
Решения: 1) Не включайте JaCoCo, 2) Настройте JaCoCo для использования другого файла для интеграционных тестов (что мы делаем)

Некоторые журналы интереса от запуска mvn sonar: sonar:

...
JaCoCo agent (version 0.5.3.201107060350) extracted: /var/folders/k0/2842tm752zv1dh4q77_gmgdr0000gn/T/jacocoagent2548420105762793132.jar
JVM options: -javaagent:/var/folders/k0/2842tm752zv1dh4q77_gmgdr0000gn/T/jacocoagent2548420105762793132.jar=destfile=target/jacoco.exec,excludes=*_javassist_*
Initializer FindbugsMavenInitializer...
Initializer FindbugsMavenInitializer done: 4 ms
Execute maven plugin maven-surefire-plugin...
Execute org.apache.maven.plugins:maven-surefire-plugin:2.8.1:test...
...
Execute maven plugin maven-surefire-plugin done: 9856 ms
Initializer JacocoMavenInitializer...
..
Sensor SquidSensor done: 2207 ms
Sensor JaCoCoSensor...
Analysing /myproject/target/jacoco.exec
Sensor JaCoCoSensor done: 559 ms
Sensor JaCoCoItSensor...
Analysing /myproject/target/jacoco-integration.exec
Sensor JaCoCoItSensor done: 89 ms
Sensor SurefireSensor...
  • Обратите внимание, что я установил JaCoCo в качестве поставщика покрытия кода в Sonar, и Sonar использует свою собственную копию (строка агента JaCoCo .. извлечена), которую он использует на этапе тестирования.
  • Обратите внимание, что Sonar запускает верный метод: тестируйте автоматически (с помощью инструментов) для сбора покрытия кода
  • Обратите внимание, что JaCoCo обработал оба файла * .exec (первый, сгенерированный Sonar для модульных тестов, другой, сгенерированный Maven для проверки перед вызовом Sonar)

Совет: Рассчитайте общий охват кода модульных + интеграционных тестов.

Единичные и интеграционные тестовые покрытия рассчитываются отдельно; чтобы увидеть полное покрытие кода, нам нужно объединить их (заметьте, что мы не можем просто суммировать их, так как оба вида тестов могут охватывать одни и те же строки). Это было бы возможно с помощью JaCoCo как для вычисления покрытия модульного теста (поддерживается из коробки), так и для покрытия интеграционного теста в разных файлах, а также с помощью его задачи Ant для объединения двух файлов покрытия, передавая полученный файл в качестве файла покрытия ИТ-теста Сонар (потому что мы не можем получить третий виджет для отображения этого суммированного покрытия). Однако я не пробовал это.

Замечание по тестированию JaCoCo, Failsafe и Maven Integration

Если Sonar не показывает виджет ИТ-покрытия, хотя он находится на панели инструментов (нажмите «Настроить виджеты при входе в систему») или показывает 0%, хотя он должен быть выше, вы можете проверить данные, которые генерирует JaCoCo, создав из них отчет в формате HTML. , Для этого есть и задача Ant, которая не сработала, и цель Maven. Вот как вы указываете JaCoCo генерировать отчет при запуске «сайта mvn» — обратите внимание на строки 13, 14 (помните, что сначала вы должны запустить «mvn verify», чтобы создать отчет о двоичном покрытии):

<!-- pom.xml build/plugins fragment -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>agent</id>
            <phase>pre-integration-test</phase>
            <goals><goal>prepare-agent</goal></goals>
        </execution>
        <execution>
            <id>report</id>
            <phase>site</phase>
            <goals><goal>report</goal></goals>
        </execution>
    </executions>
</plugin>

Ссылки

Плагин JaCoCo Maven имеет минимальную документацию, но вы можете получить полезную информацию через:

mvn help:describe -Dplugin=org.jacoco:jacoco-maven-plugin -Ddetail

Sonar: измерение охвата кода с помощью интеграционных тестов с Sonar (9/2010) — не использует плагин JaCoCo Maven и, следовательно, должен настраивать argLine вручную

Полное ПОМ

Смотрите полный POM на GitHub .

 

От http://theholyjava.wordpress.com/2012/02/05/separating-integration-and-unit-tests-with-maven-sonar-failsafe-and-jacoco/