TDD(Test-Driven Development)

Kkd·2024년 11월 28일
0

매일메일 개념정리

목록 보기
12/93

TDD (Test-Driven Development, 테스트 주도 개발)

TDD테스트 코드 작성을 중심으로 애플리케이션 개발을 진행하는 소프트웨어 개발 방법론입니다.
"테스트를 먼저 작성하고, 해당 테스트를 통과하는 코드를 작성한다"는 철학에 기반합니다.


1. TDD의 절차

TDD는 Red-Green-Refactor 사이클로 구성됩니다:

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

    • 구현하려는 기능에 대한 테스트 코드를 작성합니다.
    • 초기에는 해당 기능이 구현되지 않았으므로 테스트가 실패합니다.
      (즉, "빨간색" 실패 상태를 확인합니다.)
  2. Green (테스트 통과)

    • 테스트를 통과시키기 위해 최소한의 코드를 작성합니다.
    • 목적은 "테스트를 통과"시키는 것에만 집중하고, 코드 품질이나 구조는 고려하지 않습니다.
  3. Refactor (리팩터링)

    • 테스트를 통과한 코드를 리팩터링하여 중복 제거, 가독성 개선, 구조 최적화를 진행합니다.
    • 리팩터링 후에도 테스트가 통과해야 합니다.

2. TDD의 핵심 규칙

  1. 테스트 코드를 먼저 작성한다.
  2. 작성된 테스트는 반드시 실패 상태로 시작한다.
  3. 테스트를 통과시키기 위해 최소한의 코드만 작성한다.
  4. 테스트 통과 후에는 반드시 리팩터링을 진행한다.

3. TDD의 장점

  1. 안정적인 코드 베이스

    • 테스트 코드가 먼저 작성되므로, 코드 변경 시에도 동작을 보장할 수 있습니다.
  2. 빠른 피드백 제공

    • 테스트 실패 여부를 바로 확인할 수 있어, 개발 속도가 빨라지고 디버깅이 쉬워집니다.
  3. 설계 품질 향상

    • 테스트를 먼저 작성하면, 요구사항을 더 명확히 이해하고, 더 좋은 설계로 이어질 가능성이 높습니다.
  4. 버그 예방

    • 테스트 코드가 방어막 역할을 하여 새로운 코드로 인해 기존 기능이 망가지는 것을 방지합니다.
  5. 리팩터링 용이

    • 테스트 코드가 코드 변경 후에도 기능을 보장하므로, 안전하게 리팩터링할 수 있습니다.

4. TDD의 단점

  1. 초기 개발 속도 저하

    • 테스트 코드 작성에 시간이 추가로 소요됩니다.
    • 특히 익숙하지 않은 개발자에게는 부담이 될 수 있습니다.
  2. 테스트 코드 관리 부담

    • 프로젝트가 커질수록 테스트 코드 역시 많아지며, 유지보수가 필요합니다.
  3. 모든 경우를 테스트하기 어려움

    • 복잡한 시스템에서는 모든 경로와 조건을 테스트하는 데 한계가 있습니다.
  4. 추상적 요구사항에 대한 테스트 어려움

    • UI와 같은 시각적 요소나 비즈니스 요구사항이 추상적일 경우, 초기 테스트 작성이 어렵습니다.

5. TDD와 BDD의 차이

특징TDD (Test-Driven Development)BDD (Behavior-Driven Development)
초점코드와 기능의 동작 검증사용자 행동(Behavior) 검증
테스트 작성 방식주로 JUnit, TestNG 등 단위 테스트 도구 사용Cucumber, Spock 등 Behavior 도구 사용
언어개발자가 이해하기 쉬운 코드 중심의 테스트 작성비즈니스 이해관계자도 이해할 수 있는 시나리오 작성
출발점메서드, 클래스와 같은 기술적 요소요구사항과 사용자 스토리 중심

6. TDD 예제

요구사항:

숫자를 입력받아, 짝수일 경우 true, 홀수일 경우 false를 반환하는 메서드를 작성합니다.

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

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;

public class NumberUtilsTest {
    @Test
    public void testIsEven() {
        assertTrue(NumberUtils.isEven(2));   // 짝수 -> true
        assertFalse(NumberUtils.isEven(3)); // 홀수 -> false
    }
}

(2) Green: 최소한의 코드 작성

public class NumberUtils {
    public static boolean isEven(int number) {
        return number % 2 == 0;
    }
}

(3) Refactor: 코드 개선

현재는 리팩터링 필요성이 없으므로, 상태 유지.


7. TDD를 활용할 때 유용한 도구

  • JUnit: Java에서 가장 널리 사용되는 단위 테스트 프레임워크.
  • Mockito: Mock 객체를 사용해 의존성을 분리한 테스트를 작성.
  • Spring Boot Test: Spring 환경에서 통합 테스트를 지원.
  • AssertJ: 가독성 좋은 테스트 검증 도구.

8. TDD 적용 시 고려 사항

  1. 작은 단위로 시작

    • 단위 테스트를 먼저 작성하여 작은 범위의 기능부터 TDD를 적용.
  2. 자동화 테스트 환경 구축

    • CI/CD 파이프라인에서 테스트가 자동 실행되도록 구성.
  3. 적극적인 코드 리뷰

    • 테스트 코드 품질도 코드 리뷰를 통해 점검.
  4. 팀의 합의

    • 팀원들이 TDD 방식에 동의하고, 협력하여 효율적으로 진행.

요약

TDD는 테스트 우선 개발 방법론으로, 코드의 품질을 높이고 유지보수성을 개선할 수 있습니다.
"Red-Green-Refactor" 사이클을 통해 코드를 점진적으로 완성하며, 올바른 설계를 유도합니다.
초기 학습 비용과 시간 투자가 필요하지만, 장기적으로 안정적이고 신뢰성 있는 소프트웨어를 개발하는 데 매우 효과적입니다.

profile
🌱

0개의 댓글