본문 바로가기
스프링 부트

[스프링] TestContainer란?

by illlilillil 2022. 10. 4.

 

새로 하는 프로젝트에서 TestContainer를 이용해 멱등성 있는 테스트를 구축하고 싶어 알아보게 되었다.

TestContainer란?

Junit Test를 지원하는 자바 라이브러리, Docker 컨테이너를 사용할 수 있도록 일회용 인스턴스를 사용한다.

어떤 환경에서든 독립적이고 멱등성 있는 테스트 환경을 제공한다.

 

기존의 방식

H2같은 인메모리 DB 사용 또는 테스트용 DB를 구축해서 사용했다.

인메모리 DB는 실 사용 DB와 방언 차이가 있을 수 있다.

테스트용 DB는 구축하는데 비용이 든다.

Local DB를 띄워서 하더라도 각 개발자 환경에 맞춰야 한다.

 

TestContainer 방식을 사용하면

일회성 Docker 컨테이너를 띄우기 때문에 실 DB와 똑같다.

개발자가 테스트용 DB에 대한 리소스를 낭비하지 않아도 된다.

매번 같은 환경에서 같은 데이터를 테스트하기 때문에 멱등성 있는 테스트가 보장된다.

 

단점으로는 테스트 컨테이너 구축에 시간이 조금 걸린다.

 


실습해보기 

Build.gradle 설정

//testContainer
implementation("org.mariadb.jdbc:mariadb-java-client:2.7.0")
testImplementation("org.testcontainers:testcontainers:1.17.3")
testImplementation("org.testcontainers:mariadb:1.17.3")
testImplementation("org.testcontainers:junit-jupiter:1.17.3")

MariaDBTestContainer.class -> test 폴더 안에 위치

@Testcontainers
public class MariadbTestContainer {

  Logger logger = LoggerFactory.getLogger(getClass());

  @Container
  private static final MariaDBContainer<?> MARIA_DB_CONTAINER = new MariaDBContainer(
      "mariadb:10.5");

  @DynamicPropertySource
  public static void properties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url",MARIA_DB_CONTAINER::getJdbcUrl);
    registry.add("spring.datasource.driver-class-name",MARIA_DB_CONTAINER::getDriverClassName);
    registry.add("spring.datasource.username",MARIA_DB_CONTAINER::getUsername);
    registry.add("spring.datasource.password",MARIA_DB_CONTAINER::getPassword);
  }
}

Test용 Yml -> application.yml 설정

spring:
  datasource:
    url: jdbc:tc:mariadb:10.5:///test
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
    username: test
    password: test

 

댓글