1장에서 진행하는 다중화폐예시는 워드가 와이캐시에서 만든 달러로 관리되던 채권을 다중통화로 관리될 수 있게 하는 개발과정에서 테스트를 연습한다.
책에서 제시하는 TDD의 리듬은,
1. 재빨리 테스트 하나 추가
2. 모든 테스트를 실행하고 추가한 테스트가 실패하는지 확인
3. 코드 수정
4. 모든 테스트를 실행하고 전부 성공하는지 확인
5. 리펙토링을 통해 중복제거
이다. 이 부분을 생각하며 예제를 진행할 것이다!
먼저 다중통화를 이용하는 보고서를 만드려면 다음의 일을 해야한다.
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
$5 x 2 = $10
첫 번째 할 일은 환율에 맞게 각 화폐를 더한 값을 출력해야 한다.
두 번째 할 일은 통화에 주가의 수 만큼을 곱한 값을 출력해야 한다.
비교적 두 번째 일이 쉬워 보인다. 두번째부터 해결해보자. (쉬운 것 부터 해결하는 것이 좋다고 한다.)
위의 리듬에서 첫번째, 재빨리 테스트를 하나 추가한다.
두 번쨰 할 일을 코드로 작성했다.
Dollor 클래스도 없고 그에 따른 생성자, 메소드도 없는 상태이기에 이 코드는 컴파일조차 안된다.
이 코드에는 문제가 있다. public상태의 필드, 금액계산에 정수형이 사용됨,, 이런 문제들을 할 일 목록에 적어 놓는다.
그럼 할일이 추가되었다.
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
>$5 x 2 = $10
amount를 private로 만들기
Dollor 부작용?
Money 반올림
이제 이 코드를 컴파일이라도 되게끔 Dollor클래스를 만들어 준다.
컴파일이 되게끔 최소한의 스텁 구현을 한다. --> 일단 빨리 초록막대든 빨간막대든 보고 싶은 것.
이제 우리는 위의 테스트 코드가 실패하는 것을 볼 수 있다!
이는 리듬의 두번째, 모든 테스트를 실행하고 추가한 테스트가 실패하는지 확인한다.
그럼 리듬의 세번째, 조금 수정해본다.
이를 위해서는 어떤 '죄악'을 저질러도 된다.(라고 책에서 표현한다ㅎ)
dollor클래스에서 amount 필드를 10으로 초기화 후 테스트를 진행한다.
테스트가 성공한다 ! 초록막대가 떴다 !
이제 리듬의 마지막, 리펙토링을 통해 중복을 제거한다.
1. 테스트의 assertEquals안의 10과 우리가 초기화해준 amount의 10은 중복이다.
--> 메소드를 통해 amount를 설정해준다.
여기서 5는 생성자로 넘어온 값과 일치한다. 그리고 2는 매개변수와 일치한다.
이를 통해 코드를 바꿔주면,
이렇게 바꿀 수 있다.
여전히 우리의 테스트는 초록막대를 나타내고, 처음 할 일을 리듬을 타면서 완료했다.
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
// 해결 // $5 x 2 = $10
amount를 private로 만들기
Dollor 부작용?
Money 반올림
2장. 타락한 객체
처음 테스트를 작성한 후의 가장 큰 목표는 가능 한 빨리 초록 막대를 보는 것이다.
초록 막대를 보기 위해 어떠한 짓을 해도 된다.
만약 깔끔하고 명백한 해법이 있다면 그것을 작성한다. 그러나 그것이 막히거나, 오래 걸릴 것 같다면 그냥 다시 초록 막대를 보는 목표로 돌아온다.
그 후 어떠한 짓을 해놨던 것을 고친다.
다시 되새기지만, TDD의 목적은 작동하는 깔끔한 코드를 얻는 것이다.
이 두가지를 한번에 해결하는 것은 매우 어렵다...
그러므로 분할정복을 하자 ! '작동하는' 부터 먼저 해결하자 !
이는 깔끔한 코드를 먼저 짜놓고 작동하게 만드는 아키텍처 주도 개발과 반대의 개념을 가진다.
다시 실습으로 돌아가서, 우리는 하나의 할 일을 끝냈지만 결과가 조금 이상하다.
이 작업을 끝내고 나면, Dollor클래스로 만든 객체 five의 amount가 5에서 10으로 변하는 것이다.
달러의 가치가 변하면 안된다..
그렇다면 새로운 객체를 만들어서 곱하기를 하자.
times메소드가 곱한 값을 가진 새로운 객체를 반환하면 five의 amount는 변하지 않을 것이다.
생각한대로 해 주었다. 하지만 컴파일은 되지 않는다.
times 메소드는 아무것도 반환하지 않는 void로 되어있기 때문이다.
Dollor객체를 반환하게 바꾼다. (빨간 막대를 보게 바꾼다)
한걸음 나갔다. 책에서는 이렇게 한발자국씩 나아가는 것을 중시한다.
그러면 이제 적절히 곱해진 새로운 dollor객체를 반환하도록 수정한다.
이제 뒤의 times(3)의 결과가 15와 같아서, 테스트를 통과하게 되었다 !
<할일 목록>
$5 + 10CHF = $10(환율이 2:1 인 경우)
// 해결 // $5 x 2 = $10
amount를 private로 만들기
// 해결 // Dollor 부작용?
Money 반올림
2장의 내용을 정리하면,
1. 설계상의 결함을 그 결함으로 인해 실패하는 테스트로 변환
2. 스텁 구현으로 컴파일을 통과하게 만듦
3. 올바르다고 생각하는 코드를 입력하여 테스트를 통과
오늘 처음 한 일을 되짚어보면,
처음엔 가짜구현을 하였다. 5*2라는 상수를 넣어서 초록 막대를 뜨게 한 뒤, 점차 변수로 바꿔가며 테스트를 완성시켰다.
두번째는 명백한 구현을 하였다. 바로 구현을 하였다. 만약, 명백한 구현 도중 빨간 막대를 보게 된다면, 가짜 구현으로 넘어가서 천천히 진행하는 것이 좋다.
'책읽기 > TDD:ByExample' 카테고리의 다른 글
TDD_6 (0) | 2020.11.11 |
---|---|
TDD_5 (0) | 2020.11.10 |
TDD_4(값 객체 패턴) (0) | 2020.11.08 |
TDD_2 (0) | 2020.11.02 |
TDD_1 (0) | 2020.10.31 |