[java] TestContainers로 테스트 환경 초기화하기

소개

TestContainers는 자바 기반의 테스트 환경을 쉽게 설정할 수 있게 도와주는 도구입니다. 일반적으로 데이터베이스나 메시지 큐와 같은 외부 서비스를 필요로 하는 통합 테스트를 수행할 때 유용합니다.

이 글에서는 TestContainers를 사용하여 MySQL 데이터베이스를 테스트 환경으로 초기화하는 방법에 대해 알아보겠습니다.

설정하기

먼저, Maven 또는 Gradle 프로젝트의 의존성에 TestContainers MySQL 모듈을 추가해야 합니다.

Maven을 사용하는 경우 다음과 같이 pom.xml 파일에 의존성을 추가할 수 있습니다:

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>mysql</artifactId>
    <version>1.15.3</version>
    <scope>test</scope>
</dependency>

Gradle을 사용하는 경우 다음과 같이 build.gradle 파일에 의존성을 추가할 수 있습니다:

testImplementation 'org.testcontainers:mysql:1.15.3'

테스트 코드 작성하기

다음으로, TestContainers를 사용하여 MySQL 컨테이너를 생성하고 테스트 데이터베이스를 초기화하는 테스트 코드를 작성해 보겠습니다.

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class DatabaseIntegrationTest {

    @Container
    private static final MySQLContainer<?> mysqlContainer = new MySQLContainer<>("mysql:latest")
            .withDatabaseName("test")
            .withUsername("testuser")
            .withPassword("testpassword");

    @BeforeAll
    static void beforeAll() {
        mysqlContainer.start();
        // 테스트 데이터베이스 초기화 작업 수행
    }

    @Test
    void testSomething() {
        // 테스트 코드 작성
    }
}

위의 코드에서 @Container 어노테이션은 TestContainers에게 MySQL 컨테이너 인스턴스를 관리하도록 지시합니다. @BeforeAll 메서드는 테스트 실행 전에 MySQL 컨테이너를 시작하고 테스트 데이터베이스를 초기화하는 작업을 수행합니다.

실행하기

테스트를 실행하려면 단순히 테스트 클래스를 실행하시면 됩니다. 대부분의 통합 테스트 실행 환경에서는 로컬 환경에 MySQL이 설치되어 있어야 합니다. TestContainers는 테스트 환경에 자동으로 독립적인 컨테이너를 생성하여 기대하는 테스트 환경을 제공합니다.

결론

TestContainers를 사용하면 자바 통합 테스트 환경을 깔끔하게 관리할 수 있습니다. 이 글에서는 TestContainers를 사용하여 MySQL 데이터베이스를 테스트 환경으로 초기화하는 방법에 대해 알아보았습니다. TestContainers를 사용해 다른 외부 서비스와 연동하는 통합 테스트를 작성해 보세요.