본문 바로가기
Computer Science/Method

TDD (Test-Driven Development)란?

by 코딩맛 2024. 11. 8.

 

TDD ( Test-Driven Development)란?

TDD (Test-Driven Development, 테스트 주도 개발)은 소프트웨어 개발 방법론 중 하나로,

개발자가 코드를 작성하기 전에 먼저 테스트 코드를 작성하는 방식을 말한다.

이 방법론은 소프트웨어의 기능을 작은 단위로 나누어 테스트하고, 이를 통해 버그를 사전에 방지하며, 
코드의 품질을 높이는 것을 목표로 한다.

 

 

TDD의 핵심 원칙 : Red-Green-Refactor 사이클

TDD는 주로 Red-Green-Refactor라고 불리는 세 단계의 반복 사이클을 통해 이루어진다.

 

Red-Green-Refactor 사이클

1. Red (실패하는 테스트 작성)

  • 새로운 기능을 추가하거나 기존 기능을 수정하기 위해 먼저 테스트 코드를 작성한다.
  • 이 테스트는 처음에 실패해야 한다. 왜냐하면 아직 해당 기능에 대한 실제 구현이 되어 있지 않기 때문이다.

2. Greean (테스트 통과를 위한 최소한의 코드 작성)

  • 테스트를 통과하기 위해 필요한 최소한의 코드를 작성한다.
  • 목표는 테스트가 성공이 되는 것이다. 이 단계에서 코드의 최적화나 구조보다는 빠르게 테스트를 통과하는 것에 중점을 둔다.

3. Refactor (리팩토링)

  • 테스트가 통과했으면, 이제 코드를 개선한다.
  • 중복된 코드 제거, 가독성 향상, 성능 최적화 등을 수행한다.
  • 리팩토링 후에도 여전히 모든 테스트가 통과해야 한다.

 

TDD의 예시

다음은 간단한 예시이다. 숫자를 입력받아 그 숫자의 제곱을 반환하는 함수를 TDD 방식으로 개발한다고 가정해보겠다.

 

1. Red 단계 (실패하는 테스트 작성)

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class MathUtilsTest {
    
    @Test
    void testSquare() {
        MathUtils mathUtils = new MathUtils();
        assertEquals(4, mathUtils.square(2)); // 예상 결과 4
        assertEquals(9, mathUtils.square(3)); // 예상 결과 9
    }
}

이 테스트를 실행하면 MathUtils 클래스와 square() 메서드가 아직 구현되지 않았으므로 실패한다.

 

2.  Green 단계 ( 테스트 통과를 위한 최소한의 코드 작성)

public class MathUtils {
    public int square(int num) {
        return num * num; // 입력 숫자의 제곱 반환
    }
}

이제 테스트를 다시 실행하면 성공한다.

 

3. Refactor 단계 (코드 개선)

  • 이 단계에서는 코드의 가독성을 높이거나 성능을 최적화하는 등의 리팩토링을 진행한다.
  • 하지만, 이번 예제는 매우 단순하기 때문에 별다른 리팩토링이 필요하지 않다.

 

TDD의 장점

  1.  높은 코드 품질 보장 : 코드를 작성하기 전에 테스트를 먼저 작성하기 때문에, 테스트 커버리지가 높아져 품질이 향상된다.
  2.  디버깅 시간 단축 : 사전에 버그를 발견하고 수정할 수 있어 디버깅에 소요되는 시간을 줄일 수 있다.
  3.  유연한 설계 가능 : 작은 단위의 기능을 검증하며 개발하므로, 코드 변경이 필요할 때 더 유연하게 대처할 수 있다.
  4.  신뢰할 수 있는 코드 : 리팩토링 시에도 테스트가 자동으로 검증되므로, 코드의 안정성을 유지할 수 있다.

TDD의 단점

  1.  초기 개발 속도 저하 : 테스트 코드를 먼저 작성해야 하므로 초기 개발 속도가 느릴 수 있다.
  2.  복잡한 테스트 관리 : 복잡한 시스템에서는 테스트 코드 관리가 어려워질 수 있다.
  3.  과도한 테스트 작성 : 모든 경우의 수를 고려하여 테스트를 작성하다 보면, 오히려 비효율적인 경우가 발생할 수 있다.

TDD가 적합한 상황

  • 복잡한 비즈니스 로직을 포함한 프로젝트
  • 안정성이 중요한 대규모 시스템
  • 지속적인 리팩토링기능 확장이 필요한 애플리케이션

TDD가 적합하지 않은 상황

  • 빠르게 프로토타입을 개발해야 하는 경우
  • UI/UX와 같이 테스트 작성이 어려운 경우
  • 너무 작은 프로젝트로 인해 TDD의 이점이 크지 않은 경우

TDD와 BDD의 차이

  • TDD (Test-Driven Development) : 기능의 구현 전에 테스트 코드를 먼저 작성한다. 주로 개발자의 관점에서 테스트한다.
  • BDD (Behavior-Driven Development) : 사용자의 요구사항에 따라 테스트 시나리오를 작성하고, 기능을 구현한다. 주로 비즈니스/ 사용자 관점에서 테스트한다.

 

 

TDD는 꾸준한 테스트와 리팩토링을 위해 신뢰할 수 있는 코드를 유지하도록 돕는 개발 방법론이다.

이를 통해 더 나은 품질과 유지보수성을 확보할 수 있다.

'Computer Science > Method' 카테고리의 다른 글

레이어드 아키텍처  (0) 2024.12.02
클린 아키텍처  (2) 2024.11.27
Testable Code란?  (0) 2024.11.13