코드를 수정한 후 기능이 의도한 대로 작동하지 않는 경우 – 코드베이스가 커지면 버그에 노출되기 쉽다 → 회귀 방지가 필요 – 이를 테스트 코드로 보호해야 함 • 회귀방지의 지표 – 테스트 중 실행되는 코드의 양 – 코드 복잡도 – 코드의 도메인 유의성(비즈니스의 주요기능을 잘 보호하는지)
리팩터링을 하고 난 후 테스트 빨간색이 되는 경우 – 그렇지만 리팩터링 후 기능은 정상적으로 도는 경우 – 이는 거짓 양성(false positive) – 오탐 – 의 원인이 되며, 테스트의 이점을 모조리 방해함 • 테스트의 이점 – 기존 코드가 고장 났을 때 조기경고 – 코드 변경이 회귀로 이어지지 않음 → 코드 개선을 테스트코드와 함께 함 – 하지만, 거짓 양성은?
없이 실패 → 테스트를 포기, 운영에 버그가 발생할 수 있음 – 거짓양성이 빈번하면? → 테스트 스위트 포기, 리팩터링 감소, 구조 개선이 어려워짐 • 거짓양성의 원인? – 테스트와 테스트 대상 시스템(SUT)의 구현 세부사항이 많이 결합되면 많이 발생 – 테스트는 과정이 아닌 결과만을 검증해야 함(5장에서 이어집니다)
• 빠른 피드백 – 빠르게 실행되는 테스트는 버그를 잡는 피드백 루프를 줄일 수 있다 – 오래 걸리면 자주 실행하지 못하므로 시간낭비가 생긴다 • 유지보수성 – 테스트의 유지비를 의미 – 테스트가 이해하기 어려운가? (테스트코드의 코드 품질도 중요!) – 테스트가 얼마나 실행하기 어려운가? (테스트의 외부 종속성 의존을 최소화해야)
테스트 스위트에서 아래 테스트 유형간 일정 비율을 일컫는 개념 – 단위 테스트 – 통합 테스트 – 엔드 투 엔드 테스트 • 테스트 피라미드 (cont’d) – 꼭대기로 가면 갈 수록 유저를 흉내 냄 – 상단 테스트는 회귀 방지에 유리 – 하단 테스트는 실행속도를 강조 – 어느 쪽도 리팩터링 내성을 포기하지 않음
방식을 언제 사용하는지 살펴봅시다 • 블랙박스 테스트 – 시스템 내부구조를 모르고도 시스템 검사 가능 – 무엇을 해야 하는지 중심으로 구축 – 회귀 방지에 다소 취약함 – 테스트 작성에 바람직함 • 화이트박스 테스트 – 애플리케이션 내부 작업을 검증 – 테스트가 소스코드에서 파생됨 – SUT의 구현과 결합되어 있음 (7장에서 다시 봅시다) – 테스트 분석에 바람직함