TDD 공부 시작

최근 회사에서 안드로이드 F/W의 모듈 추가와 수정을 하면서 단위 테스트가 필요한 경우가 많았다.
TDD라는 말이 그 전부터도 한참 많이 들어왔던 단어인데, 최근들어 공부해야 겠다는 생각이 들었다.
결국 단위 모듈 테스트라면 파이썬에선 __main__으로 되는 것 아닌가 싶기도 한데..

켄트 백이 쓴 Test-Driven Development: By Example을 번역한 책을 기준으로 TDD 공부를 시작하였다.
이 책은 예제를 위주로 다루고 있고, chapter에 따른 내용들은 내 맘대로 이름을 붙여 정리해보았다.

TDD

테스트 주도 개발은 단순한 두 가지 규칙만을 따른다.

  • 오직 자동화된 테스트가 실패한 경우에만 새로운 코드를 작성한다.
  • 중복을 제거한다.

위 규칙들에서 아래와 같은 함의를 갖는다.

  • 매 결정사항에 대해 피드백을 제공하는 실행 가능한 코드를 기반으로 하는 유기적인 설계를 해야한다.
  • 직접 테스트를 작성한다.
  • 개발 환경은 작은 변화에도 빠르게 반응할 수 있어야 한다1.
  • 쉬운 테스트를 위해 응집도는 높고 결합도는 낮은 컴포넌트들로 구성되게 설계해야 한다2.

프로그래밍 순서

  1. 실패하는 작은 테스트를 작성한다. 처음에는 컴파일조차 되지 않을 수 있다.
  2. 빨리 테스트가 통과하게끔 만든다. 코드가 개판이어도 좋다.
  3. 리팩토링을 통해 테스트를 통과하게 만든 문제들을 제거한다.

이런 코드 방식으로 다음과 같은 함의를 가질 수 있다.

  • 결함을 감소시켜 품질보증을 능동적으로 할 수 있다.
  • 고약한 예외 상황의 숫자를 충분히 낮출 수 있다면 프로젝트 매니저가 정확히 추정하여 고객을 매일의 개발 과정에 참여시킬 수 있다3.
  • 깔끔하고 쉽게 이해가능한 코드로 기술적인 대화가 분명해질 수 있다면 협력하기 더 쉬워질 것이다.

TDD가 필요한 이유

용기를 주기 때문이다.
불확실함으로 인한 두려움은 망설이게하고 / 커뮤니케이션을 줄이고 / 피드백을 피하게 한다.
불학실함을 이기고 구체적인 학습을 통해 분명하게 커뮤니케이션하고/ 구체적인 피드백을 받아야 한다.
TDD를 하는 것은 톱니바퀴를 만드는 것과 같고, 하나가 작동하면 걔는 영원히 작동하는 것이다.
TDD란 프로그래밍 중 내린 결정과 그 결정에 대한 비드백 사이의 간격을 인지하고, 이 간격을 통제할 수 있게 해주는 기술이다.

결국 TDD는, 단순하게 시작하고, 자동화된 테스트를 만들고, 새로운 설계에 대한 도입을 위해 리팩토링 하는 것이다.


  1. 따라서 컴파일 등의 과정이 최소화된 파이썬 등의 언어가 제일 적합하다. 

  2. 실제 안드로이드 F/W에서는 클래스 간의 결합도가 높아 단일 모듈 테스트가 굉장히 어렵거나 불가능한 항목이 많았다. 

  3. 특정 상황에서만 나오는 예외 케이스에 대해 고객의 요구사항을 테스트에 추가한다는 말로 보인다. 항상 이슈가 되는 건 100% 발생 이슈가 아니라 발견할 수 없는 특정 상황 이슈니까.