[CS] TDD(Test-Driven Development)란?

해피몬·2024년 9월 21일
post-thumbnail

TDD란 무엇인가? 🤔

TDD (Test-Driven Development), 즉 테스트 주도 개발은 소프트웨어 개발 방식 중 하나로, 테스트를 먼저 작성하고 나서 코드를 구현하는 개발 프로세스임. TDD는 개발자가 작성하는 기능의 요구사항과 기대 결과를 사전에 정의하고, 이를 검증할 테스트를 먼저 작성함으로써 코드의 신뢰성과 유지보수성을 높이는 데 도움을 줌.

TDD의 장점 🌟

TDD는 코드 품질을 높이고 유지보수를 용이하게 하며, 코드가 의도한 대로 작동하는지에 대한 확신을 줌. TDD의 주요 장점은 다음과 같음:

  • 코드 품질 향상: 테스트를 통해 구현한 기능이 올바르게 작동하는지 검증하여 더 안정적이고 신뢰성 있는 코드를 작성할 수 있음.
  • 빠른 피드백 루프: 코드를 작성할 때마다 테스트를 실행하여 오류를 즉시 확인하고, 피드백을 통해 버그 발생을 줄일 수 있음.
  • 리팩토링 용이성: 리팩토링 시 테스트가 기능의 정상 동작을 보장해주어 더 자유롭게 코드 구조를 개선할 수 있음.
  • 문서화 역할: 테스트 코드가 기능 요구사항과 동작을 설명하는 문서 역할을 함.

TDD의 프로세스: Red-Green-Refactor 🔄

TDD는 Red-Green-Refactor라는 세 단계로 진행되며, 각 단계에서 테스트를 먼저 작성하고 코드를 구현함.

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

첫 번째 단계는 실패하는 테스트 작성임. 여기서는 요구사항을 기반으로 테스트를 먼저 작성하고, 이 테스트가 실패하는지 확인함. 이 과정에서 구현할 기능이 명확해지며, 구현해야 하는 코드의 목표와 예상 결과를 정의할 수 있음.

function add(a, b) {
  return a + b;
}

test("adds 1 + 2 to equal 3", () => {
  expect(add(1, 2)).toBe(3); // 실패하는 테스트 (Red)
});

Green (테스트를 통과하게 하는 최소한의 코드 작성)

두 번째 단계에서는 테스트를 통과하게 하기 위해 가장 간단한 코드를 작성함. 이 단계에서는 오로지 테스트를 통과하는 데 집중하며, 코드 최적화나 리팩토링은 하지 않음.

function add(a, b) {
  return a + b;
}

// 테스트 통과 확인
test("adds 1 + 2 to equal 3", () => {
  expect(add(1, 2)).toBe(3); // 성공 (Green)
});

Refactor (코드 개선 및 리팩토링)

세 번째 단계에서는 테스트가 통과하는 상태를 유지하면서 코드의 중복을 제거하거나 구조를 개선함. 이 단계에서 리팩토링을 통해 코드 가독성, 유지보수성, 효율성을 높임.

function add(a, b) {
  return a + b;
}

test("adds 1 + 2 to equal 3", () => {
  expect(add(1, 2)).toBe(3);
});

TDD의 좋은 점과 한계 🎯

TDD의 좋은 점

  • 안정적인 코드 제공: 작성한 테스트가 코드의 동작을 보증하므로, 기능 수정이나 리팩토링 시에도 기존 기능의 정상 동작을 유지할 수 있음.
  • 코드에 대한 명확한 요구사항: 테스트를 통해 요구사항이 명확하게 정의되고, 예상된 결과를 빠르게 검증 가능함.
  • 버그 발견 용이: 테스트가 부족한 부분을 조기에 발견하여 디버깅 시간을 줄일 수 있음.

TDD의 한계

  • 개발 속도 증가의 어려움: 초기 개발 속도가 느려질 수 있으며, 테스트 작성과 유지보수에 추가적인 리소스가 필요함.
  • 복잡한 기능에서의 한계: 복잡한 비즈니스 로직이나 비동기 처리, 외부 API와의 통합 테스트에서는 TDD가 한계가 있을 수 있음.
  • 과도한 테스트 코드: 테스트 코드 작성에 너무 집중하면 과도하게 테스트를 작성하게 되어 생산성이 떨어질 수 있음.

TDD를 도입할 때 고려할 점 💡

  • 작은 단위의 기능부터 테스트: 작은 기능부터 테스트를 작성하여 TDD 방식에 익숙해지는 것이 좋음.
  • 테스트 유지보수에 대한 계획: TDD는 테스트 코드 유지보수가 필요하므로, 테스트 코드 작성과 관리를 계획적으로 할 필요가 있음.
  • 테스트의 적절한 커버리지: 모든 코드에 테스트를 작성하기보다는, 주요 기능이나 오류 발생 가능성이 높은 코드에 우선적으로 테스트를 작성함.
profile
슬기로운개발생활🤖

0개의 댓글