개발공부/CS

TDD: 테스트 주도 개발.

카슈밀 2025. 2. 15. 23:42
반응형

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

 

**테스트 주도 개발(TDD, Test-Driven Development)**은 **“테스트를 먼저 작성하고, 이후에 실제 코드를 작성하는 개발 방법론”**이야.

 

즉, **“실패하는 테스트를 먼저 만들고, 그 테스트를 통과하도록 최소한의 코드를 작성한 후, 리팩토링을 통해 개선하는 방식”**이야.

이 과정이 “Red → Green → Refactor” 라는 반복적인 순환 구조로 진행돼.

 

📌 TDD의 핵심 사이클 (Red → Green → Refactor)

 

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

새로운 기능을 개발할 때, 먼저 테스트 코드를 작성하고 실행.

당연히 아직 기능이 구현되지 않았으므로 테스트는 실패(Red) 함.

 

2️⃣ Green (기능을 최소한으로 구현)

테스트를 통과할 수 있도록 최소한의 코드를 작성.

이때 최소한의 로직만 구현하여 테스트를 성공(Green) 시킴.

 

3️⃣ Refactor (코드 개선)

테스트가 통과한 후, 코드를 리팩토링하여 품질을 개선.

리팩토링 후에도 테스트는 여전히 통과해야 함.

 

🔁 이 과정을 반복하며 코드를 점진적으로 발전시키는 방식이 TDD야!

 

📌 TDD 예제 (JavaScript + Jest)

 

🎯 기능 목표: 숫자를 더하는 add(a, b) 함수 구현

 

👉 일반적인 개발 방식

1. add(a, b) 함수를 먼저 구현

2. 그 후에 테스트 작성

 

👉 TDD 방식

1. add(a, b)가 정상 동작하는지 테스트를 먼저 작성 (Red 단계)

2. 최소한의 코드로 테스트를 통과하도록 구현 (Green 단계)

3. 코드 리팩토링 및 최적화 (Refactor 단계)

 

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

 

// sum.test.js

const add = require("./sum"); // 아직 sum.js 파일 없음

 

test("두 숫자의 합을 반환해야 한다.", () => {

  expect(add(2, 3)).toBe(5);

});

 

🚨 sum.js 파일이 없어서 테스트가 실패함!

 

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

 

// sum.js

function add(a, b) {

  return a + b;

}

 

module.exports = add;

 

📌 이제 add 함수를 만들었으니, 테스트를 다시 실행하면 통과(Green)! ✅

 

✅ 3. 코드 리팩토링 (Refactor)

현재 코드는 단순하지만, 복잡한 로직이라면 리팩토링 진행 가능.

이 과정에서 기능을 변경하면 안 되고, 테스트가 계속 통과해야 함.

 

📌 TDD를 사용하면 버그가 적고, 유지보수하기 쉬운 코드가 됨!

 

📌 TDD의 장점 👍

 

버그 감소 → 테스트가 선행되므로 기능이 명확해지고, 실수할 확률이 낮아짐.

안정적인 리팩토링 가능 → 코드 변경 후에도 테스트가 보장됨.

설계 품질 향상 → 테스트가 코드 설계를 개선하도록 유도.

유지보수 용이 → 기능이 많아져도, 기존 코드가 잘 동작하는지 쉽게 확인 가능.

 

📌 TDD의 단점 👎

 

🚫 초기 개발 속도 저하 → 테스트를 먼저 작성해야 하므로 처음에는 시간이 걸림.

🚫 모든 경우를 테스트하기 어려움 → 복잡한 시스템에서는 테스트 케이스 작성이 어려울 수 있음.

🚫 테스트 코드 유지보수 필요 → 코드가 변경되면 테스트 코드도 수정해야 함.

 

📌 언제 TDD를 사용하면 좋을까?

 

핵심 기능이 중요한 프로젝트 → 결제 시스템, 인증 시스템 등

장기적으로 유지보수해야 하는 프로젝트 → 코드 품질이 중요할 때

버그 수정이 잦은 프로젝트 → 기존 기능이 깨지지 않도록 보호

 

🚀 즉, TDD는 처음엔 느릴 수 있지만, 장기적으로 코드 품질과 유지보수성을 높이는 강력한 개발 방식이야!

혹시 더 궁금한 거 있으면 질문해줘! 😊

728x90

'개발공부 > CS' 카테고리의 다른 글

Docker란?  (0) 2025.02.15
API란?  (0) 2025.02.15
RESTful API?  (0) 2025.02.15
OOP의 5가지 설계 원칙  (0) 2025.02.15
OOP란?  (0) 2025.02.15