[java] TestContainers를 사용하여 마이크로서비스 간 상호작용 테스트하기

마이크로서비스 아키텍처에서는 각각의 서비스가 독립적으로 동작하며, 서로 통신해야 하는 경우가 많습니다. 이때 각 서비스의 상호작용을 테스트하는 것은 중요한 작업입니다. 이번 포스트에서는 TestContainers를 사용하여 마이크로서비스 간 상호작용 테스트를 어떻게 할 수 있는지 알아보겠습니다.

TestContainers란?

TestContainers는 JVM 기반의 테스트 인프라스트럭처 프레임워크입니다. Docker 컨테이너를 사용하여 테스트 실행 환경을 구성하고, 이를 통해 통합 테스트나 종단 간 테스트를 간편하게 실행할 수 있습니다. 즉, 테스트 실행 전에 필요한 컨테이너를 띄워서 테스트 시나리오를 구성하고, 테스트가 완료되면 컨테이너를 종료하는 것입니다.

마이크로서비스 간 상호작용 테스트 설정하기

마이크로서비스 간 상호작용 테스트를 위해 TestContainers를 사용하기 위해서는 다음과 같은 단계를 따를 수 있습니다.

  1. 의존성 추가

먼저, 프로젝트의 build 파일에 TestContainers 의존성을 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음 의존성을 추가할 수 있습니다.

<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>testcontainers</artifactId>
  <version>1.15.0</version>
  <scope>test</scope>
</dependency>
  1. 테스트 클래스 작성

테스트 클래스에는 @ClassRule 어노테이션을 사용하여 TestContainers를 시작하고 종료하는 로직을 작성합니다. 또한, @Test 어노테이션을 사용하여 실제 테스트 메소드를 작성합니다.

import org.junit.ClassRule;
import org.junit.Test;
import org.testcontainers.containers.MySQLContainer;

public class MicroserviceInteractionTest {
 
    @ClassRule
    public static MySQLContainer mysql = new MySQLContainer();

    @Test
    public void testMicroserviceInteraction() {
        // 마이크로서비스 간 상호작용에 대한 테스트 로직 작성
    }
}

위 코드에서 MySQLContainer는 테스트에 사용할 MySQL 컨테이너를 생성하는 것을 의미합니다. 이와 마찬가지로 다양한 타입의 컨테이너를 사용할 수 있습니다.

  1. 컨테이너 설정

컨테이너를 생성할 때에는 필요한 환경을 설정할 수 있습니다. 예를 들어, MySQL 컨테이너의 경우 다음과 같이 설정할 수 있습니다.

@ClassRule
public static MySQLContainer mysql = new MySQLContainer()
    .withDatabaseName("test-db")
    .withUsername("test-user")
    .withPassword("test-pass");

위 코드에서 withDatabaseName은 데이터베이스 이름, withUsername은 사용자 이름, withPassword는 비밀번호를 설정하는 메소드입니다.

  1. 테스트 메소드 작성

실제로 마이크로서비스 간 상호작용에 대한 테스트 메소드를 작성합니다. 각 서비스의 API를 호출하고 응답을 확인하는 등의 작업을 수행합니다.

@Test
public void testMicroserviceInteraction() {
    // 마이크로서비스 간 상호작용에 대한 테스트 로직 작성
    String response = myMicroserviceClient.sendRequest();
    assertThat(response).isEqualTo("Expected Response");
}
  1. 테스트 실행

이제 테스트를 실행해 볼 차례입니다. 테스트를 실행하면 TestContainers가 설정한 컨테이너를 띄우고, 테스트가 완료되면 컨테이너를 종료합니다. 이를 통해 실제 환경에서 마이크로서비스의 상호작용을 테스트할 수 있습니다.

결론

TestContainers를 사용하면 간편하게 마이크로서비스 간 상호작용을 테스트할 수 있습니다. Docker 컨테이너를 사용하여 실제 환경과 유사한 테스트 환경을 구성하고, 각 서비스의 상호작용을 테스트할 수 있습니다. 이를 통해 안정적이고 신뢰할 수 있는 마이크로서비스를 개발할 수 있습니다.

참고자료