Интеграционные тесты, несколько контейнеров, несколько реализаций API и Maven. Есть советы?

#unit-testing #maven-2

#модульное тестирование #maven-2

Вопрос:

Как бы вы настроили следующее в Maven? Предположим, у меня есть 4 модуля:

  • доступ к данным-api
  • data-access-impl-derby
  • data-access-impl-postgresql
  • данные-доступ-интеграция-тесты

Предположим, я хочу иметь возможность тестировать на двух контейнерах:

  • arquillian-jbossas-ebedded-6
  • arquillian-glassfish-embedded-3.1

Для запуска моих интеграционных тестов мне нужен модуль ‘data-access-api’ и ровно одна из реализаций. Я также хочу протестировать ровно один из контейнеров. Я могу придумать несколько способов заставить это работать, но у всех них есть недостатки, и я даже не знаю, поддерживает ли Maven некоторые из них.

Я нашел следующее предложение добавить концепцию групп профилей в Maven, но, насколько я могу судить, ничего подобного никогда не добавлялось:

http://docs.codehaus.org/display/MAVENUSER/Improvements to Profile Activation Deactivation

Концепция наличия группы взаимоисключающих профилей будет работать, но может стать неуправляемой довольно быстро. Представьте 3 реализации и 3 контейнера. Было бы 9 возможных конфигураций профиля, хотя меня может заинтересовать тестирование только 3 или 4 возможных комбинаций.

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

  • интеграция-arquillian-glassfish-embedded-data-access-postgresql

Однако я не могу придумать способ сделать это без дублирования моих интеграционных тестов. В моем модуле data-access-integration-tests есть только интеграционные тесты. Я использую CDI для внедрения зависимостей, и тесты выполняются с использованием API. Я могу запускать один и тот же набор тестов для каждой реализации. Это просто вопрос упаковки ровно одной реализации с API.

Пока я использую Maven 2.

Ответ №1:

Как насчет помещения ваших интеграционных тестов в абстрактный класс и в отдельный модуль (что вы уже сделали) и создания производного класса, который создает экземпляр реализации и выполняет эти тесты. Это решило бы сначала реализовать тесты только один раз, потому что вы тестируете реализации в соответствии с поведением вашего интерфейса. Может быть, это немного проясняет ситуацию. Я бы сказал, что последнее, что вы предложили, было бы лучшим, поэтому ваш «integration-arquillian-glassfish-embedded-data-access-postgresql» будет содержать только один класс, который является производным от вашего абстрактного класса, создайте конкретный экземпляр и запустите тесты.

Комментарии:

1. Это более или менее то, что я в итоге сделал. Maven вызывает их прикрепленными тестами . Поскольку я использую CDI, мои реализации разрешаются и внедряются контейнером. Чтобы избежать создания пустого производного класса для каждого теста, я создал набор тестов в своем модуле тестирования интеграции и расширил его в других своих модулях интеграции. Это даже лучше, чем то, что я ожидал получить в итоге, потому что я могу накладывать тесты, специфичные для реализации и контейнера, везде, где мне нужно.