[java] TestContainers를 사용하여 Java 애플리케이션을 테스트하는 방법

Java 애플리케이션을 개발하고 테스트하는 동안에는 종종 외부 리소스에 의존하는 상황을 직면하게 됩니다. 예를 들어, 데이터베이스나 메시지 브로커와 같은 외부 시스템과 통신해야 할 수 있습니다. 이러한 외부 시스템을 모킹하거나 가짜 구현체를 사용하여 테스트를 진행할 수도 있지만, 실제 시스템을 사용하는 테스트가 가장 신뢰할 수 있는 방법입니다.

TestContainers는 이러한 문제를 해결하기 위해 도커 컨테이너를 사용하여 테스트 환경을 만들어주는 유용한 도구입니다. 이를 사용하면 테스트 실행 시에 도커 컨테이너를 시작하고 필요한 외부 시스템을 실행하는 것이 가능해집니다. 이를 통해 개발 환경과 실제 운영 환경 사이의 차이를 최소화하고 안정적인 테스트를 수행할 수 있습니다.

TestContainers 설치

TestContainers를 사용하기 위해서는 먼저 의존성을 추가해야 합니다. Maven 프로젝트를 사용한다면 pom.xml 파일에 다음 의존성을 추가합니다:

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

Gradle 프로젝트를 사용한다면 build.gradle 파일에 다음 의존성을 추가합니다:

testImplementation 'org.testcontainers:testcontainers:1.15.1'

Docker Compose 파일 작성

TestContainers를 사용하여 애플리케이션 테스트를 위해 필요한 Docker 컨테이너를 정의하기 위해 Docker Compose 파일을 작성해야 합니다. 이 파일에 필요한 서비스를 정의하고, 각 서비스의 환경 변수, 포트 매핑 등을 설정할 수 있습니다.

예를 들어, MySQL 데이터베이스를 사용하는 애플리케이션을 테스트한다고 가정해 보겠습니다. 이를 위해 다음과 같은 Docker Compose 파일을 작성할 수 있습니다:

version: '3'

services:
  mysql:
    image: mysql:8.0
    ports:
      - '3306:3306'
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=testdb

이 예제에서는 MySQL 8.0 이미지를 사용하고, 포트 3306을 호스트와 연결합니다. 그리고 MYSQL_ROOT_PASSWORDMYSQL_DATABASE 환경 변수를 설정하여 비밀번호와 데이터베이스 이름을 지정합니다. 이 파일을 프로젝트 디렉토리에 docker-compose.yml로 저장합니다.

테스트 작성

이제 TestContainers를 사용하여 애플리케이션 테스트를 작성할 수 있습니다.

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 MyTest {

    @Container
    private static MySQLContainer mysqlContainer = new MySQLContainer()
        .withDatabaseName("testdb")
        .withUsername("root")
        .withPassword("password");

    @Test
    public void testSomething() {
        // MySQLContainer에 대한 접근 정보를 사용하여 애플리케이션을 테스트합니다.
    }
}

위의 예제 코드에서는 @Container 어노테이션과 MySQLContainer 클래스를 사용하여 도커 컨테이너를 생성합니다. MySQLContainer의 생성자에는 필요한 환경 정보를 전달할 수 있습니다. 예를 들어, 데이터베이스 이름, 사용자 이름, 비밀번호를 설정합니다.

@Test 어노테이션을 사용하여 테스트 메소드를 정의하고, MySQLContianer의 접근 정보를 사용하여 테스트 코드를 작성합니다.

테스트 실행

테스트를 실행하기 전에 Docker 및 Docker Compose가 설치되어 있어야 합니다. 그런 다음 IDE나 빌드 도구에서 일반적인 테스트 실행을 수행하면 TestContainers가 Docker 컨테이너를 시작하고 테스트를 실행합니다. 컨테이너는 테스트 실행 이후 자동으로 정리됩니다.

결론

TestContainers를 사용하여 Java 애플리케이션을 테스트하는 방법에 대해 알아보았습니다. 이 도구를 사용하면 외부 서비스에 대한 종속성을 가진 애플리케이션을 테스트하는 것이 간편해집니다. Docker 컨테이너를 사용하여 외부 시스템을 모사하고 테스트할 수 있으므로 개발과 테스트 환경 사이의 일관성을 유지할 수 있습니다. 따라서 신뢰할 수 있는 테스트를 작성하여 애플리케이션의 품질을 높일 수 있습니다.

참고 자료