[xUnit 테스트 패턴] 13장 - 데이터베이스와 테스트


13장 - 데이터베이스와 테스트

개요

  • 데이터베이스를 사용하면 느린 테스트 및 여러 가지 테스트 냄새가 자동 테스트 스위트에서 날 수 있다.

데이터베이스 테스트하기 목표

  • 데이터베이스 없이 테스트할 수 있다면 수단과 방법을 가리지 마라!

데이터베이스를 이용한 테스트가 필요한 이유

  • 데이터베이스가 애플리케이션에서 필수적인 부분이여서 제대로 사용하는지 검증하는 것은 꼭 필요 한다.
  • 데이터베이스 샌드박스로 개발자와 테스터를 제품과 격리시켜야 한다.

데이터베이스와 관련된 문제

지속되는 픽스처

  • 데이터베이스틑 테스트 냄새를 불러 일으키는 주원인 중 하나
    • 느린 테스트, 변덕스러운 테스트, 애매한 테스트 발생
  • 테스트 픽스처의 영속성으로 아래 문제 발생
    • 반복 안 되는 테스트, 서로 반응하는 테스트 발생

공유 픽스처

  • 엮인 테스트
    • 외로운 테스트가 될 수 있다.
  • 개별 데이터베이스 샌드박스가 없다면 개발자 간에 테스트 실행 전쟁이 생길 수 있다.
    • 테스트 픽스처를 공유 해서 발생

일반 픽스처

  • 데이터베이스 사용 시 커다란 일반 픽스처가 돼 여러 테스트에서 다른 목적으로 사용하게 된다.
    • 미리 만든 픽스처를 쓸 때와 결과가 비슷해짐
    • 신선한 픽스처를 쓰려다가 표준 픽스처를 쓰게 됨

데이터베이스 없이 테스트하기

  • 레이어 테스트로 데이터 접근 레이어를 테스트 대역으로 교체
  • 가짜 데이터베이스나 메모리 데이터베이스 사용
    • 가짜 데이터 베이스 : 데이터베이스인 척 하는 데이터 접근 레이어
    • 메모리 데이터 베이스 : 테이블을 전부 메모리에 저장
  • 일련번호 생성 같은 벤더 전용 기능 구현
    • 테스트 스텁으로 가능
  • SUT에게 대체 객체를 쓰게 만드는 방법 2가지
    • 의존 주입
    • 의존 찾기로 데이터 접근 레이어 찾기

데이터베이스 테스트하기

  • 데이터베이스 테스트가 필요한 경우
    • 저장 프로시저를 쓰고 있다면 단위 테스트 작성
    • 데이터 접근 레이어가 비즈니스 로직으로부터 데이터베이스를 숨기고 있다면 데이터 접근 기능에 대한 테스트 작성

저장 프로시저 테스트하기

  • 원격 저장 프로시저 테스트는 단위 테스트를 작성한 프로그래밍 언어로 작성하고 같은 프레임워크를 쓴다.
    • 호출 메커니즘으로 저장 프로시저에 접근

데이터 접근 레이어 테스트하기

  • 대부분 데이터 접근 레이어 테스트는 왕복 테스트다.
  • 트랜잭션 롤백 해체
    • 픽스처가 지속되는 걸 막아주는 방법
  • 테이블 삭제 해체
    • 개발자별로 데이터베이스 샌드박스가 있고, 하나 이상의 테이블에 모든 데이터를 지우고 싶을 때에만 적당

개발자의 독립성 보장하기

  • 테스트 실행기별 DB 스키마 사용
  • 데이터베이스 분할 스키마 사용

데이터베이스로 테스트하기(한 번 더)

  • 가능한 한 적게, 하지만 너무 적지도 않게!
  • 고객 테스트 중 대표적인 것 하나 정도를 뽑아 테스트