1. –Kent Beck
‘내가 12살 괴짜시절에 읽었던 책이 있는데, 실제 입력
테이프를 넣었을 때 그 결과로 기대할 수 있는 출력 테이
프를 미리 타이프해 넣고, 실제 결과가 기대 결과와 같아
질 때까지 코딩하라고 제안했다. 그 책을 쓴 이름 모르는
저자에게: 고마워요, 고마워요, 고마워요.’
2. – 김창준
‘테스트를 먼저 하다니 도대체 말이나 될 법한 소리인
가? 아니 말이 된다. 그것도 아주 훌륭히.’
5. TDD란?
• Test Driven Development 테스트 주도적인 개발
• 소스코드 작성 전에 테스트 코드를 먼저 작성하라
• “단순한 설계를 장려하고 자신감을 불어넣는다.” - Kent
Beck
• “잘 동작하는 깔끔한 코드” - Ron Jeffries
6. TDD 싸이클
• 빨강 - 실패하는 작은 테스트를 작성한다
• 초록 - 빨리 테스트가 통과하게끔 만든다. 죄악을 저질러
도 좋다
• 리팩토링 - 테스트를 통과하게 하는 와중에 생겨난 문제
와 중복을 제거한다
7.
8. TDD의 장점
• 높은 소스코드 품질 (MS와 IBM 사례)
• http://research.microsoft.com/en-us/groups/ese/nagappan_tdd.pdf
• 15~35% 개발 시간 증가
• 40~90% 결함(버그) 감소
• 재설계 및 디버깅 시간의 절감
• 퍼포먼스 체크 및 추가 대응에 용이
• 문서화 대체
9. TDD의 단점
• 단기적 코드 생산성 하락
• 실제 코드보다 TC(Test-Case) 유지보수 비용이 더 커질
수도
• 과도한 Mock-up 비용 -> Docker나 Chef 이용 바람직
10. TDD 수련법
• 간단하고 쉬운 문제들을 TDD를 시도한다.
• 초록막대주기( 테스트가 합격된 상태에서 다음 합격 상태
까지 )를 짧게 가져간다.
• 가짜로 구현하기를 사용한다.
• 보폭을 조절한다. 너무 큰 것을 테스트 하고 있다면 쪼갠다.
• 테스트 하기 힘든 것은 레이어를 나누어 가능한 계층에 대
해서 한다
11. TDD로 풀기 난해한 분야들
• 보안 소프트웨어와 동시성 문제
• 게임 클라이언트
• UI가 많은 어플리케이션
• 의존하는 외부 시스템이 많은 서비스
12. TDD와 파이썬
• 파이썬과 같은 동적언어는 TDD를 하기에 보다 적합하다.
• 컴파일 단계의 체크가 약하기에, TDD가 꼭 필요하다.
14. 시연 과제 - URL Splitter
• https://www.google.co.kr/#q=seoul 과 같은 URL주소
를 다음과 같이 분리하는 코드를 작성하여라
• 프로토콜: http
• 도메인: www.google.com
• 경로: #q=seoul
15. 파이썬 TDD 툴들
• unittest 모듈 - 기본 내장되어 있으나 구식
• nose - 전통적으로 많이 사용
• pytest - 최신의 다양한 기능이 많음 👈
• coverage - 코드 커버리지 분석 👈
• 툴에 너무 집착하지 말자. 단순 assert로도 충분!
16. 준비
• 필요 모듈 설치
• pip install pytest
• pip install pytest-cov
• pip install coverage
• 파일 생성 urlsplit.py, test_urlsplit.py
• tests/ 폴더를 따로 만드는 것도 좋습니다.
17. 1. 기본 기능 동작하게
• https://www.google.co.kr/#q=seoul 분석 - 가짜 구현!?
• ftp://ftp.daum.net/ubuntu-releases 분석 - 어쩔 수 없
이 제대로
• 옵션 - 프로토콜이나 경로가 없는 경우에도 동작하게
18. fixture 사용하기
• 퍼포먼스 체크를 위해 더 많은 URL에 대해 수행해보자
• test_urls를 @pytest.fixture 로 만들기
• pytest -k 를 사용하여 특정 테스트만 실행 시키기
• 이를 위해 테스트 이름 정리 필요
• -s 옵션으로 print 출력 결과 보기
19. 예외 발생 시키기
• 이상한 URL이 들어오면 ValueError 예외 발생
• pytest.raises 이용
21. coverage 구하기
• 기본 실행
• py.test —cov urlsplit
• HTML 보고서 보기
• py.test —cov urlsplit —cov-report=html
• is_valid 함수 별도 구현 후 다시 시도
• coverage 100%에 도전!