본문 바로가기
[IT]/SpringBoot

[Spring Boot] 테스트 데이터 생성 (.sql 실행)

by dop 2021. 4. 29.

개요.

단위테스트, 통합테스트 코드를 작성하면서, 한 가지 의문점이 생겼다. 로컬 환경에서 테스트 할 때는 더미데이터를 직접 넣어둔 상태로 테스트를 진행했다.(혹은 테스트코드 앞단에 Rollback(false)로 하여 삽입) 하지만, sql파일을 프로젝트에 넣어두고 실행하는 것으로 더미데이터를 생성할 수 있다.

환경

  • Spring Boot 2.4.4
  • Junit5
  • h2 DB (In-memory)

gradle dependency

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'com.h2database:h2'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    implementation('org.springframework.boot:spring-boot-starter-validation')
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

data.sql 파일

파일은 test/db/h2 디렉토리 아래에 data.sql이라는 이름으로 생성.

내부코드는 다음과 같다.

INSERT INTO user (create_time, city,detail, street, email, birthday, grade, point, status, name, nickname ,password)VALUES
    ('2021-04-27 11:01:48.594485', 'seoul', 'room 11673', '1673street', 'user1673@naver.com', '2013-03-08', 2, 1000, 'ACTIVE', 'Clone1673', 'nick1673', '12341234'),
    ('2021-04-27 11:01:50.376906', 'seoul', 'room 199716', '99716street', 'user99716@naver.com', '1994-11-18', 2, 1000, 'ACTIVE', 'Clone99716', 'nick99716', '12341234');

INSERT INTO orders VALUES (1, '2021-04-27 11:01:50.562911', 'DELIVERY', 1, '치킨 같이 시켜 먹어요!', '2021-04-27 15:01:50.464900', 32000, 0, NULL, 0, '치킨먹을사람~', 1);

INSERT INTO comment (comment_id, create_time, content, status, order_id, user_id) VALUES
    (4, '2021-04-27 11:01:50.719477', '댓글 작성 합니다', 'NORMAL', 1, 2);

INSERT INTO party VALUES
    (3, '2021-04-27 11:01:50.604911', '글 게시자 본인 입니다.', 6000, 'JOIN', 1, 1);

INSERT INTO tag VALUES
    (1, '치킨', 1),
    (2, '음식', 1);

Heidi SQL의 sql export 기능으로 가져왔다가 테이블 명에 " << 때문에 고생했다.(`,'," 꼭 주의하도록 하자!)

application.yml 파일

spring:
  output:
    ansi:
      enabled: always #로그 색상추가
  datasource:
    driver-class-name: org.h2.Driver # h2 드라이버 설정
    url: jdbc:h2:mem:testdb # jdbc url 설정 (in-memory db 설정)
    username: sa
    password:
    platform: h2 # datasource 타입 플랫폼 정의
    data: classpath:db/h2/data.sql # 앞서 작성한 sql 파일경로

  jpa:
    database-platform: org.hibernate.dialect.H2Dialect # 방언설정
    properties:
      hibernate:
        ddl-auto: none
        show_sql: true #sql 문이 보이도록
        format_sql: true  #sql 계층식 표현

테스트 코드

@SpringBootTest
public class InmemoryTest {
@Autowired
private UserService userService;

  @Test
@DisplayName("유저 데이터 조회")
public void init() {
    List<UserResponse>userList = userService.findAll();
    userList.forEach(System.out::println);
}

}

실행 결과

이제 위 설정으로 spring 구동시에 sql파일에서 선언한 내용이 자동으로 적용되는것을 확인할 수 있다.

728x90