TDD (Test-Driven Development)는 소프트웨어 개발 방법론 중 하나로, 테스트 주도 개발을 의미합니다. TDD는 코드를 작성하기 전에 먼저 그 코드가 수행할 동작에 대한 테스트 케이스를 작성하고, 이 테스트를 통과하도록 코드를 구현하는 방식으로 진행됩니다. TDD는 주로 애자일 개발에서 많이 사용되며, 코드의 품질을 높이고 유지보수를 용이하게 만듭니다.(테스트->코딩->리팩터링)
TDD의 주요 흐름
- 테스트 작성 (Red):
- 먼저 실패할 수밖에 없는 테스트를 작성합니다. 이때 코드는 아직 구현되지 않았기 때문에 테스트는 실패하게 됩니다.
- 코드 작성 (Green):
- 테스트를 통과할 수 있도록 최소한의 코드를 작성합니다. 이 단계에서는 테스트를 통과시키는 것이 우선이므로 간단하게 구현합니다.
- 리팩토링 (Refactor):
- 코드를 개선하거나 중복을 제거하여 더 깔끔하고 효율적인 코드를 작성합니다. 테스트는 여전히 통과해야 합니다.
이 주기를 반복하면서 테스트와 코드를 점진적으로 발전시켜 나가는 방식입니다.
TDD의 장점
- 빠른 피드백 제공: 테스트를 먼저 작성하기 때문에 코드 작성 후 즉시 피드백을 받을 수 있습니다.
- 코드 품질 향상: 코드를 테스트하면서 작성하기 때문에 높은 품질의 코드가 보장됩니다.
- 유지보수 용이: 기존 코드를 변경할 때도 기존 테스트가 통과하는지 확인함으로써 안정성을 확보할 수 있습니다.
- 디자인 개선: TDD는 개발자가 테스트를 먼저 작성하도록 요구하기 때문에 코드의 설계를 더 나은 방향으로 이끌 수 있습니다.
TDD 예시 (Java와 JUnit을 사용한 예시)
간단한 TDD 예시로 숫자를 더하는 함수를 만들어 보겠습니다.
1. 테스트 작성 (Red)
우선, 숫자 두 개를 더하는 함수를 작성하는 테스트 코드를 먼저 작성합니다.
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
int result = calculator.add(2, 3);
assertEquals(5, result);
}
}
이 단계에서는 Calculator 클래스와 add 메서드가 아직 구현되지 않았습니다. 따라서 테스트는 실패합니다.
2. 코드 작성 (Green)
이제 Calculator 클래스를 작성하여 테스트가 통과하도록 코드를 최소한으로 구현합니다.
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
이 코드는 단순하게 두 숫자를 더하는 add 메서드를 구현한 것입니다. 이제 이 테스트를 실행하면 성공합니다.
3. 리팩토링 (Refactor)
이번 단계에서는 현재 구현된 코드를 다시 살펴보고 개선할 부분이 있는지 확인합니다. 이 예시에서는 리팩토링할 부분이 별로 없으므로, 코드 그대로 유지해도 괜찮습니다.
TDD의 3단계 요약
- Red: 테스트 코드 작성 → 아직 구현되지 않은 상태이므로 실패.
- Green: 테스트를 통과하도록 최소한의 코드 작성 → 테스트 성공.
- Refactor: 코드를 개선하거나 중복을 제거 → 테스트가 여전히 성공하는지 확인.
복잡한 TDD 예시 (FizzBuzz 문제)
다음으로, 조금 더 복잡한 예시로 FizzBuzz 문제를 TDD 방식으로 풀어보겠습니다. FizzBuzz는 다음과 같은 규칙을 따르는 문제입니다:
- 숫자가 3의 배수이면 "Fizz"를 반환.
- 숫자가 5의 배수이면 "Buzz"를 반환.
- 숫자가 3과 5의 배수이면 "FizzBuzz"를 반환.
- 그 외에는 숫자 그대로 반환.
1. 테스트 작성 (Red)
먼저 FizzBuzz 규칙을 테스트하는 코드를 작성합니다.
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class FizzBuzzTest {
@Test
public void testFizzBuzz() {
FizzBuzz fizzBuzz = new FizzBuzz();
assertEquals("Fizz", fizzBuzz.getResult(3));
assertEquals("Buzz", fizzBuzz.getResult(5));
assertEquals("FizzBuzz", fizzBuzz.getResult(15));
assertEquals("2", fizzBuzz.getResult(2));
}
}
이 테스트에서는 FizzBuzz 클래스와 getResult() 메서드가 아직 없으므로 테스트는 실패합니다.
2. 코드 작성 (Green)
이제 테스트를 통과할 수 있도록 FizzBuzz 로직을 구현합니다.
public class FizzBuzz {
public String getResult(int number) {
if (number % 15 == 0) {
return "FizzBuzz";
} else if (number % 3 == 0) {
return "Fizz";
} else if (number % 5 == 0) {
return "Buzz";
} else {
return String.valueOf(number);
}
}
}
이 코드를 작성하면 테스트는 성공하게 됩니다.
3. 리팩토링 (Refactor)
FizzBuzz 로직 자체는 매우 단순하므로, 이 단계에서는 특별히 리팩토링할 부분이 없습니다.
TDD 요약
TDD는 테스트를 먼저 작성하고, 그 테스트를 통과하는 코드를 작성한 후, 마지막으로 리팩토링하는 과정을 통해 개발이 진행됩니다. 이는 코드의 품질을 높이고 유지보수성을 강화하는 데 매우 유용한 개발 방법론입니다. TDD는 지속적인 테스트 작성과 실행을 통해 개발 중 발생할 수 있는 오류를 조기에 발견할 수 있으며, 테스트 가능한 코드 구조를 자연스럽게 유도합니다.
'IT지식' 카테고리의 다른 글
PDCA사이클(Plan, Do, Check, Act)이란? (1) | 2024.10.14 |
---|---|
블루/그린 배포(Blue-Green Deployment), 카나리아(Canary Deployment)배포란? (0) | 2024.10.14 |
API와SDK의 개념과 차이 (3) | 2024.10.14 |
UUID(Universally Unique Identifier)란? (0) | 2024.10.14 |
SOAP, WSDL, UDDI의 개념 (2) | 2024.10.14 |