[java] TestContainers를 사용한 마이크로서비스 환경에서의 병렬 테스트

TestContainers는 Docker를 사용해 간단하게 컨테이너 기반의 통합 테스트를 수행할 수 있는 Java 라이브러리입니다. 이를 이용하면 실제 환경과 동일한 데이터베이스나 메시지 큐 등의 외부 의존성을 가진 서비스를 사용하여 테스트할 수 있습니다. 이번 글에서는 TestContainers를 사용하여 마이크로서비스 환경에서 병렬 테스트를 수행하는 방법에 대해 알아보겠습니다.

1. TestContainers 소개

TestContainers는 테스트 코드 내에서 독립된 Docker 컨테이너들을 실행하며, 이를 통해 테스트 환경을 구축하고 실제 서비스와 동일한 조건으로 테스트를 수행할 수 있습니다. 여러가지 DBMS, 메시지 큐, 웹서버 등 다양한 종류의 컨테이너를 지원하며, 이를 활용하여 복잡한 통합 테스트 시나리오를 작성할 수 있습니다.

2. 병렬 테스트의 필요성

마이크로서비스 아키텍처에서는 여러 개의 서비스가 동시에 동작하므로, 이러한 서비스들의 상호작용을 효율적으로 테스트하기 위해서는 병렬 테스트가 필요합니다. 병렬 테스트를 수행함으로써 동시에 여러 서비스를 테스트할 수 있으며, 테스트 수행 시간을 단축시켜 개발자들의 생산성을 향상시킬 수 있습니다.

3. TestContainers와 JUnit의 통합

TestContainers는 JUnit과도 통합이 잘되어 있어서 테스트 코드 작성 시 JUnit의 어노테이션과 함께 사용할 수 있습니다. 병렬 테스트를 수행하기 위해서는 @Test 어노테이션 대신 @TestMethodOrder(MethodOrderer.Alphanumeric.class) 어노테이션을 사용하여 테스트 메소드의 실행 순서를 지정해 주어야 합니다.

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
public class MyParallelTests {

    @Container
    private static final MariaDBContainer<?> mariadbContainer = new MariaDBContainer<>("mysql:latest");

    @Test
    void test1() {
        // some tests using mariadbContainer
    }

    @Test
    void test2() {
        // some tests using mariadbContainer
    }

    // ...
}

4. 병렬 테스트 수행하기

병렬 테스트를 수행하기 위해서는 병렬 실행할 테스트 메소드들을 별도의 클래스로 분리하거나, 테스트 클래스 내에서 @RepeatedTest 어노테이션을 사용하여 여러 번 반복 실행할 수 있도록 설정해주어야 합니다. 이 때, @Container 어노테이션을 사용하여 각 테스트 메소드에서 사용할 컨테이너를 정의해줄 수 있습니다.

import org.junit.jupiter.api.RepeatedTest;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.utility.DockerImageName;

public class MyParallelTests {

    @Container
    private static final GenericContainer<?> kafkaContainer =
            new GenericContainer<>(DockerImageName.parse("confluentinc/cp-kafka:latest"))
                    .withExposedPorts(9092);

     @RepeatedTest(10)
     void test() {
         // some tests using kafkaContainer
     }

     // ...
}

5. 마무리

위에서 살펴본 내용을 바탕으로, TestContainers를 사용하여 마이크로서비스 환경에서 병렬 테스트를 수행하는 방법에 대해 알아보았습니다. 병렬 테스트를 통해 개발자들은 실제 환경과 유사한 조건에서 테스트를 수행할 수 있고, 시간을 단축시켜 개발 생산성을 향상시킬 수 있게 됩니다.

더 자세한 내용은 TestContainers 공식 문서를 참고하시기 바랍니다.