서론
테스트 코드를 작성하는 것은 매우 중요하다고 익히 들었고, 필수적인 영역이기 때문에 이에 항상 만전을 기하고 있다.
모든 케이스를 테스트할 이유는 없기 때문에,
크게 경우를 나누어 필요하다고 생각하는 부분만 시나리오, 통합, 단위 테스트를 나누어 진행하는 것이 효율적이라고 들었다.
배포를 계속 해오면서 jar 파일을 빌드하는 도중 테스트를 제외하는 것은 무의미하다고 판단했기 때문에, 모든 테스트를 어떤 환경에서든 돌아 갈 수 있게 고민을 했던 기억이 있다.
이렇게 하나하나 완성도 있게 쌓아나가는 공부를 하는 것이 속도는 느리지만, 유의미한 발전 과정이라 느낀다.
이번에 대규모 리팩토링을 실시하면서 코드 수정 및 구조가 크게 개편되었고, 테스트 코드도 변경 사항이 많이 생겨서 다 수정했다.
persistence 계층 테스트는 동적 쿼리 부분만 테스트를 하는 것이 유의미하다고 생각했기에, 수정한 코드를 실행했는데 전과 달리 계속 실패했다.
if you want an embedded database please put a supported one on the classpath or tune the replace attribute of @autoconfiguretestdatabase.
원인은 테스트 환경에서 인메모리 db에 커넥션을 연결하려는데 설정 정보가 없어서 실패한다는 아주 간단한 에러메시지이다.
이번에는 인메모리 db를 이용해서 실제 db로 테스트가 아닌 환경에 구애 받지 않는 환경을 만드는 것에 초점을 맞추는 과정 중 문제에 봉착한 것이다.
인터넷을 검색해보니까 다 실제 db로 변경해서 테스트 하는 방법 밖에 없었기에, 내가 직접 인메모리 h2 db 설정을 하는 방법을 포스팅해보겠다.
설정 방법
1. Gradle 기준 Test 환경 db 빌드
implementation 'mysql:mysql-connector-java'
testImplementation 'com.h2database:h2'
나 같은 경우는 실제 DB는 Mysql
테스트 환경에서는 인메모리 DB 인 h2를 사용
2. test 소스 폴더에 database configuration
테스트 환경에서 Database Configuration 이 필요하다.
test 폴더 내에 yaml 파일을 하나 생성해서 알맞은 datasource를 설정해야 한다.
이렇게 하면 테스트를 실행할 때 Main Resource 내의 yaml 대신 Test Resource의 yaml 이 우선순위를 가진다.
spring:
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
driver-class-name: org.h2.Driver
h2:
console:
enabled: true
path: /h2
jpa:
hibernate:
ddl-auto: create-drop
properties:
hibernate:
default_batch_fetch_size: 1000
format_sql: true
defer-datasource-initialization: true
database-platform: org.hibernate.dialect.H2Dialect
show-sql: true
generate-ddl: true
logging:
level:
org.hibernate.SQL: debug
각자 기호에 맞게 설정을 빼거나 변경해도 될 것 같다.
H2 DB 기준.
테스트 실행
@DataJpaTest
@Import(QuerydslConfig.class)
class UserCustomQueryRepositoryImplTest {
@DataJpaTest 애노테이션을 붙이면 기본적으로 내장 DB를 Datasource로 취급하여 커넥션을 얻는다.
'📕 Spring Framework > Spring 개념 정리' 카테고리의 다른 글
[Spring data JPA] N+1 문제 해결 (2) | 2023.02.28 |
---|---|
[Reactive Programming] 비동기-논블로킹 프로그래밍 (2) | 2023.02.11 |
WebFlux는 무엇이고, 왜 나왔고, 언제 쓰이는가? (0) | 2022.08.31 |
Spring Security [2] - 예외 처리 AuthenticationEntryPoint & AccessDeniedHandler (0) | 2022.08.21 |
Spring Security [1] - JWT를 이용한 REST API 인증과 인가 (0) | 2022.08.18 |