테스트코드 & 정적분석

TDD로 코드 품질과 효율성 높이는 방법: 장단점과 실전 활용

백엔드 유성 2024. 1. 4. 18:30

테스트 주도 개발 (TDD)은 개발 이전에 테스트 코드를 먼저 작성하고, 테스트 코드에 따라 기능을 개발하는 방법론입니다.

 

TDD의 장점

  • 개발 과정에서 미리 버그를 찾을 수 있습니다.
  • 코드의 안정성이 높아진 덕분에 복잡한 리팩토링을 시도할 수 있습니다.
  • 테스트 코드가 행위 중심으로 코드를 작성하게 유도하여, 더 높은 수준의 개발이 가능합니다.
  • 기능의 확장 및 수정에도 코드의 품질을 유지할 수 있어, 지속적인 통합/ 지속적인 배포 에 적합합니다.

 

TDD "레드-그린-리팩터" 사이클

TDD개발은 레드, 그린, 리팩터 순서를 따릅니다.

  1. 레드 : 새로 개발할 기능에 대하여 테스트 코드를 작성한 단계입니다. 이 때, 테스트 코드는 실패해야 합니다.
  2. 그린 : 테스트 코드를 통과할 수 있도록 최소한의 코드를 작성한 단계입니다. 이 때, 테스트 코드는 성공해야 합니다.
  3. 리팩터 : 코드의 구조를 개선하고 가독성을 높이며, 유지보수를 용이하게 만드는 단계입니다. 리팩터 이후에는 테스트 코드가 실패하면 안됩니다.

 

TDD가 코드 품질을 올려주는 이유

앞서 언급했듯이 사전 오류 감지 및 리팩토링 용이성 등이 있지만,

제가 생각하는 가장 중요한 이유는 행위 중심의 코드 작성을 유도한다는 점입니다.

 

테스트 코드를 작성 시, "어떤 행위를 하면 어떠한 결과가 나오며, 특정 조건에서 어떠한 결과가 나온다"라는 기본적인 틀을 따르게 됩니다.

이러한 접근은 단순히 개발자가 특정 기능의 기술적 구현보다는 그 기능이 제공해야 할 가치와 행위 그리고 예외처리에 집중하도록 합니다.

이는 코드가 단순히 특정 조건을 충족시키는 것을 넘어서, 사용자로 하여금 어떤 입력을 제공했을 때 기대하는 출력이 무엇인지를 고려하게 하기 때문에 개발 과정이 더 사용자 중심적이 되고, 결과적으로 더 직관적이고 사용하기 쉬운 소프트웨어가 만들어질 수 있다고 생각합니다.

 

그렇지만 TDD의 단점도 분명합니다.

  • 외부 시스템과의 연동이 있는경우 예측 불가능한 요소를 도입하며, 통제가 불가능한 외부 요인에 의존하는 경우가 많으므로, 테스트의 신뢰성이 저하될 수 있습니다.
  • 요구사항이 빈번하게 변경되는 경우, TDD는 오히려 테스트 케이스를 지속적으로 수정하고 재작성 한는데 시간과 자원을 낭비할 수 있습니다. (테스트 코드를 유연하게 작성하는 것도 한가지 방법일 수 있습니다.)

꼭 TDD가 무조건적으로 좋다라고 하기에는 어려움이 있습니다. 시간, 자원, 안정성 등을 고려하여 TDD를 도입해야 합니다.

 

테스트 커버리지 100%(?)

테스트 커버리지를 100%에 가까울수록 코드 베이스의 모든 부분이 테스트 되었음을 의미하며, 버그 발생을 현저하게 줄일 수 있고 개발자들에게 코드가 잘 작동한다는 확신을 줄 수 있습니다. 이는 소프트웨어의 안정성과 신뢰성을 향상시키는 중요한 요소가 될 수 있습니다.

그러나 100% 테스트 커버리지를 달성하기 위해서는 상당한 시간과 노력이 필요하며, 때로는 이 과정이 비효율적일 수 있습니다. 이는 특히 요구사항이 빈번하게 변경되는 경우에 두드러질 수 있습니다. 하지만 TDD는 이러한 상황에서도 유연한 설계와 빠른 피드백 루프를 제공함으로써 요구사항의 변경에 더 잘 대응할 수 있습니다. TDD 방법론은 개발 과정 중에 빠르게 테스트를 수행하고 결과를 반영함으로써, 변경 사항에 신속하게 대응하고 이를 코드에 통합할 수 있는 구조를 제공합니다.

따라서, 테스트 커버리지 100%를 목표로 하는 것은 프로젝트의 목표와 우선순위, 리소스, 시간 제약 등을 고려하여 결정해야 합니다. 이상적인 테스트 커버리지를 달성하는 것은 중요하지만, 프로젝트의 실제 상황과 요구사항에 맞는 균형 잡힌 접근 방식을 취하는 것이 현실적이고 효과적인 전략이 될 것입니다.