새로 하는 프로젝트에서 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
'스프링 부트' 카테고리의 다른 글
[스프링] 톰캣의 NIO Connector (0) | 2022.10.08 |
---|---|
[스프링] 히카리CP란? (0) | 2022.10.07 |
[스프링] String 클래스 자동 trim 메서드 적용하기 (0) | 2022.10.02 |
[개발방법론] DDD란 무엇인가? (0) | 2022.09.10 |
[스프링] 재고 시스템으로 알아보는 동시성 문제 해결 방법 (0) | 2022.09.02 |
댓글