TDD란 Test Driven Development의 약자로 테스트 주도 개발이라고 한다. 엔지니어 켄트 백 (Kent Beck)에 의해 고안되었다.
테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.
짧은 개발 주기의 반복에 의존하는 개발 프로세스이며 애자일 방법론 중 하나인 eXtream Programming(XP)의 Test-First 개념에 기반을 둔 단순한 설계를 중요시한다.
Unit Test 구조가 짜여져 있으면 코드를 수정할 때 확인이 쉽기 때문에 코드를 수정하는데 두려움이 없어진다. Unit Test 구조를 만들 수 있다는 것은 기획서의 요구사항을 제대로 이해하고 있다는 뜻이다.
eXtream Programming(XP)란?
미래에 대한 예측을 최대한 하지 않고,
지속적으로 프로토타입을 완성하는 애자일 방법론 중 하나이다.
이 방법으론은 추가 요구사항이 생기더라도, 실시간으로 반영할 수 있다.
켄트 백 (Kent Beck)은 TDD가 프로그래밍 기법이나 기술적인 느낌보다는 심리적인 것으로 볼 수 있다고 한다. TDD는 결정(Decision)과 피드백(Feedback)의 갭에 대한 인식을 하고 그러한 갭을 조절하기 위한 테크닉을 늘려가는 것이다. 갭이 커질 수록 문제가 발생하고 그 갭을 전혀 이해하지 못한다면 더 큰 문제가 발생하게 된다.
결정(Decision)?
- 프로그램을 하다보면 ‘이 방법으로 해야지’, ‘이 부분은 이걸 이용해서 짜야지’라는 것을 결정한다.
피드백(Feedback)?
- 프로그램을 하다보면 성공/실패(에러)라는 피드백을 받는다.
Example.
- 결정: 나이를 구하는 코드를 작성할 때, ‘나는 빼기로 나이를 구해야겠다.’라는 것을 결정한다.
- 피드백: 빼기로 계산했을 때의 코드를 테스트 프로그램을 실행한 결과로, 된다/안된다라는 프로그램 상의 피드백을 받는다.
- 이 둘 사이의 갭을 내가 인식한다면 TDD를 하고 있는 것이다.
테스트의 장점은 너무나도 많다.
제품의 안정성을 높이고, 기능 추가 및 수정으로 인한 부작용(Side-effect)를 줄일 수 있으며, 불안감 없이 코드 작성을 할 수 있도록 도와주고, 결과적으로 생산성을 매우 높여 준다. 디버깅을 쉽게 해주고, 개발 과정에서 반복적인 작업들을 하지 않도록 도와주며, 더 깔끔하고 재사용성이 좋은 코드 작성을 가능하게 해준다.
MVP, MVVM 과 같은 클라이언트 쪽에서 많이 회자되는 아키텍쳐들이 중요하게 생각하는 것은 바로 View와 로직의 분리이다. 이를 통해 얻고자 하는것 중 절대 빠질 수 없는 하나가 바로 테스트 가능성(Testability)이다.
UI Test는 어려워 빼더라도 Unit Test는 반드시 해야하는 이유다.
UI 없이 Unit Test가 불가능한 상태의 코드라면 다시한번 고민해봐야 한다.
TDD는 피드백과 협력을 증진시킨다. 테스트 코드(feedback)를 공유하여 개발자의 고민/의사결정(decision)을 확인 할 수 있기 때문에 개발자가 왜 그렇게 코드를 작성했는지 의도를 빠르고 쉽게 이해할 수 있다.
그리고 다른 개발자의 코드를 수정하더라도 자동화 된 테스트 코드가 문제를 알려주기 때문에 내가 코드를 망치면 어떡하지... 와 같은 걱정을 할 필요가 없어진다.
테스트 구성에는 단위 테스트(Unit test), 통합 테스트(Integration test), 승인 테스트(Acceptance test) 등 다양한 테스트가 존재한다. 각 테스트의 목적과 상황에 맞게 테스트를 구성하는 것도 중요하지만, 테스트의 원칙을 지키는 것이 우선되어야 한다.
소프트웨어 테스팅 분야에서 40여년 간 제안되고 발전해 온 일곱 개의 기본 원칙이다.
이 글에서는 항목과 간단한 설명만 첨부하고 각 항목에 대한 자세한 내용은 Seven Testing Principles 문서에서 확인할 수 있다.
단위 테스트는 가장 작은 단위의 테스트이며, 모든 테스트의 시작점이다. 단위 테스트만 구성되어도 굉장히 많은 문제를 해결할 수 있으며, 코드 품질이 훨씬 좋아질 수 있다. F.I.R.S.T 원칙은 다음 각 항목의 앞 글자를 딴 원칙이다.