TDD/JUnit5

@test용 db 분리

wooweee 2023. 9. 25. 16:49
728x90

1. 테스트 - 데이터베이스 연동

  • 데이터 접근 기술은 실제 데이터베이스에 접근해서 데이터를 잘 저장하고 조회할 수 있는지 확인하는 과정이 필요
  • test case는 src/test에 있기 때문에, test 실행시 src/test 내부 application.properties 파일이 우선순위를 가지고 실행
  • 해당 설정 파일에도 spring.datasource.url 같은 db 연결 설정 필요

  • 만약 main의 application.properties의 설정을 그대로 사용하고 싶으면 test/resources 패키지에 application.properties 파일 자체가 존재하지 않아야 사용 가능

 

1.1. h2 db datasource 설정 등록

  • test/resources/application.properties
spring.profiles.active=test

# db 연결
spring.datasource.url=jdbc:h2:tcp://localhost/~/test # 동일한 h2 db 사용
spring.datasource.username=sa
# password 등록 안했을 시, 생략 가능

# sql문 log 확인 설정
logging.level.org.springframework.jdbc=debug



1.2. @SpringBootTest

  • @SpringBootTest는 @SpringBootApplication을 찾아서 springContainer 설정으로 사용

  • @SpringBootApplication 이 존재하는 class의 @Import 또한 주입 받는다.

 

package hello.itemservice;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest 
// main의 @SpringBootApplication 존재하는 class를 찾아서 동일하게 동작
class ItemServiceApplicationTests {
   @Test
   void contextLoads() {
   }
}

 

 

2. test - database 분리

  • 문제
    • local에서 사용하는 appServer와 test에서 같은 db를 사용하고 있으니 test에서 문제가 발생
    • 해당 문제를 해결하기 위해서 test를 다른 환경과 철저하게 분리

  • 해결 방안
    1. 테스트 전용 db를 별도로 운영
    2. h2 같은 경우 인베디드memory db를 이용 (springboot default 설정 값 )

 

2.1. 테스트 전용 db 운영

  • H2 데이터베이스 용도에 따라 2가지로 구분
    • 서버용 db : jdbc:h2:tcp://localhost/~/test
    • test용 db : jdbc:h2:tcp://localhost/~/testcase

 

  • 데이터베이스 파일 생성 방법
    1. db 서버 완전히 종료 후 재 시작
    2. jdbc url : jdbc:h2:~/testcase (최초 한번) - schema 생성 과정이라 보면 된다.
    3. 파일 생성 확인 
      • ~ 경로에서 ls -arlth -> testcase.mv.db 파일 생성 확인
    4. jdbc url : jdbc:h2:tcp://localhost/~/testcase 접속 - schema를 생성 했으므로 local 경로로 실제 db server 접근 필요
spring.profiles.active=test

# db 연결 - test -> testcase 변경
spring.datasource.url=jdbc:h2:tcp://localhost/~/testcase
spring.datasource.username=sa

logging.level.org.springframework.jdbc=debug

 

  • 남은 문제점
    • save로 인해서 저장된 data로 반복되는 test 수행 불가
  • 해결 방안
    • transaction 원리를 이용

 

2.2. test 중요 원칙 

  1. test는 다른 test와 격리해야 한다. - db 분리, 인베디드 db 사용
  2. test는 반복해서 실행할 수 있어야 한다. - clear(), @Transactional

 

참고 발행글 : 2023.09.25 - [spring/spring db2] - 3. 데이터 접근 기술 - 테스트