Цель : выполнить медленные интеграционные тесты отдельно от модульных тестов и показать как можно больше информации о них в 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 не может автоматически рассчитать покрытие тестов для интеграционных тестов, поэтому нам приходится делать это вручную. Резюме:
- Добавьте Failsafe к вашей конфигурации Maven, как показано выше.
- Добавьте JaCoCo в Maven и объедините его с Failsafe для создания отчета о покрытии при выполнении интеграционных тестов
- Поручите 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 .