큰 테스트에만 집중하다 보면 전반적으로 코드 신뢰도는 부족해지기 쉽다. 코드에서 가장 중요한 비즈니스 로직의 대부분을 테스트하지 않으면 버그가 얼마나 있는지 가늠하기가 힘들다. 힘들게 테스트를 작성했는데 핵심 로직에서 버그가 많이 발견되면 그것만큼 허무한 일도 없다.
좋은 테스트는 특정 객체, 함수, 의존성(도메인 모델)을 테스트하는 방법을 수립한 후에는 쉽고 빠르게 작성할 수 있어야 한다.
• 다른 팀 코드에 버그가 있어도 내 테스트는 통과하는가? 내 테스트는 다른 실행 환경에서 실행해도 동일한 결과를 보장하는가? 데이터베이스나 네트워크, 배포 없이도 내 테스트는 동작하는가?
이 세 가지 항목은 테스트 코드가 외부 의존성에서 독립적인지 묻는 질문이다. 테스트 결과가 항상 동일한 이유는 시스템에 대한 간접 입력을 우리가 제어할 수 있기 때문이다. 여기에서 간접 입력이란 데이터베이스, 네트워크, 시스템 시간 등 외부 의존성을 의미한다. 우리는 실제가 아닌 테스트 목적의 가짜 데이터베이스, 네트워크, 시간, 시스템 환경을 조작해서 사용할 수 있다. 이후 장에서 이러한 개념을 스텁(stub)과 심(seam)으로 설명하며, 스텁을 언제 어떻게 사용할 수 있는지 보다 자세히 다룰 예정이다.