TDD 1~2장

Young Min Sim ·2021년 6월 1일
0

TDD

목록 보기
1/6

TDD 를 공부하게 된 이유

리팩토링을 하다 보면 사이드 이펙트가 생기지 않을까 하는 두려움이 생겼기 때문
두려움에 떨 시간, 빌드하면서 테스트 할 시간에 테스트 코드를 작성하여 이후 발생할 수 있는 리팩토링에도 유연하게 대처할 수 있는게 낫지 않을까? 하는 생각

테스트 주도 개발은 프로그래밍하면서 나타나는 두려움을 관리하는 방법이다.
P.24


TDD 를 대하는 자세

완성된 프로그램 코드를 보거나 간단한 매뉴얼 정도로는 TDD를 익힐 수 없다.
켄트 백의 책 TDD 에 있는 예제를 차근 차근 직접 작성해보며 따라가는게 중요하다.

책 목차

  1. Money 예제
  2. xUnit 예제
  3. 테스트 주도 개발을 위한 패턴들

TDD 에 들어가기 앞서 중요한 문구 2개 (P.23)

  1. 작동하는 깔끔한 코드
  2. 빨강, 초록, 리팩토링

    https://marsner.com/blog/why-test-driven-development-tdd/

1. 빨강: 실패하는 작은 테스트를 작성한다. 컴파일 되지 않아도 된다.
2. 초록: 빨리 테스트가 통과하게끔 만든다. 이를 위해 어떤 죄악(무조건 통과하는 상수 반환 등)을 저질러도 된다.
3. 리팩토링: 테스트를 통과하게만 하는 와중에 생겨난 중복 제거


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

할일 목록

$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 반올림?

이 장에서 한 작업들 검토

  • 작업 테스트 목록 작성
  • 오퍼레이션을 코드로 표현했다.
  • 스텁 구현을 통해 테스트를 컴파일 했다.
  • 죄악(상수 반환)을 범하여 테스트를 통과시켰다.
  • 돌아가는 코드에서 상수를 변수로 변경하여 점진적으로 일반화했다.
  • 새로운 할일들을 한번에 처리하는 대신 할일 목록에 추가하고 넘어갔다.

2. 타락한 객체

일반적인 TDD 주기는 다음과 같다.

  1. 테스트를 작성한다. 오퍼레이션이 코드에 어떤 식으로 나타나길 원하는지 생각한다.
  2. (최소 테스트만 통과하도록) 실행가능하게 만든다. 빨리 초록 막대를 보는 것이 목표다. 죄악을 저질러도 된다.
  3. 올바르게 만든다. (리팩토링). 이제 작동하므로 중복을 제거

'작동하는 깔끔한 코드를 만들어라' 를 달성하는 것은 최고의 프로그래머들에게도 힘든 목표이다.
따라서 나누어 정복하자(divide and conquer).
'작동하는 깔끔한 코드를 만들어라' 중 '작동하는'을 먼저 해결하고 나서 '깔끔한 코드' 부분을 해결한다.

테스트 실패

컴파일 실패

컴파일 성공

테스트 성공

할일 목록

$5 + 10CHF = $10
$5 X 2 = $10
amount를 private으로 만들기
Dollar 부작용(side effect)?
Money 반올림?

이 장에서 한 작업들 검토

  • 설계상의 결함(Dollar 부작용)을 그 결함으로 인해 실패하는 테스트로 변환했다.
  • 스텁 구현으로 빠르게 컴파일을 통과하도록 만들었다.
  • 올바르다고 생각하는 코드를 입력하여 테스트를 통과했다.

0개의 댓글