[SpringBootTest] @Testcontainer 로 테스트 환경 구축하기

hyozkim·2021년 9월 29일
2

SpringBootTest

목록 보기
3/4
post-thumbnail

들어가면서 👋

SpringBootTest 코드를 작성하면서 매번 다른 개발자들이 각 PC에서 Local Database를 세팅해야 하는 일은 매우 번거롭게 느껴졌다. 그렇다고 개발계 서버용 DB를 사용하는 것도 순수 테스트를 위해 사용하기엔 기존 데이터가 엉망(?)이 될 수도 있을거 같았다.

H2-database처럼 임시(?) DB 환경을 구축하는 방법을 MySQL 데이터베이스 환경에서도 적용하려면 어떻게 해야할지 서칭해보았고, @Testcontainer 알게 되었다.

About testcontainers.org

Docker Compose

나 같은 경우에는 docker 환경에서 MySQL DB를 실행하도록 docker-compose.yml 을 작성했다.

docker-compose.yml

version: '3.2'

services:
  wsin-mysql:
    image: mysql/mysql-server:5.6
    environment:
      MYSQL_ROOT_HOST: 'localhost'
      MYSQL_DATABASE: 'test_db'
      MYSQL_USER: 'test'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
      TZ: Asia/Seoul
    ports:
      - '3306:3306'
    volumes:
      - ./data/schema.sql:/docker-entrypoint-initdb.d/data/schema.sql
      - ./data/data.sql:/docker-entrypoint-initdb.d/data/data.sql

    command: ['default-character-set=utf8',
              '--character-set-server=utf8mb4',
              '--character-set-system=utf8',
              '--character-set-client=utf8mb4',
              '--character-set-connection=utf8mb4',
              '--character-set-filesystem=utf8mb4',
              '--character-set-results=utf8mb4',
              '--character-set-database=utf8mb4',
              '--collation-server=utf8mb4_unicode_ci',
              '--skip-character-set-client-handshake']

docker-compose.yml 파일에 Container DB 정보 및 옵션 설정

  • DB Character Set utf8mb4 설정
  • schema.sql 생성 테이블도 character set utf8mb4 설정

application-test.properties

#SPRING
spring.datasource.hikari.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.hikari.jdbc-url=jdbc:tc:mysql:5.6.34://localhost/test_db?serverTimezone=UTC&useSSL=false&autoReconnection=true&useUnicode=true&characterEncoding=UTF-8
spring.datasource.hikari.username=test
spring.datasource.hikari.password=
spring.datasource.sql-script-encoding=UTF-8
spring.datasource.schema=classpath:data/schema.sql
spring.datasource.data=classpath:data/data.sql
spring.datasource.initialization-mode=always
  • jdbc-url 설정
    • org.testcontainers.jdbc.ContainerDatabaseDriver
    • testcontainer url 사용
  • jdbc-url option 설정
    • serverTimezone
    • useSSL
    • autoReconnection
    • useUnicode
    • characterEncoding
  • mysql 버전 5.6
  • script file path
    • data/schema.sql
    • data/data.sql
  • initialization-mode
    • 매번 실행때마다 실행 조건.
    • always 로 설정.
    • never 한번 실행 후 이후 실행하지 않음

DockerComposeContainer 선언 & 주입

// ---
// ## Test Container
// ## Initialize Docker Compose
@Container
static final DockerComposeContainer composeContainer;

static
{
    composeContainer = new DockerComposeContainer(new 	File("src/test/resources/docker-compose.yml"));
    composeContainer.start();
}

Project Source Path


👉 Dockerfile VS docker-compose 차이

Dockerfiledocker-compose
docker image생성docker run 환경

@Testcontainer

Testcontainer integration test 환경 구축
1) build.gradle dependency 추가
2) Set @Testcontainer
3) Test 실행 & 확인

build.gradle

testImplementation 'org.testcontainers:junit-jupiter:1.16.0'
testImplementation 'org.testcontainers:mysql:1.16.0'

@TestContainer

@Testcontainers
@ActiveProfiles("test")
public class TestContainerClass {

    // ---
    // ## Test Container
    // ## Initialize Docker Compose
    @Container
    static final DockerComposeContainer composeContainer;

    static
    {
        composeContainer = new DockerComposeContainer(new File("src/test/resources/docker-compose.yml"));
        composeContainer.start();
    }
    
    ... 

테스트 환경 구축이 이제 완료되었다.

실제 테스트를 실행시 docker ps 명령어로 확인해보면 다음과 같이 컨테이너가 생성되었다가, 종료되면 사라진다.

참고

Spring testcontainer를 이용한 독립적 환경 구축
Testcontainer로 멱등성 있는 integration 구축하기

profile
차근차근 develog

0개의 댓글