[TDD 00] TDD란 무엇일까?

TDD(Test-Driven Development)는 소프트웨어 개발 방법론 중 하나로 테스트 주도 개발이라고 한다.

개발 후 테스트 하던 기존 방식과 다르게 먼저 자동화된 테스트 코드를 작성한 후 테스트를 통과하기 위한 코드를 개발하는 방식이다.

 

아래 그림과 같은 절차로 이루어진다.

 

기존 프로세스와 TDD 프로세스 비교

 

테스트 코드를 왜 먼저 적어야 할까?

1. 깔끔한 코드를 작성할 수 있다.

 - TDD의 궁극적인 목표는 잘 작동하는 깔끔한 코드를 작성하는 것이다.

 

2. 장기적으로 개발 비용을 절감할 수 있다.

 - 처음 작성할 때에는 귀찮고 개발을 느리게 한다는 느낌을 받을 수 있지만, 장기적으로 보면 반드시 개발 비용을 아껴줄 것이다.

 

3. 개발이 끝나면 테스트 코드를 작성하는 것이 귀찮기 때문이다.

 - 테스트 코드는 성공과 실패 케이스 모두 작성해야 하기 때문에 이미 개발이 완료된 후에는 테스트 코드를 작성하기 더 귀찮아진다.

 

TDD 장점

1. 객체 지향적인 코드 개발

 - 코드의 재사용 보장을 명시하기 때문에 TDD를 통한 소프트웨어 개발 시 기능별로 모둘화가 이루어진다.

 - 따라서 의존성과 종속성이 낮은 모듈로 조합된 소프트웨어 개발을 가능하게 하며, 필요에 따라 모듈을 추가하거나 제거해도 소프트웨어 전체 구조에 영향을 미치지 않게 된다.

 

2. 재설계 시간 단축

 - 테스트 코드를 먼저 작성하기 때문에 개발자가 지금 무엇을 해야 하는지 분명히 정의하고 개발을 시작하게 된다.

 - 테스트 시나리오를 작성하면서 다양한 예외 사항에 대해 생각해볼 수 있기 때문에 설계의 구조적 문제를 바로 찾아낼 수 있고 전반적인 설계가 변경되는 일을 방지할 수 있다.

 

3. 유지보수의 용이성

 - 기본적으로 단위 테스트(유닛 테스트) 기반의 테스트 코드를 작성하기 때문에 문제가 발생했을 때 각 모듈별로 테스트를 진행하면 버그를 쉽게 찾을 수 있다.

 

4. 테스트 문서의 대체 가능

 - SI 프로젝트 진행 과정에서 어떤 요소들이 테스트 되었는지 테스트 정의서를 만드는데, 보통 단순 통합 테스트 문서이다.

 -  TDD는 테스팅을 자동화 시키면서 동시에 더욱 정확한 테스트 근거를 산출해 정의서를 작성할 수 있다.

 

5. 추가 구현의 용이함

 - 개발이 완료된 소프트웨어에 어떤 기능을 추가할 때 가장 우려되는 점은 기존 코드에 어떤 영향을 미칠지 알지 못한다는 것이다.

 - 하지만 TDD의 경우 자동화된 유닛 테스팅을 전제하므로 테스트 기간을 획기적으로 단축시킬 수 있다.

 

TDD 단점

1. 생산성 저하

 - 일단, 처음부터 2개의 코드를 짜야하고 중간에 테스트를 하면서 고쳐나가야 하기 때문에 개발 속도가 느려질 수밖에 없다.

 - 보통 일반적인 개발 방식에 비해 10~30% 정도 늘어난다.

 - SI 프로젝트에서는 소프트웨어 품질보다 납기일 준수가 훨씬 중요하기 때문에 TDD 방식을 잘 사용하지 않는다.

 - 이렇게 단발성 프로젝트는 보통 개발 기간이 타이트하기 때문에 TDD 방식으로 개발한다면 비효율적일 수 있다.

 

2. 사전 준비 기간

 - TDD를 프로젝트에 도입하려면 사전에 필요한 지식을 습득하고 개발 환경을 구축해야 한다.

 - TDD를 효과적으로 사용할 수 있는 수준으로 개발자를 교육하는 데 보통 1~6개월의 시간이 필요하다.

 

TDD는 반드시 좋은 것일까?

개발할 때 능률이 올라갈 수 있지만 항상 좋은 것은 아니다.
실무에서 과연 TDD 방식을 많이 사용할까 생각해보면 비용적인 측면 때문에 그렇지 않을 수도 있다는 것을 알 수 있다.
개발하기도 바쁜데 테스트에 너무 몰입해버리면 시간 대비 이익이 적을 수 있기 때문에 늘 TDD가 좋은 것은 아니다.

 

TDD를 적용하면 좋은 경우

한마디로 말하자면 불확실성이 높을 때 사용하면 좋다.
  • 처음해보는 프로그램 주제 : 나에 대한 불확실성이 높은 경우
  • 고객의 요구 조건이 바뀔 수 있는 프로젝트 : 외부적인 불확실성이 높은 경우
  • 개발하는 중에 코드를 많이 바꿔야 하는 경우
  • 내가 개발하고 유지보수를 누가 할지 모르는 경우

'개발 지식' 카테고리의 다른 글

Encryption(암호화), Encoding(인코딩) 차이점  (0) 2024.03.19
[TDD 01] TDD 개발 방법  (2) 2023.04.24