반응형
독립적인 테스트 환경을 구축하는 방법으로 Embedded 환경을 사용한다
Embedded 환경을 구축하는 방법으로는
1. H2 데이터베이스 사용
2. Embedded MySQL ( wix mysql )
3. TestContainer
가 있는데 이번 포스트에서는 Embedded MySQL( wix mysql )을 살펴보려고 합니다
Embedded MySQL
- 이름 그래도 어플리케이션 내장형 MySQL입니다
- 오픈 소스로 지원되는 wix-embedded-mysql을 사용하여 구성할 수 있습니다
- GitHub 공식 사이트
- 빌드 의존성 설정
- maven
// maven <dependency> <groupId>com.wix</groupId> <artifactId>wix-embedded-mysql</artifactId> <version>x.y.z</version> // 원하는 버전 명시 <scope>test</scope> </dependency>
- gradle
// gradle dependencies { ... testImplementation 'com.wix:wix-embedded-mysql:x.y.z' // 버전에 맞게 x.y.z 설정 }
- maven
- 사용법
// Wix MySQL MysqldConfig config = aMysqldConfig(v8_0_17) .withCharset(Charset.aCharset("utf8mb4", "utf8mb4_bin")) .withPort(13306) .withUser(USER, KEY) .withTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault())) .withServerVariable("sql_mode", "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION") .withServerVariable("max_connect_errors", 666) .build(); EmbeddedMysql server = EmbeddedMysql.anEmbeddedMysql(config) .addSchema("test") .start();
- EmbeddedMysql 객체 생성
- Embedded MySQL을 실행시키는 객체입니다
- anEmbeddedMysql 메서드
- 전달되는 MysqldConfig 객체를 통해 생성되는 MySQL 데이터베이스 설정을 할 수 있습니다
- addSchema 메서드
- 사용할 스키마를 정의할 수 있습니다
- 예제처럼 별다른 설정없이 단순히 이름만 전달할 수도 있으며, SchemaConfig 객체를 생성하여 설정이 추가된 스키마를 전달할 수도 있습니다
- MysqldConfig 객체 생성
- 생성할 MySQL 데이터베이스 설정을 담당하는 객체
- aMysqldConfig(v8_0_17)
- 사용할 버전을 명시
- withCharset, withPort, withTimeZone
- 생성할 데이터베이스의 인코딩, 포트, 타임존을 명시
- withUser
- 접속을 위한 계정 정보, 패스워드를 설정할 수 있습니다
- withServerVariable
- 글로벌 설정값들을 조정할 수 있습니다
- EmbeddedMysql 객체 생성
실제 활용 예시
- 해당 내용은 예시입니다. 더 좋은 방법있으시면 알려주세요!!!!
- 활용 예시
- Embedded MySQL 설정 클래스 분리
// Embedded MySQL Config @Transactional @SpringBootTest @ActiveProfiles("test") public abstract class EmbeddedDbSupport { public static final String DB_URL = "jdbc:mysql://127.0.0.1:13306/test?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&useSSL=true&verifyServerCertificate=false"; private static EmbeddedMysql server; private static String USER = "test"; private static String KEY = "test1234"; static { MysqldConfig config = aMysqldConfig(v8_0_17) .withCharset(Charset.aCharset("utf8mb4", "utf8mb4_bin")) .withPort(13306) .withUser(USER, KEY) .withTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault())) .withServerVariable("sql_mode", "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION") .withServerVariable("max_connect_errors", 666) .build(); server = EmbeddedMysql.anEmbeddedMysql(config) .addSchema("test") .start(); } }
- test profile 설정
// application-test.yml spring: config: activate: on-profile: test datasource: url: jdbc:mysql://127.0.0.1:13306/test?characterEncoding=UTF-8&serverTimezone=Asia/Seoul&profileSQL=true&maxQuerySizeToLog=999999&logger=Slf4JLogger username: test password: test1234 ...
- 각 test 클래스에 Embedded MySQL 설정 클래스 extends
// Test Class public class SimpleTest extends EmbeddedDbSupport { @Autowired private SimpleRepository ... @Test void test() { // given ... // when ... // then ... } }
- Embedded MySQL 설정 클래스 분리
728x90
반응형
'Tech > Test' 카테고리의 다른 글
JsonPath란? (0) | 2021.09.06 |
---|---|
JUnit 5 공식 레퍼런스 (0) | 2021.08.25 |
Mockito vs BDDMockito (0) | 2021.08.12 |
Jacoco를 이용해 테스트 커버리지 관리해보자 (0) | 2021.08.08 |