Лучшие практики интеграции тестов с 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
Ответы
Ответ 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>
.....
.....
.....