TDD 란 ?
Test Driven Development의 약자로 '테스트 주도 개발'을 뜻한다.
단순히 테스트 코드를 작성하는 기법이 아니라, 소프트웨어 개발의 한 방법론이자 개발 철학에 가깝다.
TDD는 실패하는 테스트 코드를 먼저 작성한 후, 그 테스트 코드를 통과시키기 위한 최소한의 실제 코드를 작성하고,
마지막으로 코드를 개선(리팩토링)하는 과정을 반복하는 개발 방식이다.
이름대로 테스트가 개발 과정을 이끌어 나가는 방식이라고 볼 수 있다.
핵심 과정 : ( Red-Green-Refactor Cycle)

TDD는 다음의 세 단계를 매우 짧은 주기로 반복하며 진행된다.
1. 레드(RED)
- 실패하는 테스트 코드를 먼저 작성한다.
- 새로 구현하려는 기능의 요구사항을 정의하고, 이 요구사항을 만족하는 코드가 아직 없기 때문에 당연히 이 테스트 코드는 실행 시 실패해야 한다.
- 어떤 기능을 만들고 싶은 지, 그 기능이 어떤 입력에 대해 어떤 출력을 내보내야 하는 지를 테스트 코드를 먼저 명확하게 정의하는 단계이다.
- 테스트가 왜 실패하는 지 확인하는 것까지가 중요하다.
2. 그린(GREEN)
- 실패하는 테스트 코드를 통과시키기 위한 '최소한의' 실제 코드를 작성한다.
- 이 단계에서는 코드의 품질이나 설계의 아름다움보다는 오직 테스트를 통과시키는 것에 집중한다.
- 코드가 중복되거나 비효율적이어도 상관 없다.
- 테스트가 통과하여 상태가 'Green'으로 바뀌는 것을 확인하는 것이 목표이다.
3. 리팩터(REFACTOR)
- 테스트 코드가 모두 통과하는 상태(Green 상태)를 유지하면서 코드의 품질을 개선한다.
- 중복된 코드를 제거하거나, 함수/클래스를 더 작고 명확하게 분리하거나, 변수 이름을 더 잘 이해할 수 있도록 바꾸는 등 코드의 구조와 가독성을 개선한다.
- 리팩터링 후에도 모든 테스트가 여전히 통과되는 지 다시 한번 확인한다.
- 테스트가 안전망 역할을 해주기 때문에 코드 변경 시 안정성을 확보할 수 있다.
위 사이클을 새로운 기능을 추가하거나 기존 기능을 수정할 때마다 반복한다.
각 사이클은 짧게는 몇 분에서 길게는 몇십 분 내로 완료하는 것을 목표로 한다.
TDD의 장점
TDD는 처음에는 개발 속도를 늦추는 것처럼 느껴질 수 있지만, 장기적으로 볼 때 다음과 같은 많은 이점을 제공한다.
1. Better Design
- 코드를 작성하기 전에 코드를 사용하는 방법(테스트 코드)를 먼저 고민하게 만든다.
- 이는 실제 사용할 때 편리하고 모듈성이 높은 코드를 설계하도록 유도한다.
- 테스트하기 쉬운 코드는 일반적으로 의존성이 낮으며 응집도가 높다.
2. Reduced Bugs
- 요구사항을 테스트 코드로 먼저 명확하게 정의하면서 설계 단계에서 많은 잠재적인 버그나 예외 상황을 미리 발견하고 고려하게 된다.
- 잘 작성된 테스트 스위트(Test Suite)는 코드 변경 시 예상치 못한 Regression을 방지하는 강력한 안전망 역할을 한다.
3. Increased Confidence
- 모든 기능이 자동화된 테스트를 통해 검증되므로, 코드가 예상대로 정확하게 동작한다는 확신을 가질 수 있다.
- 이는 코드 변경이나 기능 추가 시 두려움을 줄여준다.
4. Living Documentation
- 테스트 코드는 해당 기능이 어떻게 사용되어야 하는 지를 보여주는 가장 정확하고 항상 최신 상태로 유지되는 역할을 한다.
- 새로운 개발자가 코드베이스를 이해하는 데 큰 도움이 된다.
5. Faster Development in the Long Run
- 초기 테스트 작성 시간 때문에 속도가 느려 보이는 것 같지만, 디버깅 시간이 현저히 줄어들고 버그 수정 및 회귀 테스트 비용이 감소하면서 장기적으로는 전체 개발 속도가 향상된다.
+ TDD가 디버깅을 없애는 것은 아니다. 하지만 디버깅에 소요되는 시간과 노력을 크게 줄여준다.
일반 개발 방식과 TDD 의 차이
일반적인 개발 방식 : 요구사항 분석 -> 설계 -> 개발 -> 테스트 -> 배포
- 코드를 먼저 작성하고, 기능이 잘 작동하는지 테스트를 통해 확인한다.
- 주로 기능 구현 후, 버그 수정 및 테스트를 진행하는 형태이다.
- 테스트는 기능 개발 후에 추가되거나, 필요한 경우에만 작성된다.
.테스트의 역할:
- 일반 개발 방식:
- 테스트는 개발 후에 기능이 정상적으로 동작하는지 확인하는 수단으로 사용된다.
- 개발 완료 후에도 기능이 변경될 때마다 추가적인 테스트나 수정이 필요하다.
- TDD:
- 테스트는 개발의 출발점
- 테스트는 코드가 개발되기 전부터 정의되며, 코드가 테스트를 통과할 때까지 반복적으로 작성되고 수정된다.
- 테스트가 항상 코드를 검증하는 중요한 도구로 기능한다.
TDD의 대표적인 Tool
JUnit란 ?
Java 언어로 작성된 애플리케이션에서 단위 테스트를 작성하고 실행할 수 있도록 도와주는 테스트 프레임워크이다.
JUnit은 TDD(Test-Driven Development)를 실천하는 데 중요한 역할을 하며, 코드가 요구 사항을 충족하는지 자동으로 검증하는 데 사용된다.
JUnit을 사용하면 수동으로 테스트를 실행할 필요 없이 테스트를 자동으로 실행할 수 있다.
이를 통해 테스트 자동화가 가능해지고, 코드 변경 시 테스트를 반복적으로 실행하여 버그를 빨리 찾을 수 있다.
또한, JUnit은 테스트가 서로 독립적으로 실행되도록 보장한다.
'CS' 카테고리의 다른 글
| Microsoft Azure에서 제공하는 API 디자인 모범 사례 (0) | 2025.04.04 |
|---|---|
| [소프트웨어 공학] UML (1) | 2024.10.20 |







