TDD 에 대한 설명은 개발자 면접에서 자주 나오는 질문 중의 하나!
반복 테스트를 이용한 소프트웨어 방법론
작은 단위의 테스트 케이스를 작성하고, 이를 통과하는 코드를 추가하는 단계를 반복하여 구현
애자일 방법론 중 하나인 eXtream Programming(XP)의 'Test-First' 개념에 기반을 둔 단순한 설계를 중시
단, 실무에 TTD 를 적용하는 것은 업무 환경에 따라 요구되지 않을 수도 있다!
애자일 방법론
지속적으로 피드백을 반영할 수 있는 방법eXtream Programming(XP)
미래에 대한 예측을 최대한 하지 않고, 지속적으로 프로토타입을 완성하는 애자일 방법론 중 하나.
추가 요구사항이 생기더라도, 실시간으로 반영할 수 있다.
JUnit
- TDD의 대표적인 Tool
- 전 세계적으로 가장 널리 사용되는 'Java 단위 테스트 프레임워크'
RED
: 테스트 작성 단계
아직 구현되지 않는 기능에 대한 테스트를 작성
주의!
실패하는 테스트 코드를 작성할 때까지 실제 코드를 '작성하지 않아야' 한다.
GREEN
: 구현 단계
REFACTOR
: 리팩토링 단계
예시
생년월일(input)을 입력받으면 현재 나이(output)를 출력하는 프로그램
간단한 것으로 목표를 정한다.
만들기 전, 만든 후에 무엇을 테스트할지를 설계
테스트를 통과할 프로그램(1.을 목표로 작성한 코드)를 만든다.
테스트 프로그램으로 이 프로그램(3.에 해당하는 코드)을 실행한다.
통과했으면 새로운 테스트를 추가
위의 작업들을 계속 왔다갔다 수행
소프트웨어 개발을 느리게 하는 잠재적 위험이 존재한다.
소비자의 요구사항이 처음부터 명확하지 않을 수 있다.
자체 버그 검출 능력 저하 or 소스코드의 품질이 저하될 수 있다.
자체 테스트 비용이 증가할 수 있다.
디자인(설계) 단계에서 프로그래밍 목적을 반드시 미리 정의해야 한다.
무엇을 테스트해야 할지 미리 정의(테스트 케이스 작성)해야만 한다.
테스트 코드를 작성한 뒤에 실제 코드를 작성
테스트 코드를 작성하는 도중에 발생하는 예외 사항(버그, 수정사항)들은 테스트 케이스에 추가하고 설계를 개선한다.
이후 테스트가 통과된 코드만을 코드 개발 단계에서 실제 코드로 작성한다.
디버깅 시간 단축
이는 유닛 테스팅을 하는 이점이기도 하다.
사용자의 데이터가 잘못 나온다면
재설계 시간을 단축
작성한 코드가 가지는 불안정성을 개선하여 생산성 향상
코드가 내 손을 벗어나기 전에 가장 빠르게 피드백 받을 수 있다.
일반 개발 방식 : 90% 이상 완성된 코드를 가지고 테스트하기 때문에, 문제를 발견해도 정확하게 원인이 무엇인지 진단하기는 힘들다.
TDD : 기능 단위로 테스트를 진행하기 때문에, 코드가 모두 완성되어 프로그래머의 손을 떠나기 전에 피드백을 받는 것이 가능하다.
추가 구현이 용이
이러한 TDD의 장점에도 불구하고 모두가 이 개발 프로세스를 따르지 않는다.
생산성의 저하 (느린 개발 속도)
이제까지 자신이 개발하던 방식을 많이 바꿔야 한다.
구조에 얽매힌다.
참고: TDD 방법론 (테스트 주도 개발) - 알기 쉽게 정리
참고: 애자일과 워터폴 방법론 비교 | 정의, 차이, 장단점, 적합한 조직