우테코

[우테코 8기 프리코스] TDD 이해하기

bang-dev 2025. 10. 24. 14:33

TDD란?

Test Driven Development 의 약자 ‘테스트 주도 개발’ 이라고 함

작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현!!

애자일 방법론 중 하아닝 eXtream Programming(XP)의 ‘Test-First’ 개념에 기반을 둔 단순한 설계를 중요시 한다.

eXtream Programming(XP)
미래에 대한 예측을 최대한 하지 않고, 지속적으로 프로토타입을 완성하는 애자일 방법론 중 하나이다. 이 방법론은 추가 요구사항이 생기더라도, 실시간으로 반영할 수 있다.

미래에 대한 예측을 최대한 하지 말라고?? 예측을 생각하면서 코드를 짜는게 아닌가.

이해가 안가서 서칭해봄.

그 결과 TDD가 미래 예측이 아니라 지금 구현하려는 기능의 의도를 구체화 하는 단계이기 때문에 XP에 적합하다고 할 수 있다!

 

Red 단계는 실패하는 테스트 코드 작성

→ Green 단계는 테스트 코드를 성공시키기 위한 실제 코드 작성

→ Blue 단계는 중복코드 제거, 일반화 등의 리팩토링 수행

 

실제 코드에 대해 기대되는 바를 보다 명확하게 정의 ⇒ 불필요한 설계를 피할 수 있고 정확한 요구사항에 집중할 수 있다.

 

TDD를 적용한 사례 : 생년월일(input)을 입력받으면 현재 나이(output)를 출력하는 프로그램

1) 처음에는 간단한 것으로 목표를 정한다. (태어난 해와 올해의 연도를 입력해서 연도 뺄셈을 통해 나이 계산)  
- 2015, 2018 -> (만)3살 우선 이것을 만들겠다는 생각을 한다.

2) 만들기도 전에만든 후에 무엇을 테스트할지를 설계한다. (실패하는 테스트)  
- 2015, 2018를 입력하면 2가 나오는 테스트 프로그램(장차 만들 프로그램을 테스트할 코드)를 만든다.

3) 그 다음에 그테스트를 통과할 프로그램(1.을 목표로 작성한 코드)를 만든다.  
- 2018 - 2015 (올해의 연도 - 태어난 해)

4) 테스트 프로그램으로 이 프로그램(3.에 해당하는 코드)을 실행한다.

5) 통과했으면 새로운 테스트를 추가한다.  
- 이번에는 생월을 추가했을 때 계산하는 프로그램

6)위와 같은 작업을 계속 왔다갔다 수행한다.

 

일반적인 개발 방식

 

요구사항 분석 → 설계 → 개발 → 테스트 → 배포 의 형태의 개발 주기는 개발을 느리게 하는 잠재적 위험 존재

  1. 소비자의 요구사항이 처음부터 명확하지 않을 수 있다.
  2. 처음부터 완벽한 설계는 어려움.
  3. 자체 버그 검출 능력 저하 또는 소스코드의 품질 저하 가능
  4. 자체 테스트 비용 증가 가능

⇒ 어느 프로젝트든 초기 설계가 완벽하다고 말할 수 없기 때문.

하지만 재설계로 인해서 코드를 삽입 수정 삭제 하는 과정에서 불필요한 코드가 남거나 중복처리 될 수 있다!!!

TDD 개발 방식

테스트 코드를 작성한 뒤에 실제 코드를 작성한다는 점이 일반 개발 방식과 차이가 있다.

설계 단계에서 프로그래밍 목적을 반드시 미리 정의, 테스트 케이스 작성도 해야한다.

  1. 테스트 코드를 작성하는 도중에 발생하는 예외 사항들은 테스트 케이스에 추가하고 설계를 개선한다.
  2. 이후 테스트가 통과된 코드만을 코드 개발 단계에서 실제 코드로 작성한다.

자연스럽게 코드 버그가 줄어들고, 소스코드는 간결해진다. 자연스럽게 설계가 개선됨으로 재설계 시간이 절감된다. 하지만 설계방법론이 아닌 피드백 매커니즘에 가깝다는 것을 잊지 말자

TDD 효과

  1. 디버깅 시간을 단축할 수 있다.
  2. 코드가 내 손을 벗어나기 전에 가장 빠르게 피드백을 받을 수 있다.
    1. 일반적 방식은 거의 완성된 코드를 가지고 테스트를 하기 때문에 문제의 원인이 정확이 무엇인지 판단하기 힘들다.
    2. 하지만 TDD는 기능단위로 하기 때문에 빠른 피드백이 가능하다.
  3. 작성한 코드가 가지는 불안정성 개선하여 생산성 높일 수 있다.
  4. 재설계 시간을 단축할 수 있다.
    1. 다양한 예외사항에 대해 생각해 볼 수 있는 장점도 존재한다.
  5. 추가 구현이 용이하다.
    1. 유닛 테스트를 하기 때문에 기존 코드 영향을 최소화 할 수 있어 테스트 기간을 획기적으로 단축시킬 수 있다.
  6. 테스트 커버리지의 자연스러운 향상이 된다.
  7. 오버엔지니어링 방지가 된다.
    1. 필요한 만큼의 코드만 작성하게 한다.

TDD 단점

  1. 생산성 저하
    1. 처음부터 2개의 코드를 짜야하고 중간중간 테스트 하면서 고쳐나가야 하기 때문.
  2. 이제까지 자신이 개발하던 방식을 많이 바꿔야 하기 때문.
  3. 구조에 얽매인다
    1. 실제 코드가 더 중요한데 테스트 원칙때문에 쉽게 넘거가지 못하는 경우가 있다.

TDD가 실패하는 이유

구현을 테스트 하기 때문!!!!!

구현을 테스트 하지 말고 인터페이스를 기준으로 작성하자.

 

 

 

참고.

https://inpa.tistory.com/entry/QA-%F0%9F%93%9A-TDD-%EB%B0%A9%EB%B2%95%EB%A1%A0-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C

 

🧪 TDD 방법론 (테스트 주도 개발) - 알기 쉽게 정리

TDD(Test Driven Development) 란? TDD란 Test Driven Development의 약자로 '테스트 주도 개발'이라고 한다. 반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트 케이스를 작성하고 이를 통과하는

inpa.tistory.com

https://youtu.be/3LMmPXoGI9Q?si=xPvu0Xry4y4F9JwX