본문 바로가기
프로그래밍 개발/프론트엔드 개발자 기본 지식

Test-Driven Development(TDD)

by Jinseok Kim 2022. 5. 8.
반응형

TDD

 

  • Test-Driven Development(TDD)는 매우 짧은 개발 사이클의 반복에 의존하는 소프트웨어 개발 프로세스입니다.
  • 우선 개발자는 요구되는 새로운 기능에 대한 자동화된 테스트케이스를 작성하고 해당 테스트를 통과하는 가장 간단한 코드를 작성하고 일단 테스트 통과하는 코드를 작성하고 상황에 맞게 리팩토링하는 과정을 거치는 것입니다. 말 그대로 테스트가 코드 작성을 주도하는 개발방식입니다.

 

 

 

TDD의 종류

 

- Add a test

 

  • 테스트 주도형 개발에선, 새로운 기능을 추가하기 전 테스트를 먼저 작성한다. 테스트를 작성하기 위해서, 개발자는 해당 기능의 요구사항과 명세를 분명히 이해하고 있어야 합니다.
  • 이는 사용자 케이스와 사용자 스토리 등으로 이해할 수 있으며, 이는 개발자가 코드를 작성하기 전에 보다 요구사항에 집중할 수 있도록 도와줍니다. 이는 정말 중요한 부분이자 테스트 주도 개발이 주는 이점이라고 볼 수 있습니다.

 

 

 

- Run all tests and see if new one fails

 

  • 어떤 새로운 기능을 추가하면 잘 작동하던 기능이 제대로 작동하지 않는 경우가 발생할 수 있으며 더 위험한 경우는 개발자가 이를 미처 인지하지 못하는 경우입니다.
  • 이러한 경우를 방지하기 위해 테스트 코드를 작성하는 것입니다. 새로운 기능을 추가할 때 테스트 코드를 작성함으로써, 새로운 기능이 제대로 작동함과 동시에 기존의 기능들이 잘 작동하는지 테스트를 통해 확인할 수 있습니다.

 

 

 

- Refactor code

 

  • '좋은 코드'를 작성하기란 정말 쉽지가 않습니다. 코드를 작성할 때 고려해야 할 요소가 한 두 가지가 아니기 때문입니다. 가독성이 좋게 coding convention 을 맞춰야 하며, 네이밍 규칙을 적용하여 메소드명, 변수명, 클래스명에 일관성을 줘야하며, 앞으로의 확장성 또한 고려해야 합니다.
  • 이와 동시에 비즈니스 로직에 대한 고려도 반드시 필요하며, 예외처리 부분 역시 빠뜨릴 수 없다. 물론 코드량이 적을 때는 이런 저런 것들을 모두 신경쓰면서 코드를 작성할 수 있지만 끊임없이 발견되는 버그들을 디버깅하는 과정에서 코드가 더럽혀지기 마련입니다. 이러한 이유로 코드량이 방대해지면서 리팩토링을 하게 되며, 이 때 테스트 주도 개발을 통해 개발을 해왔다면, 테스트 코드가 그 중심을 잡아줄 수 있습니다.
  • 뚱뚱해진 함수를 여러 함수로 나누는 과정에서 해당 기능이 오작동을 일으킬 수 있지만 간단히 테스트를 돌려봄으로써 이에 대한 안심을 하고 계속해서 리팩토링을 진행할 수 있으며 결과적으로 리팩토링 속도도 빨라지고 코드의 퀄리티도 그만큼 향상하게 되는 것입니다.
  • 코드 퀄리티 부분을 조금 상세히 들어가보면, 보다 객체지향적이고 확장 가능이 용이한 코드, 재설계의 시간을 단축시킬 수 있는 코드, 디버깅 시간이 단축되는 코드가 TDD 와 함께 탄생하는 것입니다. 어차피 코드를 작성하고나서 제대로 작동하는지 판단해야하는 시점이 온다. 물론 중간 중간 수동으로 확인도 할 것이며, 또 테스트에 대한 부분에 대한 문서도 만들어야 한다. 그 부분을 자동으로 해주면서, 코드 작성에 도움을 주는 것이 TDD 입니다. 

 

 

 

 

- 모든 상황에 대해서 테스트 코드를 작성할 수 있는가?  작성해야 하는가?

 

  • 세상에는 다양한 사용자가 존재하며, 생각지도 못한 예외 케이스가 존재할 수 있습니다. 만약 테스트를 반드시 해봐야 하는 부분에 있어서 테스트 코드를 작성하는데 어려움이 발생한다면? 이러한 상황에서 주객이 전도하는 상황이 발생할 수 있습니다.
  • 분명 실제 코드가 더 중심이 되어야 하는데 테스트를 위해서 코드의 구조를 바꿔야 하나하는 고민이 생깁니다. 또한 발생할 수 있는 상황에 대한 테스트 코드를 작성하기 위해 배보다 배꼽이 더 커지는 경우가 허다합니다. 실제 구현 코드보다 방대해진 코드를 관리하는 것도 쉽지만은 않은 일입니다.
  • 모든 코드에 대해서 테스트 코드를 작성할 수 없으며 작성할 필요도 없으며 테스트 코드를 작성한다고 해서 버그가 발생하지 않는 것도 아닙니다. 애초에 TDD 는 100% coverage 와 100% 무결성을 주장하지 않습니다.
반응형

댓글