[테스트 주도 개발] 1장_다중 통화를 지원하는 Money 객체

테스트 주도 개발의 리듬은 다음과 같다.

  1. 재빨리 테스트 하나 추가
  2. 모든 테스트 실행하고 새로 추가한 것이 실패한지 확인
  3. 코드를 조금 변경
  4. 모든 테스트 실행하고 전부 성공하는지 확인
  5. 리팩토링으로 중복 제거

어떤 테스트들이 있어야 보고서에 제대로 계산되도록 하는 코드가 완성됐다고 확신할 수 있을까 ?

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

앞으로 어떤 일을 해야하는지 알려주고, 하는 일에 집중할 수 있게 하고, 언제 일이 끝나는지 알려 줄 수 있도록 할 일 목록을 만든다. 작업이 끝난 항목에는 줄을 긋는다.
할일 목록에서 볼 수 있듯이 곱하기를 먼저 다룬다. 작은 것부터 시작한다.

1
2
3
4
5
public void testMultiplication() {
Dollar five = new Dollar(5);
five.times(2);
AssertionErrors.assertEquals(10, five.amount);
}

위 테스트는 아직 컴파일조차 되지 않는다. 실행은 안되더라도, 컴파일만은 되도록 만들고 싶다. 네 개의 컴파일 에러가 있다.

  1. Dollar 클래스가 없음
  2. 생성자가 없음
  3. times(int) 메서드가 없음
  4. amount 필드가 없음
1
2
3
4
5
6
7
8
9
10
11
class Dollar {
int amount;

Dollar(int amount) {

}

void times(int multiplier){

}
}

위 코드에서 times(int multiplier) 는 stub 구현이다. 이 메서드를 호출하는 코드가 컴파일 될 수 있도록 껍데기만 만들어두는 것을 의미한다.
테스트를 다시 실행해보자. 실패한다. 테스팅 프레임워크가 결과로 10이 나와야 하는데 0이 나왔다는 것을 알려준다.

Read more

[테스트 주도 개발] 2장_타락한 객체

TDD 주기는 다음과 같다.

  1. 테스트를 작성한다.
  2. 실행가능하게 만든다.
  3. 올바르게 만든다. (중복 제거)

“작동하는 깔끔한 코드” 를 얻어야한다는 전체 문제 중에서, “작동하는” 에 해당하는 부분을 먼저 해결해라.
테스트를 하나 통과했지만, Dollar 에 대한 연산을 수행한 후에 해당 Dollar 의 값이 바뀌는 것이 이상하다.

1
2
3
4
5
6
7
void testMultiplication() {
Dollar product = new Dollar(5);
product.times(2);
assertEquals(10, product.amount);
product.times(3);
assertEquals(15, product.amount);
}

times() 를 처음 호출한 이후에 product 는 더이상 5가 아니다. times() 가 새로운 객체를 반환하면 어떨까 ?

1
2
3
4
5
6
7
void testMultiplication() {
Dollar five = new Dollar(5);
Dollar product = five.times(2);
assertEquals(10, product.amount);
product = five.times(3);
assertEquals(15, product.amount);
}
1
2
3
4
5
6
7
8
9
10
11
12
class Dollar {
int amount;

Dollar(int amount) {
this.amount = amount;
}

Dollar times(int multiplier) {
amount *= multiplier;
return null;
}
}

위 코드는 컴파일되지만 실행되지 않는다. 통과를 위해서는 올바른 금액을 갖는 새 Dollar 를 반환해야한다.

1
2
3
4
5
6
7
class Dollar {
...

Dollar times(int multiplier) {
return new Dollar(amount * multiplier);
}
}

최대한 빨리 초록색을 보기 위한 방법이 있다.

Read more