Sobes.tech
Senior
40

Көптеген тест сыныптары үшін тоқтамай, ортақ TestContainer-ді қалай ұйымдастыруға болады?

Сұралған компаниялар
СБЕРСБЕР

AI-дан жауап

sobes.tech AI

Чтобы использовать один общий TestContainer для нескольких тестовых классов без его остановки между ними, можно применить паттерн Singleton или использовать аннотации JUnit 5 для управления жизненным циклом контейнера.

Например, создайте класс с контейнером как статическим полем и инициализируйте его один раз:

public class SharedContainer {
    public static final GenericContainer<?> container;

    static {
        container = new GenericContainer<>("postgres:13")
            .withExposedPorts(5432);
        container.start();
    }
}

В тестовых классах используйте этот контейнер, не останавливая его:

public class SomeTest {
    @BeforeAll
    static void setup() {
        // Используем SharedContainer.container
        String url = "jdbc:postgresql://" + SharedContainer.container.getHost() + ":" + SharedContainer.container.getFirstMappedPort() + "/test";
        // Инициализация подключения и т.д.
    }
}

Также можно использовать JUnit 5 Extension с аннотацией @TestInstance(Lifecycle.PER_CLASS) и управлять контейнером в методах с аннотациями @BeforeAll и @AfterAll, чтобы контейнер запускался один раз на весь набор тестов.

Если используется Spring Boot, можно создать bean с контейнером и указать scope singleton, чтобы контейнер жил на время всего контекста тестов.