Настройка Jacoco + Огурец + Maven

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

<modules>
  <module>a</module>
  <module>b</module>
  <module>c</module>
</modules>

  <profiles>
    <profile>
        <id>env-local</id>
        <modules>
            <module>acceptance-tests</module>
        </modules>
    </profile>

Модуль приемочных тестов не определен в теге родительского pom, но для приемочных тестов pom.xml определен тот же родительский элемент, что и для остальных модулей.

Проблема в том, что ВСЕ интеграционные тесты находятся на приемочных тестах. У меня даже нет папки src/main/java в этом модуле. Большинство найденных примеров имеют приемочные тесты в каждом модуле, и для кода, который принадлежит этому модулю, создается покрытие.

В моем случае мне нужно создать отчет со всеми используемыми классами, даже если они из другого модуля. Мне также удалось это сделать, но я могу найти покрытие только для "первого уровня": если класс используется непосредственно из spb-accept, он включается в отчет, но я не могу найти информацию о используемых классах. косвенно.

Можно ли достичь такого покрытия с помощью jacoco?

Спасибо!

3 ответа

Решение

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

Результатом является то, что

  • Производственные классы компилируются
  • Производственные классы получают инструментарий, чтобы можно было измерить охват кода
  • Испытание выполнено и использование записано
  • Результат использования собран
  • Повторите со следующим модулем

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

Решение, которое я использовал, заключается в

  • Скомпилируйте весь код
  • Инструмент код
  • Выполнить все тесты
  • Консолидировать и построить отчет

Я пишу в блоге пару лет назад.

Проблема заключалась в том, что я не использовал файл jacoco-it.exec повторно. Это работало, когда у меня был модуль, но для подмодуля он шел в цель модуля, и он не мог повторно использовать файл

<modules>
  <module>a</module>
  <module>b</module>
  <module>c</module>
</modules>

Таким образом, он рассчитал покрытие для модулей, которые не имели сами модули. Если b имеет b1 и b2, используя эту запись ${project.basedir}/../target/jacoco-it.exec для sonar.jacoco.itReportPath, он искал файл в цели b, а не в цели главная пом.

После борьбы с многомодульным проектом я создал полный простой демонстрационный проект, демонстрирующий тестирование модулей, интеграцию, тестирование на огурец. Тестовое покрытие показано через Jacoco. Вы можете увидеть в модуле 3 тестов на огурец.

  • Мультимодульный проект
  • Юнит тест (через чистую установку mvn)
  • Интеграционный тест (через mvn clean install -P интеграционный тест)
  • Тесты на огурец (через mvn clean install) - для демонстрации / it-testing
  • Jacoco - тестовое покрытие (как совокупный файл данных, так и сводная отчетность)
  • FindBugs - качество кода

В этом проекте есть отдельный этап jacoco-агрегата для объединения результатов Jacoco различных модулей. Затем вы можете просмотреть файл index.html, чтобы увидеть результаты Jacoco всех модулей.

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

Я создал еще один простой проект, решающий проблему другим способом.

  • Определите в родительском pom в разделе 'build' 'pluginmanagement' определения подключаемых модулей failsafe и surefire.
  • Обращайтесь в каждом модуле, где вы используете эти плагины, к плагинам через очень простую ссылку с groupid и artifactid. Это все.
Другие вопросы по тегам