PHPUnitManual:8.2

From 흡혈양파의 번역工房
Jump to: navigation, search
8.2 데이터베이스 테스트의 어려움

웹상에 있는 단위 테스트 샘플 중에, 데이터베이스를 다루는 것이 전혀 없는 이유는? 이것은 데이터베이스를 다루는 테스트는 준비도 유지도 매우 힘들기 때문입니다. 데이터베이스를 사용하여 테스트를 하기 위해서는, 다음과 같은 사항을 파악하여야 합니다

  • 데이터베이스 스키마 / 테이블
  • 테스트에 필요한 레코드를 테이블에 삽입
  • 테스트 실행 후의 데이터베이스 검증
  • 매 테스트 실행 후의 데이터베이스 후처리


PDO 나 MySQLi, OCIS 등의 데이터베이스 API 는 사용하기 불편하고, 이러한 처리를 스스로 작성하는 것은 매우 번거로운 일입니다.


테스트 코드는 가능한한 간결하고 명확하게 쓰여져야 합니다. 이유는 다음과 같습니다.

  • 제품 코드의 약간의 변경이 원인으로, 대량의 테스트 코드 변경이 발생할 수 있다.
  • 수개월 후에 다시 읽게 되더라도 읽기 쉽고 이해하기 쉬운 테스트 코드가 바람직하다.


또한 중요한 것은, 데이터베이스는 기본적으로 코드에 입력되는 글로벌 입력 변수라는 점입니다. test suite 안의 2개의 테스트를 같은 데이터베이스를 사용하여 실행할 때, 같은 데이터를 여러번 재이용하게 될 것입니다. 하나의 테스트가 실패할 경우, 이후의 다른 테스트들의 결과에도 영향을 미치게 되고, 테스트를 진행하는 것은 매우 어렵습니다. 이 "데이터베이스가 글로벌 입력으로 작용한다" 는 문제를 해결하기 위해서, "후처리" 가 중요합니다.


DbUnit 를 사용하여, 데이터베이스 테스트에 관한 이 문제들을 간단화할 수 있습니다.


PHPUnit 에서 어쩔 수 없는 것은, 데이터베이스의 테스트는 데이터베이스를 사용하지 않는 테스트와 비교할 때 매우 느리다는 사실입니다. 테스트 실행에 걸리는 시간은 데이터베이스의 처리량에 의존하지만, 각 테스트에서 사용하는 데이터의 양을 적게 유지하고 가능한 한 데이터베이스를 사용하지 않는 테스트로 만든다면, 거대한 test suite 라도 1분 미만의 시간이 걸리도록 하는 것은 쉽습니다.


Doctrine 2 project[1] 는 좋은 예입니다. 이 프로젝트의 test suite 에는 현시점에서 약 1000 건의 테스트가 포함되어 있습니다. 그 약 절반이 데이터베이스를 사용하는 테스트입니다만, 표준적인 데스크탑 컴퓨터의 MySQL 을 사용하여 test suite 를 실행할 경우 테스트는 15초 정도에 완료됩니다.


Notes