[TDD] TDD는 Test가 아니다. - 자바 플레이그라운드 with TDD, 클린코드

2022. 12. 6. 09:51Test

박재성님의 TDD에 대한 참여형 강의를 듣고 있습니다. 해당 내용을 정리하면서 TDD를 좀 더 체화하려고 합니다. 사실 TDD 보다는 그 외 여러가지 테크닉을 배우는 것도 중요하게 생각하고 있습니다. 그리고 생각보다 강의 내용대로 따라가려고 하는데, 뭔가 녹화 영상을 볼때는 '아 일케 하면 되겠군 ㅋㅋㅋ' 하다가도, 정작 혼자 해보려고하면 '이게 맞누?' 싶어서 진척이 너무 더딥니다. 하지만 12월까지는 이 부분을 꼭 체득하고 싶네요.


TDD란?

  • TDD = TFD(Test First Development) + 리팩토링
  • 리팩토링이 중요하다.
  • TDD는 테스트 기술이 아니라, TDD는 분석 기술이며, 설계 기술이다.
  • Todo-List를 잘 만들어야 되며 이걸 잘 만든다는 것은 요구사항 설계를 잘 했다는 것이다.
  • 테스트 코드도 리팩토링을 한다.

 

TDD를 하는 이유

  • 디버깅 시간을 줄여준다.
  • 동작하는 문서 역할을 한다.
  • 경험담인데... 테스트 코드 없이 배포하는 자살행위를 반복하지 않아야 한다.( 진짜 인수인계 받은 코드에 테스트 코드가 없으면 답이 없다. )

 

TDD 원칙

  • 원칙 1 - 실패하는 단위 테스트를 작성할 때까지 프로덕션 코드를 작성하지 않는다.
  • 원칙 2 - 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
  • 원칙 3 - 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.

 


적용 방법

1차적으로 도메인 로직을 테스트하는 것에 집중한다. Controller와 View와 같이 외부 의존적인 부분은 테스트가 힘들 수 있으므로 Domain에 대한 테스트를 진행한다.

 

  • 랜덤 값 생성과 같은 부분은 테스트가 어렵기에 분리해본다.
  • 도메인을 최대한 작은 단위로 분리를 해본다.

이 부분이 조금 어렵습니다. 음 박재성님께서는 익숙하지 않은 상태에서는 아래와 같은 방법을 권장하십니다.

  • 위 테스트도 없고, TDD도 아니고, 객체 설계도 하지 않고, 기능 목록을 분리하지도 않고 지금까지 익숙한 방식으로 일단 구현
  • 구현하려는 프로그래밍의 도메인 지식을 쌓는다.
  • 구현한 모든 코드를 버린다. -> 지금 제가 여기서 너무 많이 버리고 있습니다.
  • 기능 목록 중 가장 만만한 녀석부터 TDD로 구현 시작
  • 복잡도가 높아져 리팩토링하지 힘든 상태가 되면 다시 버린다. -> 여기서도 또 겁나 버리고 있습니다.

문제는 계속 코드를 버리고 있습니다. 뭔가 잘 안되는데요. 일단 수차례의 반복으로 진행해본 결과를 다음 포스팅에 간략하게 정리하여 보겠습니다.