✏️ 배경
데이터베이스 즉, JPA Repository와 연동된 서비스 비즈니스 로직 테스트 코드를 작성할 때 몇 가지 궁금했던 사항들이 존재한다. DB와 연결된 테스트 코드는 어떻게 작성하는 게 좋은지 배운 점을 공유하고, 진행 중인 프로젝트의 테스트 코드 작성에도 도움을 주기 위해 해당 포스팅을 작성한다.
📕 1. 데이터베이스 상태 재설정
데이터베이스를 활용한 테스트 코드를 작성할 때는 데이터베이스 스키마가 올바르게 되어 있는지, 불필요한 데이터가 들어 있는지 확인해야 한다.
가장 간단한 방법은 테스트 메서드의 시작 시점에 테이블을 모두 지우는 방법을 활용하는 것이다. 테스트 실행 전 메서드(@Before)에 deleteAll() 메서드를 설정하자.
📕 2. 도우미 메서드 작성
데이터베이스과 통합 테스트 코드를 작성하는 것은 단위 테스트에 비해 꽤 복잡하다.
실제로 많은 엔티티를 생성해야 하고, 특정 필드에 NotNull 등의 제약 조건이 추가되어 있다면, 맞춰서 관련 데이터도 추가해주어야 한다.
또한, @ManyToOne, @OneToMany 등 연관 관계를 활용한 서비스 로직이 있다면 연관된 엔티티도 생성하고 영속화해주어야 하므로 관련 테스트 작성이 더욱 복잡해진다.
그러므로 이런 복잡성을 줄이기 위해 도우미 메서드 즉, 부모 클래스를 활용하자. 💡
특정 코드를 여러 테스트에서 재활용 가능하다면 해당 메서드를 추출해서 부모 클래스로 이동시키면 좋다.
예를 들어, 로직마다 Principal 등의 사용으로 사용자(User) 정보가 매번 필요한 경우, 사용자 생성 메서드를 부모 클래스로 옮긴 뒤 테스트 코드에서 부모 클래스를 상속받으면, 사용자 데이터가 필요할 때 어떤 조건(NotNull 등)이나 데이터(ID, NAME 등)가 필요한지 신경 쓸 필요 없이 바로 활용할 수 있다.
📕 3. 데이터 최소화 하기
테스트를 과정에서 쿼리를 수행할 때 몇 천 개, 몇 만개를 추가하거나 불러오는 작업은 부하 테스트 또는 시간 테스트 외에는 별로 필요하지 않을 것이다. 테스트할 데이터는 최소한으로 사용하는 것이 좋다.
테스트에서 3개 테이블에 있는 데이터만 필요하다면 그 3 개 테이블의 데이터만 입력하고,
테이블에 5개 이상의 행(row)을 필요로 하지 않는다면 5개만 입력하자.
📕 4. 단언문 재활용 하기
assertJ는 쿼리 목록을 확인하는 데 유용한 기능을 여럿 제공해 준다. 만약, 여러 테스트 메서드에서 동일하게, 유사하게 사용되는 단언문이 있다면 유틸리티 메서드를 만들어서 재활용하자.
위의 2. 도우미 메서드 작성처럼 부모 클래스에 올려서 활용하거나, 별도의 유틸 클래스를 만들어서 사용하자.
📕 5. 인메모리보다는 동일한 환경의 데이터베이스를 활용하자
H2 등의 인메모리 데이터베이스를 활용한 테스트는 배포 환경의 데이터베이스 보다 보통 가볍고, 속도가 빠르다는 장점이 있다. 하지만 덜 현실적이라는 단점을 가지고 있다.
JPA를 활용할 때 데이터베이스 환경에 따라서 다르게 적용되는 것들이 존재할 수 있으므로 (@GeneratedValue 등) 배포 환경과 동일한 환경의 데이터베이스를 사용하는 것이 좋다.
필자는 보통 테스트 폴더에 별도의 설정 파일(properties)에 동일한 환경과 스키마를 가진 로컬용 DB를 설정해서 사용한다.
'Spring > Test' 카테고리의 다른 글
flatExtracting 활용해서 내부 리스트 내용 검증하기 (0) | 2023.12.03 |
---|---|
전체 통합 테스트 시간 속도를 증가시키는 Spring Test Context Caching (0) | 2023.11.08 |
JPA Auditing @createdDate 테스트 코드 작성하기 (0) | 2023.10.30 |
@TempDir 활용해서 파일 테스트 코드 작성하기 (0) | 2023.09.25 |
Hamcrest 라이브러리 Matcher를 활용하여 JUnit 테스트 가독성 향상하기 (0) | 2023.01.29 |
댓글