리팩토링을 하다 보면 사이드 이펙트가 생기지 않을까 하는 두려움이 생겼기 때문
두려움에 떨 시간, 빌드하면서 테스트 할 시간에 테스트 코드를 작성하여 이후 발생할 수 있는 리팩토링에도 유연하게 대처할 수 있는게 낫지 않을까? 하는 생각
테스트 주도 개발은 프로그래밍하면서 나타나는 두려움을 관리하는 방법이다.
P.24
완성된 프로그램 코드를 보거나 간단한 매뉴얼 정도로는 TDD를 익힐 수 없다.
켄트 백의 책 TDD 에 있는 예제를 차근 차근 직접 작성해보며 따라가는게 중요하다.
책 목차
- Money 예제
- xUnit 예제
- 테스트 주도 개발을 위한 패턴들
1. 빨강: 실패하는 작은 테스트를 작성한다. 컴파일 되지 않아도 된다.
2. 초록: 빨리 테스트가 통과하게끔 만든다. 이를 위해 어떤 죄악(무조건 통과하는 상수 반환 등)을 저질러도 된다.
3. 리팩토링: 테스트를 통과하게만 하는 와중에 생겨난 중복 제거
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
시작한 작업은 굵은 글씨로 표기, 작업을 끝내면 중간 줄 로 나타냄
작은 것부터 시작한다.
위의 할일 목록 중에서는 2번 째인 곱하기가 쉬워 보이므로 곱하기부터 시작한다.
금액(달러)를 계산하는데 정수형을 사용하고
예기치 못한 부작용이 있을 수 있는 구조다.
하지만 지금 단계에서는 이런 것들은 할일 목록에만 적어두고
최대한 빨리 컴파일이 될 수 있도록 하는 것을 목표로 한다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
위와 같이 컴파일만 될 수 있을 정도로 최소한의 구현만 해준다.
컴파일에 성공했다. 그리고 테스트가 실패하는 모습을 볼 수 있다.
이제 목표는 다중 통화 구현이라는 크고 다소 추상적인 목표에서
'이 테스트를 통과시킨 후 나머지 테스트들도 통과시키기'라는 작고 구체적인 목표로 바뀌었다.
가장 간단한 방법으로는 무조건 테스트를 통과할 수 있는 상수를 할당해주는 것이다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?
일반적인 TDD 주기는 다음과 같다.
'작동하는 깔끔한 코드를 만들어라' 를 달성하는 것은 최고의 프로그래머들에게도 힘든 목표이다.
따라서 나누어 정복하자(divide and conquer).
'작동하는 깔끔한 코드를 만들어라' 중 '작동하는'을 먼저 해결하고 나서 '깔끔한 코드' 부분을 해결한다.
할일 목록
$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?