Chapter 3

좋은 단위 테스트의 4대 요소

  • 4.1 좋은 단위 테스트의 4대 속성
  • 4.2 첫 번째 속성: 회귀 방지
  • 4.3 두 번째 속성: 리팩토링 내성
  • 4.4 세 번째 속성: 빠른 피드백
  • 4.5 네 번째 속성: 유지보수성
  • 4.6 이상적인 테스트를 찾아서

좋은 단위 테스트를 판단하는 기준이 뭔지 물으면 대부분 "빠르고 독립적이어야 한다"는 식으로 대답해. 맞는 말이긴 한데, 이게 전부가 아니야. 4장은 그 기준을 네 가지로 명확하게 정리해줘.

**회귀 방지(Protection against regressions)**는 버그를 잡아내는 능력이야. 이전에 동작하던 기능이 코드 변경 후 망가지는 걸 회귀라고 해. 테스트가 이걸 잘 잡으려면 실행되는 코드의 양이 많아야 하고, 도메인 로직을 포함해야 해. trivial한 코드만 실행하는 테스트는 회귀를 잡기 어렵거든.

**리팩토링 내성(Resistance to refactoring)**은 코드 구조를 바꿨을 때 테스트가 살아남는 능력이야. 기능 변경 없이 구조만 바꿨는데 테스트가 실패하면 그게 거짓 양성(false positive)이야. 거짓 양성이 많아지면 테스트에 대한 신뢰가 깨져. 빨간 불이 켜져도 "또 거짓 양성이겠지"하고 무시하게 되는 순간 테스트는 소음이 돼. 거짓 양성의 원인은 대부분 테스트가 구현 세부사항에 결합됐기 때문이야. 내부 메서드 이름, 클래스 구조 같은 걸 테스트가 알고 있으면 구조가 바뀔 때마다 테스트도 깨지거든.

**빠른 피드백(Fast feedback)**은 말 그대로야. 테스트가 느리면 개발 흐름이 끊겨. CI에서도 중요하지만 무엇보다 로컬에서 자주 돌릴 수 있어야 해. **유지보수성(Maintainability)**은 테스트 자체를 관리하기 쉬운가야. 테스트가 너무 복잡해서 이해하기 어렵거나, 프로덕션 코드가 바뀔 때마다 함께 바꿔야 하면 유지비용이 생산성을 잡아먹어.

네 속성을 모두 극대화하는 테스트는 없어. 테스트 피라미드가 이 트레이드오프의 해법이야. 회귀 방지와 리팩토링 내성은 둘 다 챙겨야 하고, 빠른 피드백과 회귀 방지는 트레이드오프야. 유닛 테스트로 빠른 피드백을 잡고, 통합/E2E로 회귀 방지를 보완하는 게 균형점이야.


정리

3장 읽고 기억할 거 세 가지:

  1. 좋은 테스트의 4대 속성: 회귀 방지, 리팩토링 내성, 빠른 피드백, 유지보수성
  2. 거짓 양성이 테스트를 죽여: 리팩토링할 때마다 깨지는 테스트는 신뢰를 잃게 만들고 결국 무시당해
  3. 이 속성들은 트레이드오프야: 모두를 극대화할 수 없어. 테스트 피라미드가 균형점이야