본문 바로가기

ComputerScience/DesignPattern

[Development] 테스트 주도 개발 (Test-Driven Development)

테스트 주도 개발 (Test-Driven Development)

TDD란 Test-Driven Development의 줄임말로 '테스트 주도 개발'이라는 의미를 가지고 있습니다. 테스트 주도 개발은 반복 테스트를 이용한 소프트웨어 개발 방법론으로서 테스트 코드를 먼저 작성한 후 테스트를 통과하는 코드를 작성하는 과정을 반복하는 소프트웨어 개발 방식입니다. 애자일 방법론 중 하나인 익스트림 프로그래밍(eXtream Programming)의 Test-First 개념에 기반을 둔, 개발 주기가 짧은 개발 프로세스로 단순한 설계를 중시합니다.

애자일 소프트웨어 개발 방법론(Agile Development)과 익스트림 프로그래밍(Extreme Programming)

애자일은 신속한 반복 작업을 통해 실제 작동 가능한 소프트웨어를 개발하는 개발 방식입니다. 

 

애자일 소프트웨어 개발 방법론의 핵심은 신속한 개발 프로세스를 통해 수시로 변하는 고객의 요구사항에 대응해서 제공하는 서비스의 가치를 극대화하는 것 입니다. 개발 작업에서 반복 작업을 통해 지속적인 피드백과 수용으로 변화가 빠르고 유연한 개발이 가능해집니다.

 

Extreme Programming은 에자일 방법론으로 간주되며, 에자일 방법론 보다 더 명확하게 규정한 방법론입니다.

익스트림 프로그래밍에선 페어 프로그래밍, 테스트 주도 개발과 같은 단계가 포함될 수 있습니다.

테스트 주도 개발의 개발 주기

이미지 출처: https://www.linkedin.com/pulse/test-driven-development-tdd-michael-halim

  1. 실패 테스트 작성 (Write a failing test, TEST FAILS): 실패하는 테스트 코드를 먼저 작성합니다.
  2. 테스트를 통과하는 코드 작성 (Make a test pass, TEST PASSES): 테스트 코드를 성공시키기 위한 실제 코드를 작성합니다.
  3. 리팩토링 (Refactor): 중복 코드를 제거하거나 일반화하는 리팩토링을 수행합니다.

일반적인 개발 방법은 설계를 진행한 후 그에 맞게 애플리케이션 코드를 작성하고 마지막으로 테스트 코드를 자성하는 흐름으로 진행됩니다. 반면 테스트 주도 개발에서는 설계 이후 바로 테스트 코드를 작성하고 애플리케이션 코드를 작성한다는 점에서 차이가 있습니다.

테스트 주도 개발의 효과

디버깅 시간 단축

테스트 코드 기반으로 개발이 진행되기 때문에 문제가 발생했을 때 어디에서 잘못됐는지 확인하기가 쉽습니다.

 

생산성 향상

테스트 코드를 통해 지속적으로 애플리케이션 코드의 불안정성에 대한 피드백을 받기 때문에 리팩토링 횟수가 줄고 생산성이 높아집니다.

 

재설계 시간 단축

작성돼 있는 테스트 코드를 기반으로 코드를 작성하기 때문에 재설계가 필요할 경우 테스트 코드를 조정하는 것으로 재설계 시간을 단축할 수 있습니다.

 

기능 추가와 같은 추가 구현이 용이

테스트 코드를 통해 의도한 기능을 미리 설계하고 코드를 작성하기 때문에 목적에 맞는 코드를 작성하는 데 비교적 용이합니다.

 

테스트 주도 개발의 단점

익숙치 않은 개발 방법

먼저 코드를 구현하고 테스트를 작성하는 것에 더 친숙하기 때문에, 처음엔 배우기가 어려울 수 있고 이는 생산성을 오히려 떨어뜨릴 수 있습니다.

 

과도한 테스트 커버리지

테스트 코드에 집중한 나머지 너무 과도하게 테스트 코드를 작성하여 오히려 개발의 속도가 늦어질 수 있습니다.

 

자유도 하락

테스트 코드에 맞게 코드를 작성하려다 보면, 다른 접근법이나 솔루션을 떠올리고 코드를 작성하기가 제한될 수 있습니다.

 

참고

  • 스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022