Как повторно использовать Testcontainers между несколькими SpringBootTests? - PullRequest
0 голосов
/ 17 июня 2020

Я использую TestContainers с Spring Boot для запуска модульных тестов для таких репозиториев:

@Testcontainers
@ExtendWith(SpringExtension.class)
@ActiveProfiles("itest")
@SpringBootTest(classes = RouteTestingCheapRouteDetector.class)
@ContextConfiguration(initializers = AlwaysFailingRouteRepositoryShould.Initializer.class)
@TestExecutionListeners(listeners = DependencyInjectionTestExecutionListener.class)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Tag("docker")
@Tag("database")
class AlwaysFailingRouteRepositoryShould {

  @SuppressWarnings("rawtypes")
  @Container
  private static final PostgreSQLContainer database =
      new PostgreSQLContainer("postgres:9.6")
          .withDatabaseName("database")
          .withUsername("postgres")
          .withPassword("postgres");

Но теперь у меня есть 14 таких тестов, и каждый раз, когда тест запускается, новый экземпляр Postgres раскручивается. Можно ли повторно использовать один и тот же экземпляр во всех тестах? Шаблон Singleton не помогает, поскольку каждый тест запускает новое приложение.

Я также пробовал testcontainers.reuse.enable=true в .testcontainers.properties и .withReuse(true), но это не помогло .

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Вы не можете использовать аннотацию JUnit Jupiter @Container, если хотите иметь многоразовые контейнеры. Эта аннотация гарантирует, что контейнер будет останавливаться после каждого теста .

Что вам нужно, так это подход одноэлементного контейнера и использовать, например, @BeforeAll для запуска ваших контейнеров. Даже если у вас будет .start() в нескольких тестах, Testcontainers не запустит новый контейнер, если вы включили повторное использование, используя как .withReuse(true) в определении контейнера, так и следующий файл .testcontainers.properties в вашем домашнем каталоге:

testcontainers.reuse.enable=true

Простой пример может выглядеть следующим образом:

@SpringBootTest
public class SomeIT {

  public static GenericContainer postgreSQLContainer = new PostgreSQLContainer().
    withReuse(true);

  @BeforeAll
  public static void beforeAll() {
    postgreSQLContainer.start();
  }

  @Test
  public void test() {

  }

}

и другой интеграционный тест:

@SpringBootTest
public class SecondIT {

  public static GenericContainer postgreSQLContainer = new PostgreSQLContainer().
    withReuse(true);

  @BeforeAll
  public static void beforeAll() {
    postgreSQLContainer.start();
  }

  @Test
  public void secondTest() {

  }

}

В настоящее время существует PR, который добавляет документацию об этом

Я собрал сообщение в блоге, в котором подробно объясняется , как повторно использовать контейнеры с Testcontainers .

0 голосов
/ 17 июня 2020

Я не уверен, как работает @Testcontainers, но подозреваю, что это может сработать для каждого класса.

Просто сделайте свой singleton stati c, как описано в Singleton pattern , и получите его в каждом тесте от вашего держателя signleton, не определяйте его в каждом тестовом классе.

...