본문 바로가기
우아한테크코스 5기/정리

[kotlin][JUnit5] TDD (Test Driven Development, 테스트 주도 개발)

by 코드 이야기 2023. 2. 21.
728x90

 

 

얕은 지식으로 정리해보는 TDD!!

한두달 간의 프리코스 기간에는 재미없고 뭔지 모르기만 했던 테스트 주도 개발이 약 2주일만에 재밌고, 편해졌다!

 

 

TDD란?

  • 테스트 코드를 먼저 작성 후 작성된 테스트코드에 맞춰 제품 코드를 작성하는 프로그래밍 방법 
  • 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나
  • TDD는 단순한 설계를 장려하고 자신감을 불어 넣어 준다.

 

TDD가 좋은 이유

  • 내 코드 및 개선한/개선할 코드에 자신감을 준다.
    • 코드를 이래저래 개선해도 '테스트 코드가 지켜줄거야!' 라는 자신감이 붙는다.
      따라서 개선에 대해 두려움이 없어지고, '일단 바꿔보자'라는 생각을 할 수 있게 된다.
      즉, 망설임이 없어진다. (= 개발에 속도가 붙는다.)
  • 기능 명세 및 테스트 명세를 대신할 수 있게 된다.
    • 테스트명을 Given-When-Then 방법과 같이
      테스트 내용을 상세하게 나타낼 수 있는 이름을 사용한다면
      그것이 문서 그 자체가 된다. 

 

TDD가 안좋은 이유

  • 적응 기간, 배우는 기간이 오래 걸린다.
  • 개발 초기의 개발 기간이 증가한다.

 

TDD가 어려운 이유 

  • 적용해본 경험이 없어서
  • 설계가 기본이 되기에 (설계 경험이 없어서)

→ 즉 긴 시간동안 축적되는 설계 노하우, 연습, 훈련 등이 기본적으로 필요하기 때문에 어렵다고 할 수 있다.

→ 테스트 작성을 하는 것이 아닌 테스트 주도 개발의 순서와 싸이클을 익혀야하는 것이다.

 

TDD를 적용하는 방법 (이론)

0. 기능을 설계한다.

 

  1. 단위테스트를 작성한다.
    • 물론, 테스트할 기능이 구현되지 않았으므로 테스트가 실패하는 테스트 코드가 탄생한다. 
  2. 기능을 구현한다.
    • 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
  3. 리펙터링 한다.
    • 리팩터링 - 일단 테스트를 통과하게만 하는 와중에 생겨난 모든 중복을 제거한다.

 


 

TDD를 적용하는 방법 (코드 예시)

로또 문제

  • 로또 구입 금액을 입력하면 구입 금액에 해당하는 로또를 발급해야 한다. (로또 1장의 가격은 1000원)
  • 지난주 당첨 번호와 보너스 볼을 입력하면 당첨 순위에 해당하는 당첨 개수와 수익률을 계산해 출력한다.

 

설계

  • 기능을 설계한다.

한 번에 나오면 좋지만, 추후에 추가해나가며 개고생을 하며 연습하는 것... 그런 것이다...

 


 

단위 테스트 작성

  • 기능목록 : [ ] 구입금액을 가진다.
  • PurchaseAmount의 구입 금액에 대한 테스트를 작성한다.
  • PurchaseAmount와 구입 금액을 저장할 매개변수가 없으므로 오류가 발생한다.

 

기능 구현

  • 구입 금액을 생성하는 테스트 및 기능 명세에 맞춰 기능을 만든다.

이건 너무 간단한.. 것 . . . 하하..

이렇게 한 번의 사이클 끝.

 


 

단위 테스트 작성

  • 기능목록 : [ ] 구입금액이 1000 이상이 아니고 5만원을 초과하면 에러가 발생한다.
  • PurchaseAmount 구입 금액의 범위를 확인하고 에러를 발생시키는 기능을 작성한다.
  • PurchaseAmount 구입 금액을 확인하는 기능이 없으므로 에러가 발생하지 않아 테스트에 오류가 발생한다.

 

기능 구현

  • 구입 금액의 범위를 확인하는 테스트 및 기능 명세에 맞춰 기능을 만든다.

 

리펙터링

  • 코드가 중복되거나 분리할 수 있는 것들을 리펙터링 한다.

이렇게 또 한 번의 사이클 끝.

 


위 예시의 순서대로, TDD 사이클대로 계속해서 구현해 나가는 것... 그것이 TDD!

 

(아래 링크는 부끄럽지만 제 코드...)

각 커밋을 보면 초기 기능 명세에 따라 테스트와 함께 기능이 구현되는 것을 확인할 수 있다.

비록 테스트만 따로 커밋을 하기에는 커밋이 너무 많아질 것 같아 페어와 합의 후 기능 하나별로 커밋을 하였다.

(커밋을 처음으로 그나마 정상적으로 작성했다... 글로 덕분이다... 첵오...)

https://github.com/woowacourse/kotlin-lotto/compare/main...otter66:kotlin-lotto:step1

 

GitHub - woowacourse/kotlin-lotto

Contribute to woowacourse/kotlin-lotto development by creating an account on GitHub.

github.com

 

 

프리코스를 하고, 코테를 보는 두어달 동안은 전혀 이해 하지 못했지만,

우테코를 하며 1~2주 동안 배우고 공부한 TDD는 재밌었다! TDD랑 조금은 친해진 것 같다!

 

 

728x90

댓글