테스트 실행 전: Testcontainers API를 사용하여 필요한 서비스(데이터베이스, 메시징 시스템 등)를 Docker 컨테이너로 시작합니다. 필수 컨테이너가 시작되면 이러한 컨테이너화된 서비스를 사용하도록 애플리케이션 구성을 구성하거나 업데이트하고 선택적으로 테스트에 필요한 데이터를 초기화합니다.
테스트 실행 중: 테스트는 이러한 컨테이너화된 서비스를 사용하여 실행됩니다.
테스트 실행 후: Testcontainers는 테스트가 성공적으로 실행되었는지 또는 실패했는지 여부에 관계없이 컨테이너를 삭제합니다.
ext {
set('testcontainersVersion', "1.18.0")
}
dependencies {
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:mysql'
testImplementation 'org.testcontainers:postgresql'
testImplementation 'com.redis.testcontainers:testcontainers-redis'
}
class CustomerControllerWithMySQLTest {
private final static String TEST_CONTAINER_IMAGE_TAG = "mysql:8.0.26";
static MySQLContainer<?> mysql = new MySQLContainer<>(TEST_CONTAINER_IMAGE_TAG);
@BeforeAll
static void beforeAll() {
mysql.start();
}
@AfterAll
static void afterAll() {
mysql.stop();
}
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.datasource.url", mysql::getJdbcUrl);
registry.add("spring.datasource.username", mysql::getUsername);
registry.add("spring.datasource.password", mysql::getPassword);
}
}
class RedisContainerTest {
private static final String REDIS_DOCKER_IMAGE_TAG = "redis:7.2.3-alpine";
private static final int REDIS_PORT = 6379;
static GenericContainer<?> redis = new GenericContainer<>(
REDIS_DOCKER_IMAGE_TAG
).withExposedPorts(REDIS_PORT);
@BeforeAll
static void beforeAll() {
redis.start();
}
@AfterAll
static void afterAll() {
redis.stop();
}
@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.redis.host", redis::getHost);
registry.add("spring.data.redis.port", () -> redis.getMappedPort(REDIS_PORT));
}
}