2016-06-23 2 views
5

Должен ли я проводить тесты интеграции под src/test с остальными модульными тестами и просто отличать их по шаблону, например *Integr*Test, *ITTest, или они могут быть в src/it (как в случае разработки плагинов Maven и использования maven-invoker-plugin)?Где должны храниться тесты интеграции при использовании maven-отказоустойчивого плагина?

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

+1

То, о чем вы упомянули, не является чистым, это правильно, потому что те ИТ-классы получают путь к классу как ваш юнит-тест, который может не понравиться. Лучше всего иметь полный отдельный модуль, который содержит ИТ. Найдите их в использовании 'src/test/java' и следуйте правилам именования для ИТ, как вы уже упоминали. – khmarbaise

+0

@khmarbaise: Спасибо за объяснение, я ценю, что он идет прямо от одного из участников проекта Apache Maven! Я понимаю, о чем вы говорите, хотя я не совсем согласен с тем, что если бы вы использовали его в другом каталоге, ваши зависимости ' test' будут разными. Их не будет. То, что я также не понимаю, (несмотря на то, что прочитал немного по этому вопросу), - это то, что в этом случае для этого должен быть отдельный плагин? Может быть, была бы еще одна цель для 'maven-surefire-plugin', который будет вызван во время фазы тестирования интеграции? – carlspring

ответ

5

Первый maven-fail-плагин запускается по умолчанию в другой фазе жизненного цикла (интеграционный тест), как это делает maven-surefire-plugin (test). Кроме того, вы можете настроить maven-отказоустойчивый плагин для запуска цели verify на этапе тестирования post-integration-test, если вы хотите проверить, не прошли ли тесты интеграции. Это можно свободно настроить.

В мой разум входит один вопрос. У вас есть 10 модулей, и теперь вы хотите провести интеграционные тесты? К какому модулю они принадлежат? Лучше всего иметь отдельный модуль, потому что они не принадлежат ни одному из 10 модулей.

Кроме того, плагин maven-surefire уже настроен в жизненном цикле по умолчанию. Да, дополнительная цель была бы идеей, но это путало бы пользователя использовать одни и те же плагины в разных отношениях. Поэтому разделение проблем важно здесь. Помимо всех конфигураций по умолчанию ... Эти плагины имеют общую базу кода, но есть различия ...

Также, что уже упоминалось Tunaki, это pre-integration-test, для настройки таких вещей, как серверы и т. Д. integration-test и такие вещи, как shutting вниз служб/серверов в post-integration-test фазы. Это никогда не произойдет в модульных тестах.

Использование отдельного модуля упрощает настройку ИТ, что означает наличие разных зависимостей (classpath), чем для модульных тестов. Например, такие вещи, как Arquillian.org, которые никогда не используются в модульных тестах. Это не может быть обработано в одном модуле ... также хорошие вещи - это разделение проблем здесь.

Кроме того, интеграционные тесты не могли быть перегруппированы по умолчанию, тогда как модульные тесты могут быть по определению, иначе они не будут выполнять модульные тесты.

А как насчет расположения папок? В тестовом модуле интеграции вы можете просто использовать папку src/test/java, что означает, что вам не нужна дополнительная конфигурация и т. Д. (Например, через build-helper-maven-plugin и т. Д.), Что упрощает ее и следует более условно над парадигмой конфигурации.

И не забывайте, что вы можете лучше контролировать то, что работает в вашей сборке (CI) ..

И еще один важный намек. Обычно интеграционные тесты часто связаны с инфраструктурой, поэтому иногда полезно игнорировать сбои там, которые могут просто обрабатываться с помощью check цели maven-отказоустойчивого-плагина ....

Пример для ИТ-модуля можно найти here.

8

Вы правы, что src/it предназначен для использования для интеграции тестов плагинов. Это упоминается в Standard Directory Layout.

The maven-failsafe-plugin, по умолчанию, будет выглядеть для ваших тестов интеграции внутри ${project.build.testSourceDirectory}, which is the same как maven-surefire-plugin для модульных тестов. По умолчанию это соответствует src/test/java. Эти интеграционные тесты сделаны различны, следуя naming convention:

<includes> 
    <include>**/IT*.java</include> 
    <include>**/*IT.java</include> 
    <include>**/*ITCase.java</include> 
</includes> 

, которая отличается от naming convention для юнит-тестов:

<includes> 
    <include>**/Test*.java</include> 
    <include>**/*Test.java</include> 
    <include>**/*TestCase.java</include> 
</includes> 

Так что пока они будут находиться в папке же источника (src/test/java), разница в именах четко различает их. Кроме того, это настройка по умолчанию, поэтому дополнительная настройка не требуется.

Тем не менее, вы можете иметь другие варианты:

  • Поместите тесты интеграции внутри другой папки источника. Для этого потребуется некоторая настройка: вам нужно будет использовать цель build-helper-maven-plugin:add-test-source, чтобы добавить пользовательскую папку в качестве исходной исходной папки.
  • Используйте другой модуль (если у вас есть мультимодульный проект Maven), который будет содержать только тесты интеграции.
+0

Спасибо за подробное объяснение! Он очищает много! Я знаю, что это, вероятно, должно быть в другом вопросе, но могли бы вы ответить на мой вопрос в комментариях выше на @khmarbaise? – carlspring

+0

@carlspring Боюсь, я не знаю точной причины для создания нового плагина для ИТ. Мое лучшее предположение было бы потому, что ИТ-технологии просто отличаются от модульных тестов: интеграционные тесты имеют фазы pre и post, в то время как модульные тесты - нет; обычно ИТ-пользователям требуется настроить настраиваемую среду для их запуска (например, запуск сервера). У меня лично не было бы ИТ-специалистов в другом каталоге: для этого требуется некоторая конфигурация. IMO, имеющий отдельный модуль, является чистым решением и идеально подходит, когда у вас уже есть мультимодульный проект (я не уверен, что я подойду для модульного подхода в противном случае). – Tunaki

+0

Спасибо! Это имеет смысл в качестве объяснения, хотя я уверен, что пара дополнительных целей для «maven-surefire-plugin» будет иметь почти такой же эффект. Но, возможно, есть последствия, о которых я еще не знаю. Еще раз спасибо за ваше время! – carlspring

Смежные вопросы