Подтвердить что ты не робот

Лучшие практики интеграции тестов с Maven?

У меня есть проект, который я создаю с Maven, который использует Hibernate (и Spring) для извлечения данных из базы данных и т.д.

Мои "тесты" для DAO в моем проекте расширяют Spring AbstractTransactionalDataSourceSpringContextTests, так что DataSource может быть подключен к моему тестируемому классу, чтобы иметь возможность фактически запускать логику запроса/спящего режима, получать данные и т.д.

В нескольких других проектах я использовал эти типы тестов совместно с базой данных HSQL (либо в памяти, либо заостренной в файле), чтобы иметь возможность эффективно протестировать фактическую логику запросов к базе данных, не полагаясь на внешнюю базу данных. Это отлично работает, поскольку он избегает любых внешних зависимостей и "состояние" базы данных до запуска тестов (каждая из которых завернута в транзакцию, которая откатывается) хорошо определена.

Мне любопытно, хотя об оптимальном способе организации этих тестов, которые на самом деле являются сыпучим вкусом интеграционных тестов, с Maven. Это немного грязно, чтобы держать эти тесты в src/test/java, но из того, что я там читал, похоже, не существует последовательной стратегии или практики для организации интеграционных тестов с Maven.

Из того, что я прочитал до сих пор, похоже, что я могу использовать Failsafe plugin (или второй экземпляр Surefire) и связать его к фазе integration-test и что я могу также привязать собственную логику запуска или завершения работы (например, для запуска/остановки экземпляра HSQL) до pre-integration-test или post-integration-test. Но, это действительно лучший метод?

Итак, мой вопрос в основном заключается в том, что является общепринятой лучшей практикой по организации этого с Maven? У меня возникли проблемы с поиском какого-либо согласованного ответа в документации.

Я бы хотел:

  • Отдельные модульные тесты из интеграционных тестов, поэтому во время фазы test запускаются только модульные тесты,
  • Возможность привязки пользовательской логики запуска/выключения к pre-integration-test и post-integration-test
  • Получите отчеты из интеграционных тестов, объединенных/представленных с отчетами unit test Surefire
4b9b3361

Ответ 1

Эта страница codehaus содержит некоторые рекомендации. Я нашел отказоустойчивый плагин немного взломанным, и он запускает модульные тесты в Eclipse с яростным усложнением. Я широко использую то, что вы описываете.

Определить интеграционные тесты в src/itest/java На этапе предварительной интеграции:

  • Очистить целевые/тестовые классы
  • Используйте build-helper-maven-plugin add-test-source цель добавить исходное местоположение
  • Используйте пользовательский Mojo для удаления src/test/java из конфигурации, чтобы модульные тесты не были скомпилированы снова (мне это не очень нравится, но это необходимо для поддержания разделения тестов на единицу и интеграции).
  • Используйте компилятор-плагин для компиляции тестов интеграции

Затем на этапе интеграции-тестирования используйте плагин surefire для запуска тестов.

Наконец, привяжите все цели до стадии интеграции после тестирования (хотя обычно они не нужны, так как вы можете использовать тест teardown() для приведения в порядок).

Я еще не нашел способ объединить результаты теста по мере прохождения этапа отчетности, но я имеют тенденцию рассматривать интеграционные тесты в качестве дополнительного бонуса, поэтому, если они передают отчет, это не так важно.

Обновление: я считаю, что стоит отметить, что вы можете запускать Jetty из своих интеграционных тестов, а не использовать цель причала. Это дает вам гораздо более тонкий контроль над тестами. Вы можете получить более подробную информацию из этого ответа и ссылок на блоги.

Ответ 2

Очень простой способ сделать это - использовать категории JUnit.

Затем вы можете легко запустить несколько тестов во время фазы тестирования, а другой - на этапе интеграции.

Требуется несколько минут и требуется всего 3 шага.

  • Определить интерфейс маркера
  • Аннотировать классы, которые вы хотите разделить.
  • Настроить плагины Maven.

Здесь приведен полный пример. fooobar.com/questions/55379/...

Ответ 3

Это хорошее сообщение в блоге предлагает три варианта:

1) Отдельный модуль для тестов интеграции

2) Различные исходные каталоги

3) Различные шаблоны имен файлов

Я еще должен попробовать все три, поэтому не могу предложить мнение, на которое я выступаю.

Ответ 4

Я предпочитаю второй вариант, разные исходные каталоги, но мне было очень досадно, что я должен завершить ИТ-тесты интеграции или исключить пакеты.

Чтобы этого избежать, я закончил с этой конфигурацией:

<properties>
    <testSource>src/test/java</testSource>
    <testSourceResource>src/test/resources</testSourceResource>
</properties>
<build>
    <testSourceDirectory>${testSource}</testSourceDirectory>
    <testResources>
            <testResource>
            <directory>${testSourceResource}</directory>
            </testResource>
        </testResources>
.....
.....

а затем я переопределяю обе переменные в разных профилях для теста интеграции и приемочного тестирования:

<profiles>
  <profile>
   <id>acceptance-tests</id>
   <properties>
    <testSource>src/acceptance-test/java</testSource>
    <testSourceResource>src/acceptance-test/resources</testSourceResource>
   </properties>
  </profile>
 <profile>
   <id>integration-tests</id>
    <properties>
    <testSource>src/integration-test/java</testSource>
    <testSourceResource>src/integration-test/resources</testSourceResource>
    </properties>
  </profile>
.....
.....
.....