Junuuu 2023. 8. 17. 00:01

10장에서 다루는 내용

  • 데이터베이스 테스트를 위한 전제 조건
  • 데이터베이스 테스트 모범 사례
  • 테스트 데이터 생명 주기
  • 테스트 내 데이터베이스 트랜잭션 관리

 

데이터베이스 테스트를 위한 전제 조건

목을 사용하지 않으면 테스트하기 힘들 수 있습니다.

  • 데이터베이스를 형상 관리 시스템에 유지
    • Git과 같은 형상 관리 시스템에 데이터베이스를 저장하는 것이 최선이다. (예시: Flyway)
    • 그렇지 않다면 버그 재현을 위해 과거의 특정 시점으로 되돌리기 어렵다.
  • 참조 데이터도 데이터베이스 스키마다
    • 애플리케이션이 데이터를 수정할 수 있으면 일반 데이터이며, 그렇지 않으면 참조 데이터이다.
    • 애플리케이션이 참조 데이터를 수정하지 못하게 해야한다.
  • 개발자마다 별도의 데이터베이스 인스턴스를 활용

 

데이터베이스 트랜잭션 관리

트랜잭션관리는 제품 코드와 테스트 코드 모두에 중요합니다.

이를 통하여 데이터베이스의 원자성을 잘 지켜주어야 합니다.

Spring에서는 @Transactional 사용하면 된다.

 

테스트 데이터 생명 주기

  • 테스트를 순차적으로 실행
  • 테스트 실행 간에 남은 데이터를 제거

모든 테스트 데이터가 고유한지, 남은 데이터를 정리하기 등으로 병렬 테스트를 수행하기 위해서는 큰 비용이 든다.

도커 컨테이너를 만들어하는 방안도 있지만 책에서는 비추천한다.

 

테스트 간 데이터 제거는 @BeforeEach, @AfterEach 등을 활용할 수 있다.

 

인메모리 데이터베이스 지양

  • 빠르지만 실제 데이터베이스와 다르기 때문에 일관성이 떨어지게 되고 사용하지 않는 것이 좋습니다.

 

테스트 구절 코드 재사용

  • 짧은 테스트라도 서로 의존하지 않도록 해야 한다.
  • 헬퍼 클래스 활용

 

읽기 테스트를 해야 하는가?

  • 쓰기를 테스트하는 것은 매우 중요합니다. 
  • 복잡하거나 중요한 읽기 작업만 테스트하고 나머지는 무시하라.
  • 굳이 읽기 테스트가 아니더라도 비슷하게 목 체계가 너무 복잡해서 유지비가 너무 많이 들고, 회귀 방지의 이점이 적다면 하지 마라