Многомодульные тесты, которые зависят друг от друга
Сейчас я пишу интеграционные тесты между двумя модулями:
- Модуль A - содержит сервис REST, который можно докеризовать через плагин maven
- Модуль B - содержит интеграционные тесты, которые зависят от того, работает ли докер модуля A
Поэтому я использовал отказоустойчивый плагин, который содержит этапы до-интеграционных тестов и пост-интеграционные тесты.
В предварительных интеграционных тестах я запускаю докеры, и после завершения всех интеграционных тестов всех подмодулей я хочу убить этих докеров.
В плагине Docker, который я использую (fabric8), есть также 2 фазы, которые я использую на вышеуказанных этапах: область docker:start и docker:stop
Проблема возникает, когда я запускаю весь проект, докеры убиваются в модуле A до запуска тестов модуля B, поэтому я подумал, что если бы я мог сказать родительскому модулю, который содержит их, что-то вроде:
- Старт модуля B: панель запуска
- Запустите интеграционные тесты всего проекта
- Запустить модуль B: остановить плагин
Это действительно решило бы мою проблему, но есть ли способ вызвать фазы субмодулей из родительского модуля или даже почитать, присоединить фазу субмодуля к фазе родительского модуля из субмодуля
2 ответа
Насколько мне известно, Maven не может приостановить сборку модуля, пока не будет выполнено условие в другом модуле; Maven полностью выполняет сборку подмодуля перед тем, как приступить к сборке другого подмодуля.
Вы можете, однако, сделать Module B
зависит от Module A
(даже зависит от набора тестовых классов от него), и, таким образом, вы можете запустить службу REST в рамках сборки Module B
, как часть ваших интеграционных тестов.
Насколько я понимаю ваши настройки, сборка Module A
не имеет никакого отношения к запуску / остановке контейнеров; Таким образом, Module A
не должен этого делать.
Вместо этого контейнер должен быть запущен и остановлен в Module B
"s pre-integration-test
а также post-integration-test
фазы соответственно. В конце концов, Module B
"s integration-test
фазе нужен работающий контейнер, а не Module A
,
Если вы не привыкли к маневренному (самоуверенному) способу действий, это может показаться излишне ограничительным, но Maven просто заставляет вас поступать правильно. Подумайте об этом так: если в будущем Module C
также нужен работающий докер-контейнер, например, для запуска некоторых других тестов вы не захотите утилизировать один докер-контейнер (запущенный Module A
). Как это рискует Module B
а также Module C
взаимодействуя забавными способами, каждый модуль должен получить свой собственный докер-контейнер для работы.