공부하는 스누피

[Spring Boot/JUnit5] Testcontainers 본문

Web/Spring

[Spring Boot/JUnit5] Testcontainers

커피맛스누피 2021. 10. 7. 13:49

1. 개요

Testcontainers는 JUnit test를 지원하는 Java 라이브러리로, Docker로 작동시킬 수 있는 일반 DB, 셀레니움같은 인스턴스들을 간편하게 테스트용으로 사용할 수 있게 한다.

Testcontainers의 장점은 다음과 같다.

* 데이터 액세스 레이어 통합 테스트: MySQL, PostgreSQL, Oracle 데이터베이스의 컨테이너화된 인스턴스를 사용해 데이터 액세스 레이어 부분의 코드를 테스트할 수 있다.

통합 테스트 : 데이터 액세스 레이어뿐만 아니라 전체 애플리케이션 통합 테스트를 지원한다.

UI/인수 테스트 : 셀레니움을 지원해 각 테스트가 독립된 인스턴스의 브라우저에서 실행된다.

dev 데이터베이스는 주로 테스트용으로 쓰이지만, 테스트 데이터가 격리되지 않아 이전 테스트 결과나 다른 개발자가 테스트에 영향을 미칠 수 있다. 그래서 Unit Test에서는 주로 In-Memory DB인 H2를 사용하지만, 복잡한 쿼리를 실행하는 통합 테스트의 경우 적합하지 않다. H2가 PostgreSQL을 지원한다고 하지만, Sequence나 권한 설정, 특정 함수는 호환되지 않아 테스트만을 위한 쿼리를 다시 작성하는 것은 비효율적이기 때문이다.

Testcontainers는 @TestContainers를 붙인 테스트 실행 시 Docker로 운영 DB와 동일한 환경의 DB 인스턴스를 생성한다. 테스트할 때마다 컨테이너 생성/삭제 스크립트를 실행할 필요가 없고, 테스트의 lifecycle에 맞춰 인스턴스를 조작할 수 있다. 이처럼 Testcontainers는 테스트 인스턴스 분리를 통해 테스트 및 테스트 데이터의 멱등성을 높인다.

 

2. 환경 설정

pom.xml

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.16.0</version>
    <scope>test</scope>
</dependency>
<dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>1.16.0</version>
      <scope>test</scope>
 </dependency>
<dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>postgresql</artifactId>
      <version>1.16.0</version>
      <scope>test</scope>
</dependency>


Test용 jdbc 프로퍼티 설정

기존 설정과는 별도의 jdbc url을 설정해야 한다. 매번 인스턴스가 새로 생성되기 때문에 컨테이너의 port가 지정되지 않아 TestContainer에서 나중에 따로 지정해준다고 한다.

spring:
    datasource:
       url: jdbc:tc:postgresql:///schema_name
       driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
       username: sa
       password:


Schema 생성 스크립트 실행

인스턴스가 시작될 때 SQL을 실행시킬 수 있다. 프로퍼티의 jdbc url에 다음 쿼리를 붙이면 된다.

jdbc:tc:postgresql:///schema_name?TC_INITSCRIPT=file:src/test/resources/schema.sql

 

3. 테스트 적용 방법

 

@Testcontainers 

테스트할 클래스나 메서드 위에 @Testcontainers를 붙이면 해당되는 테스트 실행 시 DB 인스턴스가 만들어진다.


@Container

실행할 컨테이너를 정할 수 있다.

@Container
protected static PostgreSQLContainer<?> postgreSQLContainer = new PostgreSQLContainer<>("postgres");


로그 출력 설정

@BeforeAll
static void beforeAll(){
    Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log);
    postgreSQLContainer.followOutput(logConsumer);
}


@BeforeAll을 붙이면 Testcontainers가 실행되기 전에 해당 메서드를 수행한다. 여기서 컨테이너가 출력하는 로그를 Slf4j와 연결해 주면 로그를 출력할 수 있다.

 

 

[참고]

https://www.testcontainers.org/

 

Testcontainers

 Testcontainers About Testcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. Testcontainers make the followi

www.testcontainers.org

https://umbum.dev/1127

 

[Test] 통합 Test에 in-memory DB 를 쓰는게 더 좋을까?

블로그 포스팅은 업데이트 X. 상세 내용은 위 pdf 참조. 운영에서는 다른 DB 쓰고, TC는 다른 DB(In-Memory) 사용할 때의 문제점 유닛테스트에서는 DB를 안쓰거나, 간단한 쿼리 정도 사용하게 되므로 In-M

umbum.dev

--> H2 데이터베이스로 삽질하다가 Testcontainers를 알게 된 포스트..

https://wedul.site/649

 

Junit5 Test Container사용하여 테스트 환경 구축하기 (인프런 백기선님 강의 정리)

도커와 테스트 (TestContainers) 테스트를 위해서는 운영과 동일한 형태의 개발 환경에서 테스트 하는 것이 중요하다. 하지만 매번 동일하게 환경을 구축할 수 없고 모든 개발 자들과 같은 환경을 맞

wedul.site

 

Comments