Как задать переменные среды перед каждым запуском SpringBootTest?

#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, или знает лучший способ сделать это?

Другие подходы, которые я придумал, таковы…

  1. Вручную запускать контексты приложений для каждого теста и отслеживать их (наименее любимая идея)
  2. используйте тестовые контейнеры (https://www.testcontainers.org/) чтобы запустить приложение локально с его файлом Dockerfile

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

1. Делает ли ваше приложение одну вещь один раз? Если это так, вы можете превратить его в приложение командной строки spring. Это также должно решить проблему тестирования.