Test Driven Development. 즉 테스트 중심의 개발 방법론을 의미한다.
그 중에서도 자동 테스트를 전제로 한다
소프트웨어의 품질 유지를 위해선 꾸준한 테스트가 필수적이다.
기능의 추가, 변경, 삭제가 일어날 때마다 전체 코드에 미치는 영향을 고려하지 않을 수 없기에 전체 테스트가 요구된다.
이러한 수동 테스트 과정은 매우매우 많은 시간과 인적 리소스를 요구한다.
이를 개선하기 위해 JUnit 등의 자동 테스트 툴이 대두됐다.
| 구분 | 자동 테스트 | 수동 테스트 |
|---|---|---|
| 실행 주체 | 컴퓨터 | 사람 |
| 실행 속도 | 빠름 | 느림 |
| 실행 비용 | 낮음 | 높음 |
| 신뢰도 | 높음 | 낮음 |
| 유지보수 | 용이 | 어려움 |
| 반복성 | 좋음 | 나쁨 |
| 피로도 | 없음 | 높음 |
위 표처럼 자동 테스트는 수동 테스트에 비교했을 때 압도적인 퍼포먼스를 보인다.
자동 테스트가 보편화 된 후로, 다른 방식의 개발 방법론이 제한됐는데,
기존에 선개발 후테스트의 체제를 거꾸로 시행하는 것이다.
즉, 먼저 테스트 케이스들을 늘어놓고, 해당 테스트 케이스를 만족하게 프로그램을 작성하는 것.
이를 TDD라고 부른다.
TDD 방법론은 오늘날에 와서 보편적으로 사용되며, 특히 애자일 프로세스의 핵심이다.
애자일 프로세스의 짧고 반복적인 스프린트, 유저 피드백, 점진적 개발 전부가 자동 테스트가 정상적으로 돌아가고 이에 따른 개발이 가능하다는 것을 전제 하에 실행되기에, TDD는 애자일 프로세스의 중심적인 로직이다.
대부분의 현장에서 애자일 프로세스가 선호되는 만큼, TDD 역시 산업 표준이라 볼 수 있다.
해당 단락에선 툴을 활용한 자동 테스트에 대해 서술한다.
| 테스트 케이스(Test Cst) | 특정 기능이나 요구사항을 검증하기 위한 테스트 시나리오 |
|---|---|
| 단위 테스트(Unit Test) | 코드의 가장 작은 단위(메서드, 클래스 등)를 독립적으로 테스트 |
| 통합 테스트(Integration Test) | 여러 컴포넌트가 함께 동작하는 것을 테스트 |
| 기능 테스트(Functional Test) | 소프트웨어의 특정 기능 혹은 동작을 테스트 |
| 회귀 테스트(Regression Test) | 기존 기능이 새로운 변경사항으로 인해 깨지지 않았는지 확인하는 테스트 |
| 테스트 커버리지(Test Coverage) | 테스트가 얼마나 많은 코드를 실행했는지를 나타내는 지표 |
| 테스트 더블(Test Doubles) | 테스트를 위해 실제 객체 대신 사용하는 가짜 객체 (Mock, Stub, Spy 등) |
| 리팩토링(Refactoring) | 코드의 기능은 유지하면서 내부 구조를 개선하는 작업 |

1. Red : 실패하는 테스트 작성
2. Green : 테스트를 통과하는 최소한의 코드를 작성
3. Refactor : 코드 개선
기능이 충분히 완성될 때까지 위 3단계를 반복한다.
가짜로 구현하기
삼각측량법
명백하게 구현하기
Dynamic Programming을 통해 문제를 해결할 때, 점화식을 찾기 위해 여러 case를 늘어놓고 insight를 얻는데, 이러한 과정과 유사하다.
이런 장점 덕분에 개발 시간을 줄여주고 품질 향상에 기여할 수 있다.