단위 테스트의 목표
- 소프트웨어 프로젝트의 지속 가능한 성장을 가능하게 하는 것이다.
- 지속적인 정리와 리팩터링 등과 같은 적절한 관리를 하지 않고 방치하면 시스템이 점점 더 복잡해지고 무질서(
엔트로피, software entropy
)해진다.
- 테스트는 안전망 역할을 한다.
- 테스트는 새로운 기능을 도입하거나 새로운 요구 사항에 더 잘 맞게 리팩터링한 후에도 기존 기능이 잘 작동하는지 확인하는 데 도움이 된다.
⚠️ 단위 테스트와 코드 설계의 관계
코드를 단위 테스트하기 어렵다면 코드 개선이 반드시 필요하다는 것을 의미한다.
강결합(tight coupling
)에서 저품질이 나타난다.
테스트하기 어렵다.
좋은 테스트와 좋지 않은 테스트
- 모든 테스트를 작성할 필요는 없다.
- 지속 가능한 프로젝트 성장을 위해서는 고품질 테스트에만 집중해야 한다.
- 테스트도 역시 코드다.
- 특정 문제를 해결하는 것, 즉 애플리케이션의 정확성을 보장하는 것을 목표로 하는 코드베이스의 일부로 봐야 한다.
테스트 스위트 품질 측정을 위한 커버리지 지표
커버리지 지표는 테스트 스위트(테스트 케이스를 관계별로 묶어놓은 것
)가 소스 코드를 얼마나 실행하는지를 백분율로 나타낸다.
- 100% 커버리지라고 해서 반드시 양질의 테스트 스위트라고 보장하지는 않는다.
- 커버리지 지표는 그 자체로 보는 것이며, 목표로 여겨서는 안 된다.
무엇이 성공적인 테스트 스위트를 만드는가?
- 개발 주기에 통합돼 있다.
- 코드가 변경될 때마다 아무리 작은 것이라도 실행해야 한다.
- 코드베이스에서 가장 중요한 부분만을 대상으로 한다.
- 시스템의 가장 중요한 부분에 단위 테스트 노력을 기울이고,
- 다른 부분은 간략하게 또는 간접적으로 검증하는 것이 좋다.
- 비즈니스 로직(
도메인 모델
) 테스트가 시간 투자 대비 최고의 수익을 낼 수 있다.
- 최소한의 유지비로 최대의 가치를 끌어낸다.
- 가치 있는 테스트를 작성하려면 코드 설계 기술을 알아야 한다.(이 책의 상당 부분을 코드 설계에 할애하고 있다)