[테스트 주도 개발] 17장_Money 회고
1. 다음에 할 일은 무엇인가
Sum.plus() 와 Money.plus() 사이에 중복이 남았다. Expressoin 을 인터페이스가 아니라 클래스가 바꾼다면 공통 코드를 담아낼 적절한 곳이 될 것이다.
작업을 끝낸 후에 SmallLint 같은 코드 감정 프로그램을 실행해보면 좋다.
“다음에 할일은 무엇인가” 에 관련된 또 다른 질문은 “어떤 테스트들이 추가로 필요할까” 이다.
할일 목록이 빌 때가 그때까지 설계한 것을 검토하기에 적절한 시기이다. 말과 개념이 잘 통하는가 ? 현재의 설꼐로 제거하기 힘든 중복이 있는가 ?
2. 메타포
“통화가 다른 여러 금전” 에 대해 사용한 메타포는 벡터였다. 그 전엔, MoneySum 을 사용하다가 적절하고 물리전인 MoneyBag 으로 바꿨다. 그리고 마지막에는 많은 사람에게 익숙한 Wallet 으로 바꿧다. 이 모든 메타포는 Money 의 집합이 딱 떨어지는숫자로 된다는 것을 암시하다. 즉, 같은 통화의 값은 합칠 수 있다. (2USD + 3USD + 5CHF = 5USD + 5CHF)
Expression 메타포는 중복되는 통화를 합치는 세세한 일단의 문제에서 해방시켰다. 코드도 그 어느 때보다 명확하다.
3. 코드 메트릭스
- 코드와 테스트 사이에 대략 비슷한 양의 함수와 줄이 있다.
- 테스트 코드에 분기나 반복문이 없기 때문에 테스트 복잡도는 1 이다. 명시적인 흐름 제어 대신에 다형성을 사용해서 실제 코드의 복잡도 역시 낮다.
4. 프로세스
TDD 의 주기는,
- 작은 테스트 추가
- 모든 테스트 실행, 실패 하는 것 확인
- 코드에 변화
- 모든 테스트 실행, 성공 하는 것 확인
- 중복 제거 위해 리펙토링
5. 테스트의 질
TDD 의 부산불로 생기는 테스트들은 다음과 같은 종류의 테스트를 대체할 수는 없다.
- 성능 테스트
- 스트레스 테스트
- 사용성 테스트
이 테스트에 사용하는 지표로는 다음이 있다.
명령문 커버리지
테스트의 질에 대한 충분한 평가 기준이 될수 없지만, 테스트의 시작점이다.결함 삽입
테스트의 질을 평가하는 또 다른 방법이다. 코드의 의미를 바꾼 후에 테스트가 실패하는지 보는 것이다. 수동으로 할 수 있지만, Jester 같은 툴을 사용할 수 있다.
테스트 커버리지를 향상 시키는 방법으로는,
- 더 많은 테스트를 작성.
- 테스트의 수는 그대로 두면서, 프로그램의 로직을 단순화. 리펙토링 단계가 이런 효과를 종종 가져온다.
6. 최종 검토
- 테스트를 확실히 돌아가게 만드는 세 가지 접근법
가짜로 구현, 삼각 측량법, 명백하게 구현 - 설계를 주도하기 위한 방법으로 테스트 코드와 실제 코드 사이의 중복 제거하기
- 길이 미끄러우면 속도를 줄이고, 상황이 좋으면 속도를 높여라. 테스트 사이의 간격을 조절해라
테스트 주도 개발 <켄트 벡>