Test-Driven Development:By Example 책 리뷰 | 1부. 화폐예제

TDD는 이제까지 배웠던 개발 개념들 중 이론적으로 이해하기 가장 어려운 개념이었다. 그러나 이 책의 1부에 나와있는 화폐 예제 코드를 더듬더듬 따라치며 저자의 의식의 흐름대로 작성한 것 같은 설명글을 같이 읽고나니 조금(아주 조금) TDD가 어떤 것인지 알 것 같았다.

이번 포스팅에서는 Test-Driven Development:By Example 책의 1부 화폐예제 코드를 직접 실습해보고, 그 과정에서 배운점을 공유해보려한다.

실습 결과물

https://github.com/eunbin20/tdd

배운점

TDD의 핵심

  1. 확실한 실패(빨간불)
  2. 어떻게든, 어거지로 성공시킨다.(초록불)
  3. 중복을 없애며 리팩토링한다.(리팩토링)

위 작업의 주기는 짧을 수록 좋다. 위 주기가 길다는 것은 여러 단계를 한 번에 뛰어넘으려했다는 것. 책에는 이런 말이 있었다.

이 단계가 너무 작게 느껴지는가? 하지만 기억하기 바란다. TDD의 핵심은 이런 작은 단계를 밟아야 한다는 것이 아니라, 이런 작은 단계를 밟을 능력을 갖추어야한다는 것이다.

작은 단계로 작업하는 방법을 배우면, 저절로 적절한 크기의 단계로 작업할 수 있게 될 것이다.

TDD에 익숙치 않으면 않을수록 최대한 작은 단계의 과정부터 밟아나가야 한다. 작은 단계를 충분히 연습한 뒤엔 적절한 크기의 단계로 작업할 수 있게 될 것이다.

빨 -> 초 -> 리 사이클을 한 번 돌고 나면 적어도 이 기능은 앞으로도 영원히 정상작동되는 것이 보장된다.

복붙의 중요성

TDD 방식으로 개발하려면 테스트를 작성하기가 쉬워야 한다. 기존에 조금이라도 비슷하게 작성된 코드가 있다면 복붙부터 하는 것이 맞는 순서이다. 조금이라도 더 빠르게 테스트를 작성할 수 있는 방법이라면, 그리고 더 빠르게 빨간불을 초록불로 만들어주는 작업이라면, 죄짓기를 두려워하지 말자.

테스트코드의 가장 큰 혜택은 리팩토링의 안정성

충분한 테스트가 갖춰지지 못한 곳에서 리팩토링을 하게 되는 경우, 있으면 좋을 것 같은 테스트를 작성하라. 그렇지 않으면 결국에는 리팩토링하다 뭔가 깨트릴 것이다.

이 책을 읽고난 이상,, 테스트 코드 없이 리팩토링을 진행하는 건 외나무 다리를 건너는 것과 비슷하다고 느껴진다. 성공할 가능성이 있긴 하지만, 실패할 가능성이 더 높고, 예상치 못한 부분에서의 사이드 이펙트가 우려되어 심적으로도 불안하다.

TDD 접근 방법

  • 가짜로 구현하기: 최대한 빨리 테스트를 통과하기 위해 정답이 아닌 가짜 정답을 구현하는 방법
  • 삼각측량법: 값이 다른 여러 테스트를 작성하고, 이를 일반화하여 정답을 구현하는 방법
  • 명백하게 구현하기: 정답을 바로 구현하는 방법

느낀점

항상 에러에 끌려다니기 바빴던 것 같은데, 에러가 날 상황을 의도적으로 만들고, 에러를 파악하고,test를 watch 하면서 한 단계 한 단계 해결해나가는 과정에서 주도적으로 개발하고있다는 느낌을 받았다.

그리고 책이 생각보다 재밌다. 되게 어려운 책일거라고 생각했는데, 조금 웃긴 시니어 개발자분과 페어프로그래밍하는 기분이었다.