본문 바로가기
CS 지식/개발 방법론

TDD(Test Driven Development)란?

by 검은도자기 2021. 11. 2.

정의

새로운 기능을 구현하기 전에 단위 테스트를 수행하여 소프트웨어를 개발하는 방식

 

 

어떻게 TDD가 생겨났을까?

소프트웨어 개발 프로세스는 항상 변화하고 있습니다. 그에 따라 소프트웨어 품질을 높이는 새로운 방법이 등장하는데, 그중 한 가지 방법으로 TDD(테스트 주도 개발)가 생겨났습니다.

 

 

테스트 주도 개발을 사용해야 하는 이유는 뭘까?

개인적인 생각에는 가장 중요한 이점은 코드의 전반적인 품질이 향상된다는 것입니다. 코드의 유지 관리 가능성을 향상할 뿐만 아니라 "생각지 못한 버그의 수"를 줄여줍니다. 새로운 기능 구현시 새로운 문제가 어디에서 오는지 알 수 없으면 정말 시간이 많이 걸린다는 것을 경험했습니다. 따라서 TDD를 사용하면 코드를 더 작은 단계로 확장할 수도 있으며, 새 기능을 작동하게 만드는 것만 생각하면 되기 때문에 저는 TDD를 사용해야 한다고 생각합니다.

 

 

TDD 프로세스

  1. 간단한 기능 요구 사항으로 시작하여 테스트 사례가 무엇인지 작성하는 것으로 시작
  2. 기능을 실행할 코드를 작성하기 전에 요구 사항을 다루기 위한 테스트를 작성
  3. 작성한 모든 테스트를 실행하고 테스트가 실패하는지 확인 (FAIL)
  4. 테스트를 통과하는데 필요한 최소한의 코드/비즈니스 로직을 작성 (PASS)
  5. 코드/비즈니스 로직을 최적화하고 테스트를 다시 실행 (REFACTOR)

 

 

TDD 프로세스 예시

  • 새 자전거를 사고 싶다고 상상해 보십시오. 
  • 먼저 온라인에서 가격을 확인하고 돈이 부족하다는 것을 깨닫는다 (FAIL).
  • 그래서 돈이 될 때까지 일을 하다가 가게에 가서 산다. (PASS).
  • 얼마 후, 당신은 다른 자전거를 사고 필요한 돈을 벌기 위한 더 효율적인 방법을 찾으려고 합니다 (REFACTOR).

 

 

테스트 코드 작성 원칙

  • 먼저 실패한 테스트를 작성한 다음 통과하게 하고 결국에는 작성된 함수를 리팩터링 합니다.
  • 가장 중요한 원칙은 함수를 구현하기 전에 먼저 테스트를 작성하는 것입니다.
  • 테스트 코드의 효율성과 소프트웨어 품질을 보장하면서 테스트 가능성을 위해 애플리케이션을 작성하도록 보장합니다. 그러나 첫 번째 테스트가 처음에는 컴파일되지 않을 수도 있다는 점을 명심하십시오. 그 이유는 필요한 메서드와 클래스가 아직 존재하지 않기 때문입니다.
  • 테스트를 작성하는 동안 항상 가능한 한 작게 유지해야 합니다. 작은 테스트는 가독성에 도움이 되므로 이해하기 쉽습니다. 또한 테스트가 통과하지 못한 경우 디버깅하는 동안 오류를 추적하는 것이 더 관리하기 쉽습니다.

 

 

장점

  • TDD는 보다 모듈화 되고 유연하며 확장 가능한 코드로 이어질 수 있습니다. 이 프로세스는 개발자가 독립적으로 만들고 테스트할 수 있고 나중에 함께 통합할 수 있는 작은 구성 요소의 관점에서 소프트웨어를 생각하도록 권장하기 때문에 이러한 효과가 자주 나타납니다.
  • 테스트를 읽으면 기능을 이해할 수 있습니다. 즉, 추가 JavaDocs(문서 주석)가 필요하지 않습니다.
  • 문서 주석과 달리 문서(테스트)가 최신 상태가 아닐 위험이 없습니다.
  • 기능을 구현하기 위한 좋은 출발점을 제공합니다. 테스트를 통과하는 데 필요한 것이 무엇인지 알고 있으므로 먼저 구현을 시작할 구성 요소에 대해 압도할 필요가 없습니다.
  • 테스트 커버리지가 높기 때문에 누군가가 미래에 기능 구현을 변경하더라도 기존 테스트에서 오류가 발생하면 잡아야 하기 때문에 문제를 걱정하거나 가능한 에지 케이스에 대해 생각하는 데 시간을 할애할 필요가 없습니다.

 

 

단점

  • 테스트에 대한 (확실한) 경험이 없으면 개발자는 일상 업무의 일부로 일반적으로 테스트를 적용하는 데 어려움을 겪을 수 있습니다.
  • 기능 개발보다 테스트에 더 많은 시간 소모.

 

 

마무리

TDD에 대해서 공부한 내용을 정리해봤습니다.

TDD를 공부해보니 적절하게 사용하면 소프트웨어 품질이 향상되고 전반적으로 개발 시간이 단축될 수 있다고 생각이 듭니다. 하지만 모든 프로젝트에 TDD를 무조건 적용해야 할까?라는 의심이 들긴 하네요.

아직 부족하거나 틀린 부분이 있을 수도 있으니 주의하면서 읽으시면 좋을거 같습니다.

이번 포스팅은 마무리하겠습니다. 그럼 다음 포스팅에서 뵙겠습니다.

 

 

 

'CS 지식 > 개발 방법론' 카테고리의 다른 글

모노레포(monorepo) 란?  (0) 2023.02.19
함수형 프로그래밍이란?  (0) 2022.04.28