SpringBootTest 코드를 작성하면서 매번 다른 개발자들이 각 PC에서 Local Database를 세팅해야 하는 일은 매우 번거롭게 느껴졌다. 그렇다고 개발계 서버용 DB를 사용하는 것도 순수 테스트를 위해 사용하기엔 기존 데이터가 엉망(?)이 될 수도 있을거 같았다.
H2-database처럼 임시(?) DB 환경을 구축하는 방법을 MySQL 데이터베이스 환경에서도 적용하려면 어떻게 해야할지 서칭해보았고, @Testcontainer
알게 되었다.
나 같은 경우에는 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 정보 및 옵션 설정
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
org.testcontainers.jdbc.ContainerDatabaseDriver
5.6
data/schema.sql
data/data.sql
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 차이
Dockerfile | docker-compose |
---|---|
docker image생성 | docker run 환경 |
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 구축하기