4장. 좋은 단위 테스트의 4대 요소
좋은 단위 테스트 스위트의 특성
- 개발 주기에 통합돼 있다
- 코드베이스의 가장 중요한 부분만을 대상으로 한다
- 최소한의 유지비로 최대 가치를 끌어낸다
- 가치 있는 테스트 식별
- 가치 있는 테스트 작성
좋은 단위 테스트의 4대 요소 자세히 살펴보기
- 회귀 방지
- 리팩터링 내성
- 빠른 피드백
- 유지 보수성
첫 번째 요소: 회귀 방지
회귀는 소프트웨어 버그다. 코드를 수정한 후 기능이 의도한 대로 작동하지 않는 경우
회귀는 귀찮다. 최악의 상황은 아니다
회귀 방지 지표에 대한 테스트 점수가 잘 나오는지 평가하려면 다음 사항을 고려해야 한다
- 테스트 중에 실행되는 코드의 양
- 코드 복잡도
- 코드의 도메인 유의성
일반적으로 코드가 많을수록 테스트에서 회귀가 나타낼 가능성이 높다
복잡한 비즈니스 로직을 나타내는 코드가 보일러플레이트 코드 보다 훨씬 더 중요하다
두 번째 요소: 리팩터링 내성
테스트를 빨간색(실패)로 바꾸지 않고 기본 애플리케이션 코드를 리팩터링할 수 있는지에 대한 척도다
거짓양성(테스트가 실패하는 것처럼 보이지만 실제로는 성공하는 경우)이 발생하면 리팩터링 내성이 떨어진다
- 기존 기능이 고장 났을 때 테스트가 조기 경고를 제공한다
- 코드 변경이 회귀로 이어지지 않을 것이라고 확신하게 된다
무엇이 거짓 양성의 원인인가?
거짓양성이 생길 가능성을 줄이는 방법은 해당 구현 세부 사항에서 테스트를 분리 하는것 뿐이다
테스트는 최종 사용자의 관점에서 sut를 검증해야 하고 최종 사용자에게 의미 있는 결과만 확인해야 한다
테스트를 구성하기에 가장 좋은 방법은 문제 영역에 대해 이야기하는 것이다
구현 세부 사항 대신 최종 결과를 목표로 하기
리팩터링 내성을 높이는 방법은 SUT의 구현 세부 사항 과 테스트 간의 결합도를 낮추는 것뿐 이다
첫 번째 특성과 두 번째 특성 간의 본질적인 관계
- 테스트 정확도 극대화
- 거짓 양성과 거짓 음성의 중요성
테스트 정확도 극대화
정확도 지표
- 테스트가 버그 있음을 얼마나 잘 나타내는가
- 테스트가 버그 없음을 얼마나 잘 나타내는가
거짓 양성과 거짓 음성의 중요성: 역학 관계
단기적으로 거짓 양성도 거짓 음성만큼 나쁘지 않다 프로젝트가 성장함에 따라 거짓 양성은 테스트 스위트에 점점 큰영향을 미치기 시작한다
중대형 프로젝트를 하면 거짓 음성과 거짓 양성에 대해 똑같이 주의를 기울여야 한다
세 번째 요소와 네 번째 요소: 빠른 피드백과 유지 보수성
좋은 단위 테스트의 특성 중 남은 두가지 요소
- 빠른 피드백
- 유지 보수성
유지 보수성 평가
- 테스트가 얼마나 이해하기 어려운가
- 테스트가 얼마나 실행하기 어려운가
이상적인 테스트를 찾아서
- 회귀방지
- 리팩터링 내성
- 빠른 피드백
- 유지 보수성
테스트 코드를 포함한 모든 코드는 책임이다. 최소한으로 필요한 가치로 임계치를 상당히 높게 설정하고 이 임계치를 충족하는 테스트만 테스트 스위트에 남겨라
이상적인 테스트를 만들 수 있는가?
회귀 방지, 리팩터링 내성, 빠른 피드백은 상호 배타적이라 이상적인 테스트를 만드는게 불가능하다
극단적인 사례 1: 엔드 투 엔드 테스트
단점 느린 속도
극단적인 사례 2: 간단한 테스트
간단한 테스트는 실수할 여지가 많지 않아 회귀를 나타내지 않을것이다
극단적인 사례 3: 깨지기 쉬운 테스트
거짓 양성이 많은 테스트를 작성하기 매우 쉽다
이상적인 테스트를 찾아서: 결론
한 특성에서 얻는 것이 많을수록 다른 특성에서 더 일게 된다
테스트 스위트를 탄탄하게 만들려면 테스트 불안정성을 제거하는 것이 최우선 과제다
대중적인 테스트 자동화 개념 살펴보기
테스트 피라미드 분해
테스트 피라미드는 테스트 스위트에서 테스트 유형 간의 일정한 비율을 일컫는 개념이다
블랙박스 테스트와 화이트박스 테스트 간의 선택
- 블랙 박스 테스트 : 시스템 내부 구조를 몰라도 시스템의 기능을 검사할 수 있는 소프트웨어 테스트 방법이다
- 화이트 박스 테스트 : 애플리케이션의 내부 작업을 검증하는 테스트 방식이다