CS

TDD(테스트 주도 개발)

느낌표 공장장 2021. 5. 18. 17:08

TDD란 ?

✔︎ Test Driven Development : 테스트 주도 개발. 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다. 테스트 케이스를 먼저 만들고 이 테스트를 통과하기 위해 구현을 짜는 것이다. 즉, 만드는 과정에서 먼저 테스트를 작성하고 그것을 통과하는 코드를 만들며 제대로 동작하는지에 대한 피드백을 적극적으로 받는 것이다.

     ✔︎ 보통 SW 개발을 할 때 코딩을 다 끝낸 후, 테스트를 한다. 그러나 이 순서를 바꾸는 것이 TDD를 적용하는 것이다.


TDD의 효과

TDD를 왜 해야 할까 ?

애자일과 같이 불확실성이 높을 때 '피드백'과 '협력'이 중요하다.

왜냐하면, 불확실성이 높을 때 피드백과 협력을 이용하면 더 좋은 결과가 나올 확률이 높아진다. TDD도 마찬가지로 피드백과 협력을 증진시키는 것이기 때문에 불확실성이 높을 때 도움이 된다.

 

TDD는 어떤 상황에서 해야 할까 ?

  1. 처음 해보는 프로그램 주제
    • 나에 대한 불확실성이 높은 경우
  2. 고객의 요구조건이 바뀔 수 있는 프로젝트
    • 외부적인 불확실성이 높은 경우
  3. 개발하는 중에 코드를 많이 바꿔야 된다고 생각하는 경우
  4. 개발하고 나서 이 코드를 누가 유지보수할지 모르는 경우

☞ 즉, 불확실성이 높을 때 TDD를 하면 된다.

 

 


TDD의 장점

1. 객체 지향적인 코드 개발

테스트 코드를 먼저 작성한다면 좀 더 명확한 기능과 구조를 설계할 수 있다. 각각의 함수를 정의할 때 각각의 기능들에 대해서 철저히 구조화시켜 코드를 작성할 수 있게 된다. 그 이유는 테스트의 용이성을 위해 복잡한 기능을 한 함수에 모두 구현할 경우 테스트 방식이 복잡해지고 시간이 오래 걸리며 코드 수정이 되는 경우 테스트 코드를 재사용할 수 없게 되기 때문이다. 자연스럽게 TDD의 목적인 코드의 재사용 성을 보장하며 코드를 작성하게 된다.

 

2. 설계 수정 시간의 단축

TDD는 테스트 코드를 먼저 작성하기 때문에 최초 설계 안을 만족시키며 입출력 구조와 기능의 정의를 명확히 하게 되므로 설계의 구조적 문제를 바로 찾아내게 된다. 실제로 테스트 코드를 작성하면서 인터페이스나 클래스의 구조들을 많이 수정하게 된다. 그리고 미리 테스트 시나리오를 작성해봄으로써 코드 개발 전 기능을 구현하기 위한 예외 상황들을 미리 확인해보고 조사하게 되는 효과가 발생하여 예외 코드를 작성하기 쉬워진다.

결함 수정 비용에 대한 예시(출처: https://www.slideshare.net/koreakihoon/tdd-112099012 , TDD 관련 발표 자료)

3. 디버깅 시간의 단축

 

기본적으로 단위 테스트 기반의 테스트 코드를 작성하기 때문에 추후 문제가 발생하였을 때 각각의 모듈 별로 테스트를 진행해보면 문제의 지점을 쉽게 찾아낼 수 있다. 만약 TDD 개발이 아니라면 특정 버그를 찾기 위해서 모든 영역의 코드들을 살펴봐야 한다. 문제가 발생할 수 있는 지점은 DB 영역, Application 영역, Data 영역, Memory 영역 등 다양하기 때문에 모든 영역을 통합 테스트하게 되면 쉽게 문제의 지점을 찾을 수 없게 된다. 하지만 TDD 개발로 인해 각각의 단위 테스트를 진행하게 된다면 영역을 분할하여 쉽게 찾아낼 수 있다.

 

4. 유지 보수의 용이성

 

대부분의 개발자는 설계 및 코드 작성 시 기술적인 관점으로 바라보게 된다. 기술적인 관점이 나쁜 것은 아니지만 기능 자체의 실현에 목적을 두기 때문에 코드가 복잡해지고 테스트가 어려워진다. TDD 개발로 인해 항상 그 테스트 요소들이 사용자 관점으로 정의되고 진행되기 때문에 입력과 출력의 흐름이 명확해지고 추후 구조의 변경 및 소스 수정 시 구조를 쉽게 파악하고 빠른 수정이 가능해진다. 더불어 재사용 테스트도 쉽게 가능해진다.

 

5. 테스트 문서의 대체 가능

대부분의 개발 프로젝트 진행 시 테스트를 진행하는 경우 단순 통합 테스트에 지나지 않는다.  즉, 내부적으로 개별적인 모듈들이 어떻게 테스트되었는지 제공할 수 없다. 하지만 TDD를 구현하게 될 경우에 테스팅을 자동화 시킴과 동시에 보다 정확한 테스트 근거를 산출할 수 있다.

 

 

 

 

참고

https://gmlwjd9405.github.io/2018/06/03/agile-tdd.html

https://m.blog.naver.com/suresofttech/221569611618

 

'CS' 카테고리의 다른 글

API  (0) 2021.06.26
REST API  (0) 2021.06.26
Cookie  (0) 2021.06.25
좋은 객체 지향 설계의 5가지 원칙(SOLID)  (0) 2021.06.01
빌드 관리 도구 (Maven vs Gradle)  (0) 2021.05.27