Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

파이썬 TDD 101

파이썬 코리아 알고리즘 스터디(손고리즘)에서 발표한 문서입니다.

파이썬 TDD 101

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

×