본문 바로가기
General

TDD(테스트 주도 개발) 시작하는 방법

by whatamigonnabe 2022. 11. 6.

들어가기

우아한테크코스에 지원했습니다. 합격을 위한 1차 관문인 PreCource를 진행하고 있는데, 2주 차 과제에서 테스트 코드를 작성하는 요구사항이 생겼습니다. 테스트를 해보라고 하니, 말로는 많이 들었던 TDD를 시도해볼 수 있는 좋은 기회가 될 것 같아, TDD에 대해서 찾아보았습니다.

 

WHAT is TDD?

TDD는 Test-Driven Development의 약자로, 테스트 주도 개발이라고 합니다. 간단하게 말하면, 실제 코드를 작성하기 전에 테스트 코드부터 작성한 후, 처음에는 당연히 실패할 (아직까지 작성한 코드가 없기 때문에) 테스트를 조금씩 성공시켜가며 개발을 하는 개발 방법입니다. 위키에 따르면 주목받은 지 얼마 되지 않은 TDD가 사실은 1999년에 시작됐다고 합니다. 신기하네요ㅎㅎ

 

WHY should we use TDD?

TDD를 하는 이유는 코드가 확실해지고, 명확해지고, 간결해집니다.인터넷에 있는 여러 글들에서 TDD를 수행하는 이유를 다양하게 설명하고 있지만, 결국 위의 세 가지가 핵심이라는 생각이 들었습니다.

 

확실:

당연히 프로덕션 코드를 작성하기에 앞서 테스트 코드부터 작성하는 테스트에 진심인 방법론이기 때문에 당연히 주목적이자 장점인 것 같습니다. 하지만 살짝 더 깊은 장점은, 여러 테스트 코드를 작성함으로써 '여러 예외상황'에 대해서 더욱 잘 상상할 수 있기 때문에 더 좋은 테스트 코드, 그리고 더 확실한 프로덕션 코드를 만들어내는 것 같습니다.

명확:

여러 기능 목록을 구현하고, 한 가지 기능에 대해 '조금씩' 기능을 추가해 가는 방법으로 작성함으로, 더 객체지향적인 코드를 작성하기에 유리합니다. 또한, 다른 사람이 작성해 놓은 테스트코드를 보면서 개발자의 의도를 더욱 명확하게 파악할 수 있습니다.

간결:

TDD는 리팩토링과정을 매우 많이 수행하게 됩니다. 이 과정에서 불필요하거나 중복되는 코드를 계속 정리하기 때문에 코드가 간결해집니다.

How to apply TDD?

망나니 개발자님의 블로그에서는 아래와 같은 순서대로 TDD를 진행합니다.

  1. 실패하는 작은 단위 테스트를 작성한다. 처음에는 컴파일조차 되지 않을 수 있다.
  2. 빨리 테스트를 통과하기 위해 프로덕션 코드를 작성한다. 이를 위해 정답이 아닌 가짜 구현 등을 작성할 수도 있다.
  3. 그다음의 테스트 코드를 작성한다. 실패 테스트가 없을 경우에만 성공 테스트를 작성한다.
  4. 새로운 테스트를 통과하기 위해 프로덕션 코드를 추가 또는 수정한다.
  5. 1~4단계를 반복하여 실패/성공의 모든 테스트 케이스를 작성한다.
  6. 개발된 코드들에 대해 모든 중복을 제거하며 리팩터링 한다.

제 나름대로 정리해보면 하나의 기능에 대해 '예외 Test -> 성공 Test -> 리팩터링' 순으로 이뤄지며,

각 테스트 안에서 복잡한 경우에는 '가짜 구현(로직 없이 상수 반환) -> 진짜 구현(변수 사용)'순으로 조금씩 일반화시키는 방법을 사용합니다.

 

결론

TDD를 익히는 것은 어렵고 오래 걸리리는 일이라고 합니다. 찬찬히 블로그를 참고해 가면서, 도전해봐야 하겠습니다.

 

참고

https://en.wikipedia.org/wiki/Test-driven_development#Benefits

https://brunch.co.kr/@freeism/19

https://mangkyu.tistory.com/182