[Kotlin] TDD - 테스트 주도 개발

728x90
반응형

* TDD란? (Test-Driven-Development)

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

* TDD의 창시자 켄트 벡은 "프로그램을 작성하기 전에 테스트를 먼저 하라" 라고 했다. 

* 위 과정이 기존 개발 과정, 아래 과정이 TDD

 

 

TDD가 좋은 이유

  • 내 코드 및 개선한/개선할 코드에 자신감을 준다.
    • 코드를 이래저래 개선해도 '테스트 코드가 지켜줄거야!' 라는 자신감이 붙는다.
      따라서 개선에 대해 두려움이 없어지고, '일단 바꿔보자'라는 생각을 할 수 있게 된다.
      즉, 망설임이 없어진다. (= 개발에 속도가 붙는다.)
  • 기능 명세 및 테스트 명세를 대신할 수 있게 된다.
    • 테스트명을 Given-When-Then 방법과 같이 
      테스트 내용을 상세하게 나타낼 수 있는 이름을 사용한다면
      그것이 문서 그 자체가 된다. 
  • 테스트 커버리지가 높아진다.
    • 테스트 커버리지란 시스템 및 소프트웨어에 대해 충분히 테스트가 되었는지를 나타내는 정도이다.
      수행한 테스트가 얼마나 테스트 대상을 커버했는지를 나타낸다.
  • 오버 엔지니어링 방지
    • 요구사항에 맞춰 개발하다보니 정말 내가 필요한 만큼만 딱 구현할 수 있다. 
  • 설계에 대한 피드백이 빠르다.
    • 설계가 잘못되었다면 언제 깨달을 수 있을까? - 변경이 일어나거나 사용하기 어려울 때 깨달을 수 있다.
    • ex) 테스트를 설계하는데 복잡하고 잘못된 설계를 가지고 있으면 새로운 테스트 코드를 작성하기 점점 더 어려워진다. 
      그러면 빠르게 설계를 바꾸면 된다.

* 그렇다고 TDD에만 너무 의존하면 테스트 하기만 좋은, 결국 안 좋은 설계가 이루어진다.

 

TDD가 안좋은 이유

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

 

TDD가 어려운 이유 

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

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

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

 

* TDD에 실패하는 이유 (출처: OKKYCON 2018 이규원 - 당신들의 TDD가 실패하는 이유)

1. 코드가 이루고자 하는 가치나 기능을 테스트하기보다 그 기능을 어떻게 구현하고 있는지를 테스트한다.

2. 결국 테스트 케이스들이 구현체와 결합도가 높아진다.

3. 구현체들을 리팩토링하면 결합되어있는 테스트 케이스들이 모두 깨져버린다.

 

* ex) 화살표를 보면 테스트들이 인터페이스 안에 implementation 내부에 존재하는 구현체들을 테스트하고 있는데,
 implementation을 리팩토링하게 되면 테스트들이 모두 깨지게 된다. 

  결국 우리는 구현체가 아닌 설계 즉, 인터페이스를 테스트해야 한다.

* 이렇게 인터페이스를 테스트하게 되면, 내부에 구현되어 있는 구현체를 아무리 리팩토링 해도 테스트 케이스는 인터페이스를 테스트하기 때문에 테스트 케이스가 깨지지 않는다. 

 

 

 

 

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

  0. 기능을 설계한다.

 

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

 

-----

출처: https://www.youtube.com/watch?v=3LMmPXoGI9Q

https://korean-otter.tistory.com/216

 

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

얕은 지식으로 정리해보는 TDD!! 한두달 간의 프리코스 기간에는 재미없고 뭔지 모르기만 했던 테스트 주도 개발이 약 2주일만에 재밌고, 편해졌다! TDD란? 테스트 코드를 먼저 작성 후 작성된 테

korean-otter.tistory.com

 

728x90
반응형
TAGS.

Comments