김동형수 개발기

테스트 주도 개발 - 1부 1장 본문

책 스터디/[완료] 테스트 주도 개발

테스트 주도 개발 - 1부 1장

김동형수 2022. 8. 29. 23:21

1부 화폐 예제

TDD의 리듬

1. 재빨리 테스트를 하나 추가한다.

2. 모든 테스트를 실행하고 새로 추가한 것이 실패하는지 확인한다.

3. 코드를 조금 바꾼다.

4. 모든 테스트를 실행하고 전부 성공하는지 확인한다.

5. 리펙토링을 통해 중복을 제거한다.

TDD를 통해 놀랄 것

- 각각의 테스트가 기능의 작은 증가분을 어떻게 커버하는지

- 새 테스트를 돌아가게 하기 위해 얼마나 작고 못생긴 변화가 가능한지 

- 얼마나 자주 테스트를 실행하는지

- 얼마나 수 없이 작은 단계를 통해 리팩토링이 되어가는지

 


1장 다중 통화를 지원하는 Money 객체

와이캐시의 달러만 사용하는 보고서
와이캐시의 다중통화 (달러와 스위스 프랑을 지원)를 지원하는 리포트
CHF <-> USD 환율

다중통화가 지원되는 리포트에는 아래의 테스트들이 통과해야 정상적인 동작을 한다고 확신할 수 있다.

- 통화가 다른 두 금액을 더해서 주어진 환율에 맞게 변한 금액을 결과로 얻을 수 있어야 한다.

- 어떤 금액(주가)을 어떤 수(주식의 수)에 곱한 금액을 결과로 얻을 수 있어야 한다.

 

할일을 나열하고 작성할 테스트를 굵은 글씨로 표기하고 테스트 코드 작성이 완료되면, 취소선을 긋는 방법을 이용해서 할일을 하나씩 지워나간다.

 

좀 더 간단한 두 번째 항목부터 테스트를 작성해보도록 한다.

 

할일목록

  •  $5 + 10CHF = $10(환율이 2:1일 경우)
  •  $5 X 2 = $10
  •  amount를 private로 만들기
  •  Dollar 부작용?
  •  Money 반올림?

 

위 테스트 코드의 컴파일 에러

- Dollar 클래스가 없음

- 생성자가 없음

- times(int) 메서드가 없음

- amount 필드가 없음

 

위의 컴파일 에러를 해결하기 위한 Dollar 클래스 코드 작성

하지만 컴파일 에러는 처리가 되었지만, 테스트는 성공하지 않는다. 실제 값이 '0'이 나오기 때문이다.

 

테스트 통과를 위해 amount에 10을 할당한다.

 

TDD 일반화하는 주기

1. 작은 테스트를 하나 추가한다.

2. 모든 테스트를 실행해서 테스트가 실패하는 것을 확인한다.

3. 조금 수정한다.

4. 모든 테스트를 실행해서 테스트가 성공하는 것을 확인한다.

5. 중복을 제거하기 위해 리펙토링을 한다.

 

Dollar_6.java 는 1~4번의 결과물이다.

 

Dollar_7.java에서는 어디서 넘어온 값인 10을 5 * 2로 변경했다.

Dollar_8.java에서는 5 * 2를 times 메서드 안으로 옮겼다.

 

여전히 테스트는 통과한다.

단계가 너무 작다고 느껴질 수 있지만, TDD의 핵심은 이런 작은 단계를밟아야 한다는 것이 아니라, 이런 작은 단계를 밟을 능력을 갖추어야 한다는 것이다.

 

Dollar_9.java는 생성자에서 amount 필드를 할당해준다.

Dollar_10.java는 times메서드에서 할당받은 amount 필드를 사용한다.

Dollar_11.java는 times의 인자값인 multiplier를 사용한다.

Dollar_12.java는 a = a * b -> a *= b 중복제거를 위해서 단항연산자를 이용한다.

 

할일목록

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • $5 X 2 = $10
  • amount를 private로 만들기
  • Dollar 부작용?
  • Money 반올림?

현재까지 한 작업 정리

  • 우리가 알고 있는 작업해야 할 테스트 목록을 만들었다.
  • 오퍼레이션이 외부에서 어떻게 보이길 원하는지 말해주는 이야기를 코드로 표현했다.
  • JUnit에 대한 상세한 사항들은 잠시 무시하기로 했다.
  • 스텁 구현을 통해 테스트를 컴파일했다.
  • 끔찍한 죄악을 범하여 테스트를 통과시켰다.
  • 돌아가는 코드에서 상수를 변수로 변경하여 점진적으로 일반화했다.
  • 새로운 할일을 한번에 처리하는 대신 할일 목록에 추가하고 넘어갔다.

테스트코드는 작성해봤지만, TDD 방법론을 스터디하고자 생각만하고 오랜 시간이 걸려서 첫 삽을 뜨게 되었다.

예상 스터디 소요시간은 10주정도 잡았는데, 스터디가 끝날 때에는 TDD를 프로젝트에 적용해보고 싶다.

Comments