[Software] TDD(Test-Driven Development)

장유진·2023년 7월 28일
0

Computer Science

목록 보기
7/7

테스트 주도 개발 TDD란?

Test-Driven Development의 약자

소프트웨어를 동작시키기 위한 로직을 작성하기 전에, 테스트 코드를 구현하는 것을 프로세스화 한 개발 방법.

테스트 코드가 필요한 이유

  1. 작성한 코드가 의도적으로 동작하는지 수시로 빠르게 검증할 수 있습니다.
  2. 리팩토링 이후에도 소프트웨어가 여전히 동일한 동작을 수행할 수 있는 안전망 역할을 합니다.
  3. 개발한 소프트웨어의 품질을 보증할 수 있습니다.

TDD의 장점과 중요성

버그 감소

테스트 코드를 먼저 작성하지 않으면 의식의 흐름대로 코드를 작성하기 때문에, 문제 발생 시 확인해야 할 코드의 범위가 넓어집니다. 반대로 테스트 코드를 먼저 작성하면 예외적인 사항을 미리 정리할 수 있기 때문에, 엣지 케이스에서 버그가 생기는 것을 사전에 방지할 수 있습니다.

또한, 잘 작성된 테스트 코드는 동료 개발자에게 코드의 의도를 설명하는 코드 명세서의 역할을 할 수 있습니다.

사용성이 높은 소프트웨어 개발

TDD를 사용하면 개발의 초점이 기능 구현에서 소프트웨어의 사용으로 이동합니다. 테스트 우선 접근 방식을 통해 개발자에게 사용자가 가질 수 있는 사용성 문제를 보다 신중하게 고려할 수 있게 합니다.

디버깅 시간 감소

모듈별로 자동화 된 테스트 코드가 없다면 버그가 발생했을 때 모든 코드를 확인하면서 어디서 발생한 에러인지 찾아봐야 합니다. 또 버그가 언제부터 발생했는지 추적하기 어렵습니다.

TDD의 경우 자동화 된 단위 테스트를 전제로 하기 때문에 어디에서 발생하고 있는 버그인지 쉽게 찾아낼 수 있다는 장점이 있습니다.

코드 품질 향상

테스트 코드를 작성하는 과정에서 기능 구현을 위한 설계 요소, 객체의 동작 수행과 객체간의 데이터 전달을 고민하게 되어 구조적으로 더 나은 코드를 작성할 수 있습니다.

TDD 개발 주기

  1. 실패하는 단위 테스트 코드 작성
    1. 테스트 시나리오를 메소드화 한다는 것에 초점을 둔다. ‘어떤 것을 테스트하고자 하는지’에 목적을 둔다.
    2. 필요한 메소드의 입력 / 출력값이 이 단계에서 정해져야 한다.
  2. 테스트를 통과시키기 위한 최소한의 실제 코드 작성
    1. 목(MOCK) 객체를 활용한다.
      한 객체를 테스트하기 위해 모든 객체(API 연동 등)을 다 구현하고 기능을 테스트 하는 것은 비효율적이고 기능 테스트 본질이 흐려질 수 있다. 따라서 대상 객체에서 직접 참조하는 객체들은 mock 객체로 대체해서 테스팅 하는데만 집중할 수 있도록 한다.
  3. 중복 코드 제거 등 성능과 가독성을 향상시키기 위한 리팩토링 수행
    1. 최소한의 코드로 테스트를 통과시키기 위한 코드를 작성한 후 구조적 개선에 집중하는 과정
    2. 리팩토링 하면서 테스트를 계속 진행하면서, 리팩토링 후에도 기능을 동일하게 제공할 수 있도록 한다.

TDD의 단점

초기 비용 증대 & 생산성 저하

TDD의 수많은 장점에도 불구하고 현실적으로 도입하는데에 가장 큰 장벽으로 초기 비용 증대와 생산성 저하를 꼽을 수 있습니다. 장기적으로는 TDD를 사용하지 않았을 때와 비교하여 시간 대비 비용이 더 커지지 않고 일정하게 유지되지만 단기적으로 TDD를 사용했을 때의 초기 비용은 TDD를 사용하지 않았을 때보다 크기 때문입니다.

기능 하나를 추가할 때마다, 테스트 코드의 수정 및 추가가 필요하기 때문에 개발자는 프로젝트의 일정과 자원을 고려해 TDD의 사용 여부를 결정할 수 있습니다.

❗️사용시 주의 : TDD 자체가 목적이 되어서는 안 된다

TDD는 공동의 목표를 효율적으로 달성하기 위한 도구임을 잊지 말아야 합니다.



Related Post
리액트 리팩토링 테스트부터 최적화까지(단위 테스트, 통합 테스트, E2E)

Reference
https://marsner.com/blog/why-test-driven-development-tdd/
https://jay-flow.medium.com/tdd란-무엇이며-왜-필요한가-18cb5979629c
https://lgphone.tistory.com/156
https://media.fastcampus.co.kr/knowledge/dev/tdd/

0개의 댓글