#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, мои реализации разрешаются и внедряются контейнером. Чтобы избежать создания пустого производного класса для каждого теста, я создал набор тестов в своем модуле тестирования интеграции и расширил его в других своих модулях интеграции. Это даже лучше, чем то, что я ожидал получить в итоге, потому что я могу накладывать тесты, специфичные для реализации и контейнера, везде, где мне нужно.