테스트 주도 개발

테스트 주도 개발(TDD, Test-Driven Development)은 동작하는 깔끔한 코드를 위해서 테스트를 먼저 작성하는 개발 방법론을 의미한다. 여기서 테스트란 유닛 테스트를 의미한다. 


유닛테스트란 소스코드에 대한 개발자에게 함수와 모듈의 동작을 검증을 할 수 있게 도와주는 도구이다. 유닛 테스트는 개발된 코드의 사용 방법을 가이드 할 뿐만 아니라 여러 가지를 한번에 고민해야 하는 개발자에게 실수를 줄여주고 작성한 코드에 대한 테스트를 진행할 수 있어 견고한 수문장 역할을 한다고 말할 수 있다. 이미 많은 개발자들이 유닛테스트 활용이 중요하다는 것을 알고 있다고 생각한다. 팀이든 1인 개발이든 말이다.



테스트 주도 개발 - 10점
켄트 벡 지음, 김창준 외 옮김/인사이트



이 책에서 다양한 유머들을 책 곳곳에서 찾아볼 수 있다. 저자 "켄트 벡"은 단순 일 밖에 모르는 아저씨가 아님은 확실하다. 실제로 켄트 벡은 소프트웨어 엔지니어로 애자일의 XP 방법론을 창시한 사람으로도 유명하다. 또한 애자일 메니페스토를 만든 사람 중 1인으로써 개발 생태계에서 많은 활동을 하고 있는 사람이기도 하다. 


<구글 검색결과>



책 구성은 화폐예제, xUnit 예시, 테스트 주도 개발의 패턴 이렇게 3가지로 크게 나눌 수 있다. 이 중에서 화폐예제는 매우 흥미로운 부분이다. 화폐예제는 하나의 프로그램을 수정해나가는 과정을 이야기하는데 다음과 같은 특징을 갖는다.

  • 테스트 주도 개발 절차를 소개하고 그대로 활용하는 예제를 보여준다.
  • 바로 옆에서 코드를 고치면서 알려주듯이 이야기 한다.
  • 테스트 주도 개발을 하면서 겪게 되는 고민들까지 포함되어 있다.

위에서 테스트 주도 개발을 위해서는 테스트를 먼저 작성해야 하는 것이라고 설명했다. 작성한 코드가 없는데 테스트를 먼저 작성하라니 코딩을 해본 사람이라면 이 문장이 쉽게 이해가 되지는 않을 것이다. 화폐예제를 통해서 "아, 테스트를 먼저 작성한다는 것은 이런 걸 의미하는구나"라고 좀 더 쉽게 이해할 수 있다.


하지만 이 책을 읽기 위해서는 기본 지식이 필요하다.  자바 언어를 예제로 사용하고 있는데 자바를 모르더라도 최소한 객체지향 언어에 대한 이해가 있어야 한다. 또한 유닛테스트에 대한 경험이 없다면 흥미롭게 작성된 화폐예제를 읽게 되더라도 몰입이 되지 않을 것이다.


이 책을 읽으면서 얻어가야하는 것은 2가지라고 생각한다.

  • 테스트 주도개발은 왜 해야 하는가? 테스트를 먼저 작성함으로써 무엇을 얻을 수 있는가?
  • 테스트 주도 개발은 무엇이고, 테스트 주도 개발은 어떻게 해야 하는가?


테스트 주도 개발의 목적은 작동하는 깔끔한 코드다. 

작동하는 깔끔한 코드(clean code that works). 론 제프리즈의 핵심을 찌르는 이 한마디가 바로 테스트 주도 개발의 궁극적인 목표다. 작동하는 깔끔한 코드가 훌륭한 목표임을 말해주는 수많은 이유가 있다.

<저자의 글>


작동하는 깔끔한 코드를 위해서는 왜 테스트를 먼저 작성해야 하는가? 의외로 간단하다. 목적은 작동하는 깔끔한 코드다. 일반적으로 코딩 과정을 생각해보면 깔끔한 코드를 먼저 작성하고 작동 여부를 확인한다. 반대로 생각해보는 것이다. 일단 코드를 작동하게 하고 깔끔한 코드를 만들게 하는 것이다.


‘제대로 동작하는’을 푸는 동시에 ‘깨끗한 코드’를 해결하는 것은 한번에 하기에는 너무 많은 일일 수 있다. 그렇게 되면 우선 ‘제대로 동작하는’으로 되돌아 가서 그걸 해결하고, 그 후에 ‘깨끗한 코드’를 느긋하게 해결하도록 하라.


가짜로 구현하기를 강력하게 만드는 두 가지 효과가 있다.


 1. 심리학적 - 초록 막대 상태에 있는 것은 빨간 막대 상태에 있는 것과 천지 차이다. 막대가 초록색일 떄, 자신이 어디에 서 있는지 안다. 당신은 확신을 갖고 거기부터 리팩토링해 갈 수 있다.


 2. 범위(scope) 조절 - 프로그래머들은 모든 종류의 미래 문제를 상상하는데 탁월하다. 하나의 구체적인 예에서 시작해서 일반화하게 되면, 쓰잘데기 없는 고민으로 때 이르게 혼동하는 일을 예방할 수 있다. 다음 테스트 케이스를 구현할 때, 이전 테스트의 작동이 보장된다는 것을 알기 때문에 그 다음 테스트 케이스에도 집중할 수 있다.


<28장 초록 막대 패턴>


TDD 주기는 다음과 같다.

 1. 작은 테스트를 추가한다.
 2. 모든 테스트를 실행하고, 실패하는 것을 확인한다.
 3. 코드에 변화를 준다.
 4. 모든 테스트를 실행하고, 성공하는 것을 확인한다.
 5. 중복을 제거하기 위해 리팩토링한다.


<17장 Money 회고>


테스트 주도 개발을 어떻게 해야하는지는 "화폐예제"를 통해서 알 수 있다. "xUnit"과 "테스트 주도 개발의 패턴"은 실제로 활용하는데 도움이 되는 내용으로 되어 있다.


이 책은 테스트 주도 개발의 개념과 기본 방법을 익히는데 아주 탁월한 책이다. 다만 테스트 주도 개발을 "잘" 하기 위해서는 숙련된 유닛 테스트 방법이 필요하다고 생각한다. 여기에서는 유닛 테스트를 어떻게 잘 작성하는게 좋을까에 대해서는 답을 얻어가기 어려울 것이다. 이를 위해서는 추가 학습이 필요하다.



Tags

Read Next

*

*

티스토리 툴바