Я был в той же ситуации, что и вы, полуответы, разбросанные по всему Интернету, довольно раздражали, поскольку казалось, что у многих людей была такая же проблема, но никого не удосужилось полностью объяснить, как они ее решили.
Документы Sonar относятся к проекту GitHub с полезными примерами . Для решения этой проблемы я применил логику интеграционных тестов к обычным модульным тестам (хотя правильные модульные тесты должны быть специфичными для подмодуля, это не всегда так).
В родительский файл pom.xml добавьте следующие свойства:
<properties>
<!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
</properties>
Это заставит Sonar собирать отчеты модульного тестирования для всех подмодулей в одном месте (целевая папка в родительском проекте). Он также сообщает Sonar о необходимости повторного использования отчетов, запускаемых вручную, вместо создания собственных отчетов. Нам просто нужно запустить jacoco-maven-plugin для всех подмодулей, поместив его в родительский pom внутри build / plugins:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.0.201210061924</version>
<configuration>
<destFile>${sonar.jacoco.reportPath}</destFile>
<append>true</append>
</configuration>
<executions>
<execution>
<id>agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
destFile
помещает файл отчета в то место, где Sonar будет его искать, и append
добавляет к файлу, а не перезаписывает его. Это объединит все отчеты JaCoCo для всех подмодулей в одном файле.
Sonar будет просматривать этот файл для каждого подмодуля, поскольку это то, на что мы указали ему выше, давая нам объединенные результаты модульного тестирования для файлов с несколькими модулями в Sonar.
mvn package
перед запуском,mvn sonar:sonar
чтобы сгенерировать новый путь отчета.Вопросы-Ответы
Вопросы в голове с тех пор, как я сошел с ума от жакоко.
Мой сервер приложений (jBoss, Glassfish ..) находится в Ираке, Сирии, где угодно .. Можно ли получить многомодульное покрытие при выполнении интеграционных тестов? Jenkins и Sonar также находятся на разных серверах.
Да. Вы должны использовать агент jacoco, который работает в режиме
output=tcpserver
jacoco ant lib. В основном дваjar
с. Это даст вам 99% успеха.Как работает jacoco agent?
Вы добавляете строку
к серверу приложений JAVA_OPTS и перезапустите его. В этой строке
[your_path]
необходимо заменить только путь к jacocoagent.jar, который хранится (хранится!) На вашей виртуальной машине, на которой работает сервер приложений. С того момента, как вы запустите сервер приложений, все развернутые приложения будут динамически отслеживаться, и их активность (то есть использование кода) будет готова для вас, чтобы вы могли получить в формате jacocos .exec по запросу tcl.Могу ли я сбросить агент jacoco, чтобы он начал сбор данных о выполнении только с момента запуска моего теста?
Да, для этого вам понадобится jacocoant.jar и скрипт сборки ant, расположенный в вашем рабочем пространстве jenkins.
Итак, в основном то, что мне нужно от http://www.eclemma.org/jacoco/, - это jacocoant.jar, расположенный в моем рабочем пространстве jenkins, и jacocoagent.jar, расположенный на моей виртуальной машине сервера приложений?
Это правильно.
Я не хочу использовать ant, я слышал, что плагин jacoco maven тоже может все.
Это неправильно, плагин jacoco maven может собирать данные модульных тестов и некоторые данные интеграционных тестов (см. Arquillian Jacoco ), но если у вас, например, есть тесты в виде отдельной сборки в jenkins, и вы хотите показать многомодульное покрытие, я могу Не понимаю, чем плагин maven может вам помочь.
Что именно производит агент jacoco?
Только данные о покрытии в
.exec
формате. После этого сонар сможет это прочитать.Нужно ли jacoco знать, где находятся мои классы Java?
Нет, эхолот, но не jacoco. Когда вы делаете
mvn sonar:sonar
это, в игру вступает путь к классам.Так что насчет сценария муравья?
Он должен быть представлен в вашем рабочем пространстве jenkins. Мой скрипт муравья, я его назвал,
jacoco.xml
выглядит так:Два обязательных параметра, которые вы должны передать при вызове этого скрипта,
-Dworkspace=$WORKSPACE
используйте его, чтобы указать на вашу рабочую область jenkins и-Djacoco.host=yourappserver.com
хост безhttp://
Также обратите внимание, что я помещаю свой
jacocoant.jar
в $ {workspace} /tools/jacoco/jacocoant.jarЧто я должен делать дальше?
Вы запустили сервер приложений с jacocoagent.jar?
Вы поместили ant script и jacocoant.jar в рабочее пространство jenkins?
Если да, последний шаг - настроить сборку jenkins. Вот стратегия:
jacocoReset
для сброса всех ранее собранных данных.jacocoReport
чтобы получить отчетЕсли все в порядке, вы увидите
it-jacoco.exec
в своем рабочем пространстве сборки.Посмотрите на снимок экрана, я также
ant
установил в своей рабочей области в$WORKSPACE/tools/ant
каталоге, но вы можете использовать тот, который установлен в ваших jenkins.Как протолкнуть этот отчет в сонар?
Maven
sonar:sonar
выполнит задание (не забудьте настроить его), направьте его на главный pom.xml, чтобы он прошел через все модули. Используйтеsonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec
параметр, чтобы сообщить эхолоту, где находится ваш отчет о тестировании интеграции. Каждый раз, когда он будет анализировать новые классы модулей, он будет искать информацию о покрытии вit-jacoco.exec
.У меня уже есть jacoco.exec в моем каталоге `target`,` mvn sonar: sonar` игнорирует / удаляет его
По умолчанию
mvn sonar:sonar
делаетclean
и удаляет ваш целевой каталог, используйте,sonar.dynamicAnalysis=reuseReports
чтобы избежать этого.источник
НОВЫЙ СПОСОБ С ВЕРСИИ 0.7.7
Начиная с версии 0.7.7 появился новый способ создания агрегированного отчета:
Вы создаете отдельный проект «отчет», который собирает все необходимые отчеты (любая цель в проекте агрегатора выполняется до его модулей, поэтому его нельзя использовать).
В корне POM выглядит следующим образом (не забудьте добавить новый модуль отчета под модулями):
Помы из каждого подмодуля вообще не нужно менять. Пом из модуля отчета выглядит так:
Полный пример можно найти здесь .
источник
Я опубликую свое решение, поскольку оно немного отличается от других, и мне потребовался солидный день, чтобы разобраться с помощью существующих ответов.
Для многомодульного проекта Maven:
Если
WAR
проект является основным веб-приложением,LIB
1 и 2 являются дополнительными модулями, от которыхWAR
зависятTEST
интеграционные тесты.TEST
запускает встроенный экземпляр Tomcat (не через плагин Tomcat), запускаетWAR
проект и тестирует его с помощью набора тестов JUnit.WAR
ИLIB
проекты оба имеют свои собственные модульные тесты.Результатом всего этого является разделение покрытия интеграции и модульного тестирования, которое можно различить в SonarQube.
ROOT pom.xml
WAR
,LIB
иTEST
pom.xml
унаследует выполнение плагинов JaCoCo.TEST pom.xml
Я также обнаружил, что сообщение в блоге Петри Кайнулайненса «Создание отчетов о покрытии кода для модульных и интеграционных тестов с помощью подключаемого модуля JaCoCo Maven» было ценным для установки JaCoCo.
источник
agent-for-it
требуется только при запуске тестов вTEST
модуле, но в текущей конфигурации он выполняется для всех остальных модулей, где он не имеет значения. Улучшение состояло бы в том, чтобыagent-for-ut
работать во всех других модулях иagent-for-it
только в нихTEST
.Есть способ добиться этого. Магия заключается в создании комбинированного файла jacoco.exec. И с maven 3.3.1 есть простой способ получить это. Вот мой профиль:
Если вы добавите этот профиль в свой родительский pom и позвоните,
mvn clean install sonar:sonar -DrunSonar
вы получите полное покрытие.Магия здесь есть
maven.multiModuleProjectDirectory
. Эта папка всегда является папкой, в которой вы начали сборку maven.источник
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.0.905:sonar -DrunSonar
из-заA required class was missing while executing org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar: org/sonar/batch/bootstrapper/IssueListener
ошибки.Конфигурация, которую я использую в моем pom родительского уровня, где у меня есть отдельные этапы модульного и интеграционного тестирования.
Я настраиваю следующие свойства в родительских свойствах POM
Я помещаю определения плагинов в раздел управления плагинами.
Обратите внимание, что я определяю свойство для аргументов surefire (surefireArgLine) и failsafe (failsafeArgLine), чтобы позволить jacoco настроить javaagent для работы с каждым тестом.
Под pluginManagement
И в разделе сборки
И в разделе отчетов
источник
<append>true</append>
конфиг вprepare-agent
разделах ...Я нашел другое решение для новых версий Sonar, в которых формат двоичного отчета JaCoCo (* .exec) устарел, а предпочтительным форматом является XML (SonarJava 5.12 и выше). Решение очень простое и похоже на предыдущее решение с отчетами * .exec в родительском каталоге из этой темы: https://stackoverflow.com/a/15535970/4448263 .
Предполагая, что структура нашего проекта:
Вам нужна следующая конфигурация плагина сборки maven в совокупном pom проекта:
Затем создайте проект с помощью maven:
А для Sonar вы должны установить свойство в графическом интерфейсе администрирования:
или используя командную строку:
Описание
Это создает бинарные отчеты для каждого модуля в каталогах по умолчанию:
target/jacoco.exec
. Затем создает отчеты XML для каждого модуля в каталогах по умолчанию:target/site/jacoco/jacoco.xml
. Затем создает сводный отчет для каждого модуля в пользовательском каталоге${project.basedir}/../target/site/jacoco-aggregate/
относительно родительского каталога для каждого модуля. Для moduleA и moduleB это будет общий путьmoduleC/target/site/jacoco-aggregate/
.Поскольку модуль B зависит от модуля A, модуль B будет построен последним, и его отчет будет использоваться в качестве сводного отчета о покрытии в Sonar для модулей A и B.
В дополнение к агрегированному отчету нам нужен обычный модульный отчет, поскольку агрегированные отчеты JaCoCo содержат данные о покрытии только для зависимостей.
Вместе эти два типа отчетов предоставляют данные полного покрытия для Sonar.
Есть одно небольшое ограничение: вы должны иметь возможность писать отчет в родительском каталоге проекта (при наличии разрешения). Или вы можете установить свойство
jacoco.skip=true
в корневом проекте pom.xml (moduleC) иjacoco.skip=false
в модулях с классами и тестами (moduleA и moduleB).источник
Как Гидролокаторы
sonar.jacoco.reportPath
,sonar.jacoco.itReportPath
иsonar.jacoco.reportPaths
все были устаревшими , вы должны использовать вsonar.coverage.jacoco.xmlReportPaths
настоящее время. Это также имеет некоторое влияние, если вы хотите настроить многомодульный проект maven с помощью Sonar и Jacoco.Как отметил @Lonzak , начиная с Sonar 0.7.7, вы можете использовать цель обострения отчетов Sonar. Просто введите в родительский объект следующую зависимость:
Поскольку текущие версии jacoco-maven-plugin совместимы с xml-отчетами, это создаст для каждого модуля в его собственной целевой папке папку site / jacoco-aggregate, содержащую
jacoco.xml
файл.Чтобы позволить Sonar объединить все модули, используйте следующую команду:
Для того, чтобы сохранить мой ответ короткий и точные, я не говоря уже о
maven-surefire-plugin
иmaven-failsafe-plugin
зависимости. Вы можете просто добавить их без какой-либо другой конфигурации:источник
источник
Вы можете вызвать в maven задачу ant под названием merge , чтобы собрать все файлы покрытия (* .exec) в один файл.
Если вы запускаете модульные тесты, используйте пакет подготовки фазы , если вы запускаете интеграционный тест, используйте post-integration-test .
На этом сайте есть пример вызова задачи jacoco ant в проекте maven.
Вы можете использовать этот объединенный файл на эхолоте.
источник
чтобы иметь модульное тестирование И интеграционное тестирование, вы можете использовать maven-surefire-plugin и maven-failsafe-plugin с ограниченными включениями / исключениями. Я играл с CDI, пока контактировал с сонаром / jacoco, поэтому я оказался в этом проекте:
https://github.com/FibreFoX/cdi-sessionscoped-login/
Может, это тебе немного поможет. в моем pom.xml я использую "-javaagent" неявно, устанавливая параметр argLine в разделе конфигурации указанных плагинов тестирования. Явное использование ANT в проектах MAVEN - это то, что я бы не стал пробовать, для меня это слишком много смешивания двух миров.
У меня есть только одномодульный проект maven, но, возможно, он поможет вам настроить свой для работы.
примечание: возможно, не все maven-плагины обновлены, возможно, некоторые проблемы будут исправлены в более поздних версиях
источник
Этот образец мне очень подходит:
источник