180212 재미 그래밍 3기

파이썬을 이용한 테스트 주도 개발 (TDD)

TDD

  • 번역을 그대로 하면 ‘테스트 주도 개발’이지만, ‘테스트 우선 개발’이라는 표현으로 이해하는 것이 더 좋다!!

왜 TDD를 해야하는가??

  • 일반적인 개발 프로세스

    • 일반적인 개발 절차는 먼저 어떻게 개발할지 디자인하고 디자인을 바탕으로 실제 코드를 작성하고 최종적으로 테스트를 작동시켜보면서 해보는 과정이었다.

  • TDD(Test-driven Development)

    • RED : 실패하는 테스트를 만들기
    • GREEN : 테스트에 통과할 만한 작은 코드를 작성하기
    • REFACTOR : 반복되는 코드, 긴 메소드, 큰 클래스, 긴 매개변수 목록 등등 코드를 좀 더 효율적으로 바꾸기

TDD != 단위 테스트

TDD != 테스팅 전략

TDD == 개발 기법 (개발 방법론 중의 하나)

반증가능성의 의미

  • TDD는 개발자로 하여금 내 코드의 논리적 반증가능성을 사유하게 해준다

  • 반증가능성이란, 가설 A가 실험이나 관찰에 의해서 반증될 가능성이 있다는 것을 의미한다.

    • 예) 언젠가 외계인이 침공할것이다!! - 반증가능성이 없다.
    • 예) 무게가 있는 모든 물체는 아래로 떨어진다 - 반증가능성이 있다. (무중력 상태에서는 가능)

실제 코드를 작성하기 전에 테스트 코드부터 작성하기 때문에 자연스럽게 가설에 이용할 데이터를 여러가지로 생각하게 된다. 실제 서버에 반영할 때 TDD를 진행하면서 만든 테스트 코드들은 추후에 안전장치 역할을 해준다. 내가 미처 생각하지 못한 반증에 대해 작성한 많은 테스트 코드들은 내가 세운 가설들을 검증한다.

TDD의 장점

  • 개발자가 찾아내지 못한 반증에 대해 안전장치 역할을 하면서 서비스를 안정적으로 운영하게 한다

  • 유지 보수가 쉽다

  • 개발자가 의도한대로 코딩이 진행된다

  • 테스트는 문서가 된다

  • 개발 소요시간이 줄어든다

결론

납기일이 정해져 있지 않고 끝없이 발전해야하고 최초설계가 여러번 바뀌며 지속적으로 버전이 올라가는 소프트웨어의 개발에서는 TDD로 생산성이 급격히 높아진다.

반대로 납기일이 정해져있고 설계대로 만들어져야하고 한번 만들어서 큰 변화없이 일정 수명정도만 가지는 소프트웨어의 개발에서는 TDD 제값을 못한다.