JAVA/JAVA 정리

[JAVA] TDD란 ? 테스트 주도 개발 (JUnit)

h0-0cat 2023. 5. 30. 11:58
728x90

TDD란 ?? 테스트 주도 개발(test-driven development, TDD)소프트웨어 개발 방법론 중의 하나로,

선 개발 후 테스트 방식이 아닌 선 테스트 후 개발 방식의 프로그래밍 방법을 말한다.

 

TDD를 이용한 개발방법

  1. 테스트 케이스 작성
  2. 테스트 케이스를 통과하는 코드 작성
  3. 작성한 코드 리팩토링

먼저 테스트 케이스와 테스트 코드를 작성한다. 테스트 코드가 개발을 주도하기 위해서는 반드시 실패를 포함하는 테스트 코드의 작성이 앞서야 한다. 다음으로는 테스트 케이스를 통과하는 코드를 작성한다. 작성된 코드는 개선될 수 있는 많은 여지를 포함한 코드이다. 마지막으로 리팩토링 단계에서 이를 개선한다.

TDD는 기본적으로 위 3단계의 반복으로 진행하며 점진적으로 개발이 진행된다. 필요한 단위 기능에 대한 테스트 코드를 먼저 작성한 후 테스트를 통과하도록 코드를 작성하는 것이다. 

 

TDD의 장점

객체 지향적인 코드 개발

TDD는 코드의 재사용 보장을 명시하므로 TDD를 통한 소프트웨어 개발 시 기능별로 모듈화가 이루어진다. 이는 의존성과 종속성이 낮은 모듈로 조합된 소프트웨어 개발을 가능하게 하며, 필요에 따라 모듈을 추가하거나 제거해도 소프트웨어 전체 구조에 영향을 미치지 않게 된다.

설계 수정시간의 단축

테스트코드를 먼저 작성하기 때문에 최초 설계안을 만족하게 하며 입출력 구조와 기능의 정의를 명확하게 하게 되므로 설계의 구조적 문제를 바로 찾아낼 수 있다.

유지보수(리팩토링)의 용이성

기본적으로 단위 테스트 기반의 테스트 코드를 작성하기 때문에 추후 문제가 발생하였을 때 각각의 모듈별로 테스트를 진행해보면 문제의 지점을 쉽게 찾을 수 있다.

테스트 문서의 대체 가능

대부분의 개발 프로젝트에서 테스트를 진행하는 경우 단순 통합 테스트에 지나지 않는다. TDD를 하게 될 때 테스팅을 자동화시킴과 동시에 더욱 정확한 테스트 근거를 산출해 정의서를 작성할 수 있다.

TDD의 단점

사전준비 기간

TDD를 프로젝트에 도입하려면 사전에 필요한 지식을 습득하고 개발 환경을 구축해야 한다. TDD를 효과적으로 사용할 수 있는 수준으로 개발자를 교육하는 데 보통 1~6개월간의 시간이 필요하다.

생산성 저하

프로젝트를 진행할 때 경험 때문에 어떤 예외상황이 발생할지 눈에 뻔히 보이는 경우가 종종 있다. 이러한 단발성 개발은 개발 기간이 타이트하게 잡히는 경우가 많은데, 이럴 때 TDD를 이용해 테스트 코드를 작성하고 그에 통과하기 위한 코드를 작성한다면 비효율적일 것이다.

TDD 과연 필요한가?

TDD에 대해 처음 듣는 개발자라면 새로운 세계를 발견한 것과 같은 느낌을 받을 수 있을 것이다. 이것을 실무에 활용하기 위해 많은 고민을 할 수 있을 것이다. 하지만 TDD가 실제로 많이 쓰이는가? 유용한가? 이 질문에는 "글쎄올시다."라고 답할 수밖에 없다.  TDD는 항상 옳지 않다(비용의 문제) 란 글을 보면 TDD는 비용적인 측면에서 고민해야 한다는 것이다. 테스트 코드를 짜는 것 또한 엄연한 개발이다. 그만큼 시간을 투자함에 따라 이익을 얻어야 하는데 테스트에만 너무 과도하게 몰입해버린다면 그야말로 시간 낭비가 될 것이다.

결론적으로 적당한 TDD는 개발에 있어 능률 상승을 가져올 수 있다. 하지만 과도한 테스트는 오히려 해롭다.

 

TDD Tools

​JUnit

​JUnit은 전 세계적으로 널리 사용되는 JAVA의 표준 단위 테스트 프레임워크이다. 에릭 감마와 켄트 백이 개발하였으며, JUnit을 시작으로 XUnit 프레임워크가 탄생하게 되었다.

 

 

 

728x90

'JAVA > JAVA 정리' 카테고리의 다른 글

[JAVA] 정렬 종류와 정의  (0) 2023.05.30
[JAVA] 제네릭  (0) 2023.05.30
[JAVA] Marshalling, UnMarshalling, JAXB 란 ?  (0) 2023.05.29
[JAVA] JAVA 네트워크란 ?  (0) 2023.05.28
[JAVA] 스트림과 병렬 처리  (0) 2023.05.27