#java #spring #spring-boot #cucumber #spring-boot-test
Вопрос:
У меня есть набор тестов компонентов cucumber, в котором для каждого теста компонентов требуется новая версия нашего приложения spring boot, запущенного с заданным набором переменных среды. Это происходит потому, что приложение считывает переменные среды при запуске, и они определяют, как приложение работает. Кроме того, я пытаюсь запускать тесты параллельно, что означает, что несколько копий моего приложения spring boot должны будут запускаться одновременно с различными переменными среды, переданными им
Я довольно много искал в Интернете и успешно использовал @SpringBootTest и @DirtiesContext для перезапуска приложения Spring boot для каждого теста, но я не смог понять, как установить переменные среды для первого теста. @SpringBootTest запускается до того, как вызывается метод с аннотацией @Before-где я устанавливаю переменные среды для теста, поэтому первый тест никогда не получает правильный набор переменных среды. Однако последующие тесты обеспечивают надлежащую среду.
Я мог бы создать фиктивный тест в верхней части каждого файла функций, но тогда запуск отдельного теста не сработает, и в любом случае он будет хакерским
@CucumberContextConfiguration
@SpringBootTest(classes= TestExperimentApplication.class)
@DirtiesContext
@TestExecutionListeners(
listeners = DirtyContextBeforeAndAfterClassTestExecutionListener.class,
mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS
)
public class StepDefs {
@Before
public void before() {
// set environment variables for test
}
... step methods ...
}
Повторяю, установка переменных среды один раз или в статическом блоке здесь не сработает. Мне нужно установить уникальные переменные среды для каждого компонента теста.
Кто-нибудь знает, как я мог бы переопределить/изменить поведение @SpringBootTest, чтобы он не запускался в первый раз до запуска @Before, или знает лучший способ сделать это?
Другие подходы, которые я придумал, таковы…
- Вручную запускать контексты приложений для каждого теста и отслеживать их (наименее любимая идея)
- используйте тестовые контейнеры (https://www.testcontainers.org/) чтобы запустить приложение локально с его файлом Dockerfile
Комментарии:
1. Делает ли ваше приложение одну вещь один раз? Если это так, вы можете превратить его в приложение командной строки spring. Это также должно решить проблему тестирования.