본문 바로가기
Tech/Test

Embedded MySQL를 이용해 테스트 환경 구축해보기

반응형
독립적인 테스트 환경을 구축하는 방법으로 Embedded 환경을 사용한다
Embedded 환경을 구축하는 방법으로는
1. H2 데이터베이스 사용
2. Embedded MySQL ( wix mysql )
3. TestContainer
가 있는데 이번 포스트에서는 Embedded MySQL( wix mysql )을 살펴보려고 합니다

Embedded MySQL

  • 이름 그래도 어플리케이션 내장형 MySQL입니다
  • 오픈 소스로 지원되는 wix-embedded-mysql을 사용하여 구성할 수 있습니다
  • GitHub 공식 사이트
 

GitHub - wix/wix-embedded-mysql: embedded mysql based on https://github.com/flapdoodle-oss/de.flapdoodle.embed.process

embedded mysql based on https://github.com/flapdoodle-oss/de.flapdoodle.embed.process - GitHub - wix/wix-embedded-mysql: embedded mysql based on https://github.com/flapdoodle-oss/de.flapdoodle.embe...

github.com

  • 빌드 의존성 설정
    • 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 설정
      }​
  • 사용법
    // 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
        • 글로벌 설정값들을 조정할 수 있습니다

 

실제 활용 예시

  • 해당 내용은 예시입니다. 더 좋은 방법있으시면 알려주세요!!!!
  • 활용 예시
    • 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
              ...
              
          }
      }
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