본문 바로가기

Dev/etc

TDD(Test-Driven Development)

테스트 주도 개발(Test-driven development, TDD)

TDD는 Test Driven Development의 줄임말로 한국어로 번역하면 "테스트 주도적 개발"이 된다. 말 그대로 테스트 주도적으로 프로그램을 개발 하는 방법이다. 테스트 주도 개발(Test-driven development, TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다. 우선 개발자는 바라는 향상 또는 새로운 함수를 정의하는 (초기적 결함을 점검하는) 자동화된 테스트 케이스를 작성한다. 그런 후에, 그 케이스를 통과하기 위한 최소한의 양의 코드를 생성한다. 그리고 마지막으로 그 새 코드를 표준에 맞도록 리팩토링한다. 이 기법을 개발했거나 '재발견' 한 것으로 인정되는 Kent Beck은 2003년에 TDD가 단순한 설계를 장려하고 자신감을 불어넣어 준다고 말하였다.

즉, “테스트를 염두에 둔 프로그램 개발 방법”

 

TDD란 무엇인가

작성해야하는 프로그램에 대한 테스트를 먼저 작성하고 이 테스트를 통과할 수 있도록 실제 프로그램의 코드를 작성한다. 여기서 만드는 테스트도 그 자체로 하나의 프로그램이며 프로그램의 요구사항을 반영할 수 있게 만든다. 예를 들어 두 수를 더하는 add 함수를 만들어야 한다면 add 함수부터 만드는 것이 아니라 다음과 같은 testAdd 함수를 먼저 만든다.

int testAdd() { 
  assert 5 + 4 == add(5, 4) 
  assert -4 + 9 == add(-4, 9) 
} 

그리고 나서 이 테스트를 통과하도록 add 함수를 만드는 것이다. 만약 testAdd를 실행했는데 add 함수에 문제가 있으면 assert에서 에러가 발생할 것이다. 테스트를 통과하면 add 함수는 5 + 4와 -4 + 9를 정확하게 계산해낸다는 것을 보증할 수 있다. 이처럼 테스트에 요구사항이 제대로 동작함을 입증할 수 있는 코드를 작성하고 이 테스트를 만족하는 실제 프로그램을 써나가는 것이 TDD이다.

 

TDD의 목표

Simple Code는 TDD의 궁극적인 목표이다. 중복이 없고 누가 봐도 명확한 코드를 말한다. TDD를 이용하면 특별한 능력 없이도 자연스럽게 가장 Simple한 코드를 만들어 나가게 된다.

 

TDD의 과정

  1. 테스트를 작성한다.

  2. 작성한 테스트를 통과할 수 있도록 가장 빠른 방법으로 코드를 작성한다. 이 과정에 중복된 코드를 만들어도 상관 없다.

  3. 테스트를 수행한다.

  4. 테스트를 통과하면 작성한 코드에서 중복을 제거한다. 아니면 2번으로 돌아간다.

  5. 테스트를 수행한다.

  6. 테스트를 통과하면 완성. 다음 테스트를 1번부터 시작한다. 실패하면 4로 돌아가서 디버깅한다.

 

그래서 왜 TDD를 하는가?

  1. 먼저 테스트를 먼저 작성하고 실제 코드를 작성하기 때문에 테스트 되지 않는 코드가 없어진다. 즉, 프로그램의 모든 코드가 테스트되기 때문에 버그의 발생 가능성이 줄어든다.

  2. 테스트 자체가 요구사항을 분명하게 드러나게 해주는 효과가 있고, 테스트에 맞게 코딩하다보면 자연스럽게 프로그램의 디자인이 SimpleDesign이 되는 경향이 있다.

  3. 테스트가 잘 작성되어 있으면 프로그램에 여러 가지 변경 작업을 할 때 그 변경으로 인해 다른 부분에서 예상치 못한 문제가 발생하는 것을 쉽게 알아차릴 수 있으므로 변경 작업을 두려움 없이 쉽게 할 수 있게 되어 개발 과정의 유연성이 높아진다. 최종적으로 생산성 향상에 기여한다.

더보기

c2.com에서는 이렇게 요약하고 있다.

  • add a test, get it to fail, and write code to pass the test 
  • remove duplication

 

참고

반응형

'Dev > etc' 카테고리의 다른 글

오픈소스 라이선스  (0) 2021.04.21
Analyzing Clubhouse for fun and profit  (0) 2021.03.12
데이터 비식별화 기법  (0) 2021.03.03
무료 템플릿 사이트 (Canva, 미리캔버스, 망고보드)  (0) 2021.02.24
심심할 때 타이핑하기  (0) 2019.07.09