테스트 주도 개발 TDD
1. 테스트 주도 개발 Test Driven Development TDD
테스트 주도 개발 방식은 개발을 여러개의 세부 단위로 나누어서 테스트하고 수정하고 완성하는 과정을 반복하는 익스트림 프로그래밍 방식의 하나입니다. 개발자는 테스트를 위한 코드를 작성하고, 그 테스트를 통과하기 위한 코드를 작성하는 하는 개발 방식입니다. 이 짧은 사이클을 프로젝트의 완성까지 반복해서 실시합니다.
즉, 기존 개발이 설계 > 실제 코드 작성 > 테스트의 순서로 진행되었다면, TDD는 설계 > 테스트 > 실제 코드 작성의 순서대로 이루어지는 것 입니다.
TDD의 가장 큰 특징이자 개발 방식은 프로젝트를 일정 단위로 나누고 그에 대한 테스트 코드를 작성하는 단위 테스트라는 작업을 합니다. 그리고 작성된 테스트를 통과하도록 코드를 작성하고, 작성된 코드를 리팩토링하여 실제 코드로 만들어 나가는 방식입니다.
2. 테스트 주도 개발의 장점과 단점
TDD의 장점은 다음과 같습니다.
- 테스트 이후 실제 코드 작성 과정에서 구조화가 용이해 객체 지향적 코드 작성이 유리하다.
- 작은 단위 테스트를 토대로 완성시켜 전체적인 프로그램 완성도가 높아진다.
- 버그 발생과 디버깅 시간이 줄어 프로그램 결함이 줄고, 유지보수 비용이 줄어든다.
- 작은 단위를 피드백에 따라 계속 리팩토링 하므로 코드가 깔끔해진다.
하지만 이런 TDD에게도 단점이 있습니다.
- 개발 시간이 늘어난다.
- 기존 방식에서 넘어오기가 어렵다.
아무래도 기존에는 코드 완성이후 테스트를 했지만 TDD는 설계 이후에 테스트 코드를 작성하고 그에 맞춰야 하니 기존 방식에 익숙한 사람들이 넘어올 때는 약간 애를 먹을 수도 있습니다.
그리고 단위별로 나눠서 그 단위 테스트에 대해 더 이상 결함이 없도록 리팩토링 하다보니 개발 시간이 늘어나기도 합니다. 이는 개발 기한을 엄수해야하는 프로젝트에서는 조금 문제를 앓을 수 있는 점입니다.
3. 테스트 주도 개발의 사이클
테스트 주도 개발은 일반적으로 다음과 같은 절차를 반복합니다.
- 요구사항: 고객의 요구사항이나 현재 개발 단계에 따른 테스트 단위를 끊는다.
- 실패: 테스트를 통과하지 못하는 케이스를 작성한다.
- 성공: 실패 단계에서 통과하지 못했던 케이스를 통과시키기 위해 코드를 고친다.
- 리팩토링: 작성된 성공 코드에 리팩토링이 가능하다면 리팩토링 작업을 한다.
- 반복: 테스트 단위가 완성 될 때 까지 다시 반복한다.
4. 테스트 주도 개발을 위한 도구들
현재는 TDD를 위한 도구들을 많이 지원하고 있습니다. 사실 이런 툴들이 없어도 테스트 코드를 작성하고 테스팅할 수 있지만, 툴들을 이용하면 더 간단하게 테스트를 진행할 수 있습니다.
자바의 JUint, C++를 위한 CppUnit, 자바스크립트의 Jasmine, Mocha, QUnit 등이 있습니다.