파이썬 tdd 101

30
–Kent Beck ‘내가 12살 괴짜시절에 읽었던 책이 있는데, 실제 입력 테이프를 넣었을 때 그 결과로 기대할 수 있는 출력 테이 프를 미리 타이프해 넣고, 실제 결과가 기대 결과와 같아 질 때까지 코딩하라고 제안했다. 그 책을 쓴 이름 모르는 저자에게: 고마워요, 고마워요, 고마워요.’

Upload: -

Post on 16-Jul-2015

232 views

Category:

Software


3 download

TRANSCRIPT

Page 1: 파이썬 TDD 101

–Kent Beck

‘내가 12살 괴짜시절에 읽었던 책이 있는데, 실제 입력

테이프를 넣었을 때 그 결과로 기대할 수 있는 출력 테이

프를 미리 타이프해 넣고, 실제 결과가 기대 결과와 같아

질 때까지 코딩하라고 제안했다. 그 책을 쓴 이름 모르는

저자에게: 고마워요, 고마워요, 고마워요.’

Page 2: 파이썬 TDD 101

– 김창준

‘테스트를 먼저 하다니 도대체 말이나 될 법한 소리인

가? 아니 말이 된다. 그것도 아주 훌륭히.’

Page 3: 파이썬 TDD 101

파이썬 TDD 101for Python Korea

Page 4: 파이썬 TDD 101

TDD 소개

Page 5: 파이썬 TDD 101

TDD란?

• Test Driven Development 테스트 주도적인 개발

• 소스코드 작성 전에 테스트 코드를 먼저 작성하라

• “단순한 설계를 장려하고 자신감을 불어넣는다.” - Kent Beck

• “잘 동작하는 깔끔한 코드” - Ron Jeffries

Page 6: 파이썬 TDD 101

TDD 싸이클

• 빨강 - 실패하는 작은 테스트를 작성한다

• 초록 - 빨리 테스트가 통과하게끔 만든다. 죄악을 저질러도 좋다

• 리팩토링 - 테스트를 통과하게 하는 와중에 생겨난 문제와 중복을 제거한다

Page 7: 파이썬 TDD 101
Page 8: 파이썬 TDD 101

TDD의 장점

• 높은 소스코드 품질 (MS와 IBM 사례)

• http://research.microsoft.com/en-us/groups/ese/nagappan_tdd.pdf

• 15~35% 개발 시간 증가

• 40~90% 결함(버그) 감소

• 재설계 및 디버깅 시간의 절감

• 퍼포먼스 체크 및 추가 대응에 용이

• 문서화 대체

Page 9: 파이썬 TDD 101

TDD의 단점

• 단기적 코드 생산성 하락

• 실제 코드보다 TC(Test-Case) 유지보수 비용이 더 커질 수도

• 과도한 Mock-up 비용 -> Docker나 Chef 이용 바람직

Page 10: 파이썬 TDD 101

TDD 수련법

• 간단하고 쉬운 문제들을 TDD를 시도한다.

• 초록막대주기( 테스트가 합격된 상태에서 다음 합격 상태까지 )를 짧게 가져간다.

• 가짜로 구현하기를 사용한다.

• 보폭을 조절한다. 너무 큰 것을 테스트 하고 있다면 쪼갠다.

• 테스트 하기 힘든 것은 레이어를 나누어 가능한 계층에 대해서 한다

Page 11: 파이썬 TDD 101

TDD로 풀기 난해한 분야들

• 보안 소프트웨어와 동시성 문제

• 게임 클라이언트

• UI가 많은 어플리케이션

• 의존하는 외부 시스템이 많은 서비스

Page 12: 파이썬 TDD 101

TDD와 파이썬

• 파이썬과 같은 동적언어는 TDD를 하기에 보다 적합하다.

• 컴파일 단계의 체크가 약하기에, TDD가 꼭 필요하다.

Page 13: 파이썬 TDD 101

TDD 시연

Page 14: 파이썬 TDD 101

시연 과제 - URL Splitter

• https://www.google.co.kr/#q=seoul 과 같은 URL주소를 다음과 같이 분리하는 코드를 작성하여라

• 프로토콜: http

• 도메인: www.google.com

• 경로: #q=seoul

Page 15: 파이썬 TDD 101

파이썬 TDD 툴들

• unittest 모듈 - 기본 내장되어 있으나 구식

• nose - 전통적으로 많이 사용

• pytest - 최신의 다양한 기능이 많음 👈

• coverage - 코드 커버리지 분석 👈

• 툴에 너무 집착하지 말자. 단순 assert로도 충분!

Page 16: 파이썬 TDD 101

준비

• 필요 모듈 설치

• pip install pytest

• pip install pytest-cov

• pip install coverage

• 파일 생성 urlsplit.py, test_urlsplit.py

• tests/ 폴더를 따로 만드는 것도 좋습니다.

Page 17: 파이썬 TDD 101

1. 기본 기능 동작하게

• https://www.google.co.kr/#q=seoul 분석 - 가짜 구현!?

• ftp://ftp.daum.net/ubuntu-releases 분석 - 어쩔 수 없이 제대로

• 옵션 - 프로토콜이나 경로가 없는 경우에도 동작하게

Page 18: 파이썬 TDD 101

fixture 사용하기

• 퍼포먼스 체크를 위해 더 많은 URL에 대해 수행해보자

• test_urls를 @pytest.fixture 로 만들기

• pytest -k 를 사용하여 특정 테스트만 실행 시키기

• 이를 위해 테스트 이름 정리 필요

• -s 옵션으로 print 출력 결과 보기

Page 19: 파이썬 TDD 101

예외 발생 시키기

• 이상한 URL이 들어오면 ValueError 예외 발생

• pytest.raises 이용

Page 20: 파이썬 TDD 101

yield_fixture 사용해보기

• @pytest.yield_fixture

Page 21: 파이썬 TDD 101

coverage 구하기

• 기본 실행

• py.test —cov urlsplit

• HTML 보고서 보기

• py.test —cov urlsplit —cov-report=html

• is_valid 함수 별도 구현 후 다시 시도

• coverage 100%에 도전!

Page 22: 파이썬 TDD 101
Page 23: 파이썬 TDD 101

정리

Page 24: 파이썬 TDD 101

알고리즘 풀이에 적용하자

• 알고리즘 문제 풀이는 TDD 적용이 용이한 분야

• 먼저 예시를 만족하는 풀이를 구현하고,

• 다음과 같은 TC를 생각해서 테스트 하자

• 경계조건

• 퍼포먼스 측정

• 리팩토링 후 점검

Page 25: 파이썬 TDD 101

웹 개발을 TDD로 하려면?

Page 26: 파이썬 TDD 101

TDD의 확장

• CI(Continuous Integration)툴과의 연계

• Travis CI, drone.io 등 이용

• Coveralls로 커버리지 모니터링

Page 27: 파이썬 TDD 101

wzdat의 사례

Page 28: 파이썬 TDD 101

Q&A

“좋은 습관이 좋은 코드를 만듧니다.”

Page 29: 파이썬 TDD 101

실습 문제: 계산기

• 한 줄씩 수식을 받아들이고, 계산 결과를 출력

1. 3 + 4 ==> 7 # 단순 계산

2. 3 + 4 / 2 ==> 5 # 연산자 우선 순위

3. (3 + 4) / 2 ==> 3 # 괄호 처리

4. x = 4(3 + x) / 2 ==> 3 # 변수 대입

Page 30: 파이썬 TDD 101

참고 자료

• 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