가능한 많은 코드를 실행해야 테스트에서 버그가 드러날 확률이 높아진다.
리팩토링 내성
테스트가 거짓 양성을 내지 않고 리팩토링을 할 수 있는 정도를 의미한다.
거짓 양성: 실제 기능은 의도한대로 작동하지만 테스트는 실패를 나타낸다. (허위 경보)
원인: SUT와 구현 세부 사항이 많이 결합될수록 허위 경보이 많이 생긴다.
해당 구현 세부 사항에서 테스트를 분리하자.
리팩토링은 애플리케이션의 동작에 영향을 주지 않으면서 구현을 변경하는 것이다. 따라서 변경할때 마다 테스트가 실패하는 것은 테스트가 구현 세부 사항에 결합되어 있기 때문이다.
코드의 내부 작업과 테스트 사이를 가능한 한 멀리 떨어뜨리고 최종 결과를 목표로 한다.
"어떻게"보다 "무엇"에 중점을 둬야한다.
빠른 피드백
테스트가 빠를수록 더 많은 테스트를 수행할 수 있고 더 자주 실행할 수 있다.
버그를 수정하는 비용을 줄일 수 있다.
유지 보수성
테스트 코드를 이해하기 쉬워야 한다.
테스트 코드 품질은 제품 코드만큼 중요하다.
테스트를 작성할 때 절차를 생략하지 말자, 테스트 코드를 일급 시민으로 취급하자.
위의 좋은 테스트의 4가지 조건중 하나라도 수치가 0이면 그 테스트는 절대 좋은 테스트가 아니다.
좋은 테스트의 조건들 중 3가지(회귀 방지, 리팩토링 내성, 빠른 피드백)조건은 상호 배타적이라 모든 조건이 완벽하게 충족될 순 없다. 즉, 세가지 중 두 가지만 최대화 할 수 있다.
위 세 가지 조건 중 리팩토링 내성은 포기할 수 없다. 따라서 회귀 방지와 빠른 피드백 사이에서 절충이 귀결된다.
리팩토링 내성을 포기할 수 없는 이유는 테스트가 리팩토링 내성이 있거나, 없거나 둘 중 하나이기 때문이다. (중간이 없다는 뜻) 회귀 방지와 빠른 피드백은 조절할 수 있으므로 리팩토링 내성은 포기할 수 없는 것이다.
테스트 스위트를 단단하게 만들려면 테스트의 거짓 양성을 제거하는 것이 최우선 과제다.
(리팩토링 내성이 있는 테스트가 되어야 한다.)

각 층의 너비가 넓을 수록 해당 테스트가 많다는 뜻이다.
층의 높이는 최종 사용자의 동작을 얼마나 유사하게 흉내 내는지 나타내는 척도다.
피라미드 내 테스트 유형에 따라 빠른 피드백과 회귀 방지 사이에서 선택을 한다.
모든 테스트의 거짓 양성은 최소화 해야한다.
엔드 투 엔드 테스트가 가장 적은 이유는 실행 속도가 느리고 유지 보수성이 결여되어 있기 때문이다. (필요한 경우에만 사용한다.)
단위 테스트는 알고리즘, 비즈니스 복잡도가 없는 환경에서는 유용하지 않다.
통합 테스트는 코드가 단순하더라도 DB와 같은 하위 시스템들과 통합돼 잘 잘동하는지는 확인해야하기 때문에 단순한 CRUD 작업이라도 중요한 테스트다.
블랙박스 테스트: 시스템의 내부 구조를 몰라도 시스템의 기능을 검사할 수 있는 테스트
화이트박스 테스트: 애플리케이션의 내부 작업을 검증하는 테스트
화이트박스 테스트는 동작에만 의존할 때 놓칠 수 있는 버그들을 발견할 수 있지만, 리팩토링 내성이 없다. (구현과 결합되어 있다.)
리팩토링 내성은 포기할 수 없기 때문에 블랙박스 테스트를 기본으로 선택한다.
모든 테스트가 시스템을 블랙박스로 보게 만들고 문제 영역에 의미 있는 동작을 테스트 해야한다.
테스트를 통해 비즈니스 요구사항을 알 수 있어야 한다. 알 수 없다면 그 테스트는 깨지기 쉬운 테스트다. 테스트를 재구성하거나 삭제하는게 좋다.