김동형수 개발기

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

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

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

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

2장 타락한 객체

일상적인 TDD 주기

1. 테스트를 작성한다. 오퍼레이션 코드 상상, 인터페이스 개발, 필요한 요소 모두 포함

2. 실행 가능하게 만든다. 가장 중요한 것은 테스트를 통과 시키는 것이다. 구현하는 방법이 생각이 났어도 메모해놓고 단순한 방법으로 해결

3. 올바르게 만든다. 중복을 제거하고 테스트를 통과시키자.

 

작동하는 깔끔한 코드를 얻는 것은 최고의 프로그래머조차도 도달하기 힘든 목표일 수 있다.

'작동하는', '깔끔한 코드'를 나눠서 부분적으로 해결하자.

 

할일목록

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

테스트를 통과했지만 뭔가 이상하다. Dollar에 대해서 연산 수행 후 값이 바뀐다.

 

testMultiplication_2.java 는 2번의 연산으로 원하는 결과값을 받을 수 없음을 보여준다.

testMultiplication_3.java 는 times에서 Dollar객체를 반환하도록 하는 것이다. 그러나 times의 반환형이 void이기 떄문에 컴파일 에러가 날 것 이다.

 

그래서 아래와 같이 Dollar 클래스를 수정한다.

 

Dollar_13.java 는 컴파일을 위해서 times메서드의 반환타입을 Dollar로 변경하고 null을 반환한다.

Dollar_14.java 는 연산결과(amount * multiplier)를 이용해서 Dollar 인스턴스를 반환한다.

 

할일목록

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

1장에선 가짜 구현을, 이번 장에서는 올바른 구현을 이용해서 테스트 코드를 작성했다.

 

테스트 통과를 위한 전략 두가지

- 가짜로 구현하기 : 상수를 반환하게 만들고 진짜 코드를 얻을 때까지 단계적으로 상수를 변수로 바꾸어 간다.

- 명백한 구현 사용하기 : 실제 구현을 입력한다.

 

저자는 실무에서 두 가지 방법을 번갈아가면서 사용한다.

자연스럽게 잘 진행되면 명백한 구현을, 구현하다가 테스트 통과를 못하면 가짜로 구현하기로 개발하다가 올바른 코드로 리펙토링을 한다.

3장에선 새로운 방법인 삼각측량이 등장

 

배운 것 검토

- 설계상의 결함(Dollar 부작용)을 그 결함으로 인해 실패하는 테스트로 변환했다.

- 스텁 구현으로 빠르게 컴파일을 통과하도록 만들었다.

- 올바르다고 생각하는 코드를 입력하여 테스트를 통과했다.

 

느낌 -> 테스트로 변환하는 것은 TDD의 일반적 주제다.

이런 작업을 오래 할수록 미적 판단을 테스트로 담아내는 것에 익숙해진다.

그렇게 되면 설계 논의는 훨씬 더 흥미로워진다.

 

 

 

Comments