TestContainers 사용법

김신영·2023년 11월 22일
0

TDD

목록 보기
1/1
post-thumbnail

공식 문서

Github Repository

TestContainers

  • Testcontainers는 Docker 컨테이너에 래핑된 실제 서비스를 사용하여 로컬 개발 및 테스트 종속성을 부트스트랩하기 위한 쉽고 가벼운 API를 제공하는 라이브러리입니다.
  • Testcontainers를 사용하면 모의 서비스나 메모리 내 서비스 없이 프로덕션에서 사용하는 것과 동일한 서비스에 의존하는 테스트를 작성할 수 있습니다.

테스트컨테이너

TestContainers Workflow

  • 테스트 실행 전: Testcontainers API를 사용하여 필요한 서비스(데이터베이스, 메시징 시스템 등)를 Docker 컨테이너로 시작합니다. 필수 컨테이너가 시작되면 이러한 컨테이너화된 서비스를 사용하도록 애플리케이션 구성을 구성하거나 업데이트하고 선택적으로 테스트에 필요한 데이터를 초기화합니다.

  • 테스트 실행 중: 테스트는 이러한 컨테이너화된 서비스를 사용하여 실행됩니다.

  • 테스트 실행 후: Testcontainers는 테스트가 성공적으로 실행되었는지 또는 실패했는지 여부에 관계없이 컨테이너를 삭제합니다.

workflow

Gradle Setting

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'
}

Test code using Test Container

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);
    }
}

Test code using Test Container for Redis

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));
    }
}
profile
Hello velog!

0개의 댓글