[java] TestContainers의 Best Practice
TestContainers는 개발 및 테스트 환경에서 독립적인 컨테이너를 사용하여 통합 테스트를 간편하게 수행할 수 있는 도구입니다. 이 글에서는 TestContainers를 사용할 때 따라야 할 Best Practice에 대해 알아보겠습니다.
1. 컨테이너 종료하기
테스트를 수행한 후에는 TestContainers에서 사용한 컨테이너를 명시적으로 종료해야 합니다. 이를 위해서는 @AfterAll
어노테이션을 사용하여 테스트 클래스가 종료될 때 컨테이너를 종료하는 메소드를 작성해야 합니다.
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer;
public class MyTest {
private static PostgreSQLContainer<?> container = new PostgreSQLContainer<>("postgres:latest");
@Test
public void myTest() {
// 테스트 내용 작성
}
@AfterAll
public static void cleanUp() {
container.stop();
}
}
2. 리소스 관리
TestContainers는 실제로 도커 컨테이너를 실행하여 테스트를 수행하기 때문에 많은 리소스를 사용할 수 있습니다. 이를 최적화하기 위해 테스트 클래스의 실행 범위를 제한하거나, 여러 테스트 클래스에서 사용하는 경우에는 컨테이너를 공유하는 것이 좋습니다.
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.PostgreSQLContainer;
public class MyTest {
private static PostgreSQLContainer<?> container;
@BeforeAll
public static void setUp() {
container = new PostgreSQLContainer<>("postgres:latest");
container.start();
}
@Test
public void myTest() {
// 테스트 내용 작성
}
@AfterAll
public static void cleanUp() {
container.stop();
}
}
3. 컨테이너 재사용
컨테이너를 매번 새로 생성하고 시작하는 것은 비효율적일 수 있습니다. 따라서 @TestInstance(Lifecycle.PER_CLASS)
어노테이션을 사용하여 테스트 클래스 단위로 컨테이너를 재사용하는 것이 좋습니다.
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.testcontainers.containers.PostgreSQLContainer;
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class MyTest {
private PostgreSQLContainer<?> container;
@BeforeAll
public void setUp() {
container = new PostgreSQLContainer<>("postgres:latest");
container.start();
}
@Test
public void myTest() {
// 테스트 내용 작성
}
@AfterAll
public void cleanUp() {
container.stop();
}
}