마이크로서비스 아키텍처에서는 각각의 서비스가 독립적으로 동작하며, 서로 통신해야 하는 경우가 많습니다. 이때 각 서비스의 상호작용을 테스트하는 것은 중요한 작업입니다. 이번 포스트에서는 TestContainers를 사용하여 마이크로서비스 간 상호작용 테스트를 어떻게 할 수 있는지 알아보겠습니다.
TestContainers란?
TestContainers는 JVM 기반의 테스트 인프라스트럭처 프레임워크입니다. Docker 컨테이너를 사용하여 테스트 실행 환경을 구성하고, 이를 통해 통합 테스트나 종단 간 테스트를 간편하게 실행할 수 있습니다. 즉, 테스트 실행 전에 필요한 컨테이너를 띄워서 테스트 시나리오를 구성하고, 테스트가 완료되면 컨테이너를 종료하는 것입니다.
마이크로서비스 간 상호작용 테스트 설정하기
마이크로서비스 간 상호작용 테스트를 위해 TestContainers를 사용하기 위해서는 다음과 같은 단계를 따를 수 있습니다.
- 의존성 추가
먼저, 프로젝트의 build 파일에 TestContainers 의존성을 추가해야 합니다. Maven을 사용한다면 pom.xml
파일에 다음 의존성을 추가할 수 있습니다.
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.15.0</version>
<scope>test</scope>
</dependency>
- 테스트 클래스 작성
테스트 클래스에는 @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 컨테이너를 생성하는 것을 의미합니다. 이와 마찬가지로 다양한 타입의 컨테이너를 사용할 수 있습니다.
- 컨테이너 설정
컨테이너를 생성할 때에는 필요한 환경을 설정할 수 있습니다. 예를 들어, MySQL 컨테이너의 경우 다음과 같이 설정할 수 있습니다.
@ClassRule
public static MySQLContainer mysql = new MySQLContainer()
.withDatabaseName("test-db")
.withUsername("test-user")
.withPassword("test-pass");
위 코드에서 withDatabaseName
은 데이터베이스 이름, withUsername
은 사용자 이름, withPassword
는 비밀번호를 설정하는 메소드입니다.
- 테스트 메소드 작성
실제로 마이크로서비스 간 상호작용에 대한 테스트 메소드를 작성합니다. 각 서비스의 API를 호출하고 응답을 확인하는 등의 작업을 수행합니다.
@Test
public void testMicroserviceInteraction() {
// 마이크로서비스 간 상호작용에 대한 테스트 로직 작성
String response = myMicroserviceClient.sendRequest();
assertThat(response).isEqualTo("Expected Response");
}
- 테스트 실행
이제 테스트를 실행해 볼 차례입니다. 테스트를 실행하면 TestContainers가 설정한 컨테이너를 띄우고, 테스트가 완료되면 컨테이너를 종료합니다. 이를 통해 실제 환경에서 마이크로서비스의 상호작용을 테스트할 수 있습니다.
결론
TestContainers를 사용하면 간편하게 마이크로서비스 간 상호작용을 테스트할 수 있습니다. Docker 컨테이너를 사용하여 실제 환경과 유사한 테스트 환경을 구성하고, 각 서비스의 상호작용을 테스트할 수 있습니다. 이를 통해 안정적이고 신뢰할 수 있는 마이크로서비스를 개발할 수 있습니다.