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

(3 + x) / 2 ==> 3 # 변수 대입
참고 자료
• 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

Mais conteúdo relacionado

Mais procurados

Dokkuの活用と内部構造
Dokkuの活用と内部構造Dokkuの活用と内部構造
Dokkuの活用と内部構造修平 富田
 
API Testing following the Test Pyramid
API Testing following the Test PyramidAPI Testing following the Test Pyramid
API Testing following the Test PyramidElias Nogueira
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들DongMin Choi
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화NAVER D2
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기SeungYong Oh
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!pyrasis
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Scott Wlaschin
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 
사용자 스토리 기반의 스크럼
사용자 스토리 기반의 스크럼사용자 스토리 기반의 스크럼
사용자 스토리 기반의 스크럼Junyi Song
 
Spring Cloud Workshop
Spring Cloud WorkshopSpring Cloud Workshop
Spring Cloud WorkshopYongSung Yoon
 
Kubernetes Controller for Pull Request Based Environment
Kubernetes Controller for Pull Request Based EnvironmentKubernetes Controller for Pull Request Based Environment
Kubernetes Controller for Pull Request Based EnvironmentVishal Banthia
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)Heungsub Lee
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 

Mais procurados (20)

Dokkuの活用と内部構造
Dokkuの活用と内部構造Dokkuの活用と内部構造
Dokkuの活用と内部構造
 
API Testing following the Test Pyramid
API Testing following the Test PyramidAPI Testing following the Test Pyramid
API Testing following the Test Pyramid
 
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
[C++ Korea] C++ 메모리 모델과 atomic 타입 연산들
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
사용자 스토리 기반의 스크럼
사용자 스토리 기반의 스크럼사용자 스토리 기반의 스크럼
사용자 스토리 기반의 스크럼
 
Spring Cloud Workshop
Spring Cloud WorkshopSpring Cloud Workshop
Spring Cloud Workshop
 
Kubernetes Controller for Pull Request Based Environment
Kubernetes Controller for Pull Request Based EnvironmentKubernetes Controller for Pull Request Based Environment
Kubernetes Controller for Pull Request Based Environment
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 

Destaque

WzDat과 Pandas를 통한 로그 데이터 분석
WzDat과 Pandas를 통한 로그 데이터 분석WzDat과 Pandas를 통한 로그 데이터 분석
WzDat과 Pandas를 통한 로그 데이터 분석정주 김
 
Deploying flask with nginx & uWSGI
Deploying flask with nginx & uWSGIDeploying flask with nginx & uWSGI
Deploying flask with nginx & uWSGI정주 김
 
Interactive fiction
Interactive fictionInteractive fiction
Interactive fiction정주 김
 
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출 NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출 정주 김
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편준철 박
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버준철 박
 
파이썬으로 나만의 강화학습 환경 만들기
파이썬으로 나만의 강화학습 환경 만들기파이썬으로 나만의 강화학습 환경 만들기
파이썬으로 나만의 강화학습 환경 만들기정주 김
 

Destaque (7)

WzDat과 Pandas를 통한 로그 데이터 분석
WzDat과 Pandas를 통한 로그 데이터 분석WzDat과 Pandas를 통한 로그 데이터 분석
WzDat과 Pandas를 통한 로그 데이터 분석
 
Deploying flask with nginx & uWSGI
Deploying flask with nginx & uWSGIDeploying flask with nginx & uWSGI
Deploying flask with nginx & uWSGI
 
Interactive fiction
Interactive fictionInteractive fiction
Interactive fiction
 
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출 NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
 
Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편Python 게임서버 안녕하십니까 : RPC framework 편
Python 게임서버 안녕하십니까 : RPC framework 편
 
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
[NDC2017 : 박준철] Python 게임 서버 안녕하십니까 - 몬스터 슈퍼리그 게임 서버
 
파이썬으로 나만의 강화학습 환경 만들기
파이썬으로 나만의 강화학습 환경 만들기파이썬으로 나만의 강화학습 환경 만들기
파이썬으로 나만의 강화학습 환경 만들기
 

Semelhante a 파이썬 TDD 101

리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기Heo Seungwook
 
테스트 기발 개발, TBD(Test based developement)
테스트 기발 개발, TBD(Test based developement)테스트 기발 개발, TBD(Test based developement)
테스트 기발 개발, TBD(Test based developement)도형 임
 
코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기
코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기
코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기Seokjae Lee
 
아꿈사.C++ api 디자인.20140315 a
아꿈사.C++ api 디자인.20140315 a아꿈사.C++ api 디자인.20140315 a
아꿈사.C++ api 디자인.20140315 aChoonghyun Yang
 
Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기Lee Geonhee
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자KyeongWon Koo
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018devCAT Studio, NEXON
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스한 경만
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해중선 곽
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트Chanwoong Kim
 
애자일 하라
애자일 하라애자일 하라
애자일 하라진수 허
 
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)SangIn Choung
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기Wonchang Song
 
KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)
KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)
KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)Sungmin Kim
 
EMOCON 2015 - 품질과 테스트는 다르다
EMOCON 2015 - 품질과 테스트는 다르다EMOCON 2015 - 품질과 테스트는 다르다
EMOCON 2015 - 품질과 테스트는 다르다이상한모임
 
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기Ahreum Kim
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스Hee Jae Lee
 

Semelhante a 파이썬 TDD 101 (20)

리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기리펙토링 4장 테스트만들기
리펙토링 4장 테스트만들기
 
테스트 기발 개발, TBD(Test based developement)
테스트 기발 개발, TBD(Test based developement)테스트 기발 개발, TBD(Test based developement)
테스트 기발 개발, TBD(Test based developement)
 
코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기
코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기
코프링 프로젝트 투입 일주일 전: 주니어 개발자의 코틀린 도입 이야기
 
Tdd
TddTdd
Tdd
 
아꿈사.C++ api 디자인.20140315 a
아꿈사.C++ api 디자인.20140315 a아꿈사.C++ api 디자인.20140315 a
아꿈사.C++ api 디자인.20140315 a
 
Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기Python을 이용한 패키지 테스트 및 배포해보기
Python을 이용한 패키지 테스트 및 배포해보기
 
TDD or TFD
TDD or TFDTDD or TFD
TDD or TFD
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
 
Tdd
TddTdd
Tdd
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해
 
[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트[NDC17] 왓 스튜디오 서비스파트
[NDC17] 왓 스튜디오 서비스파트
 
애자일 하라
애자일 하라애자일 하라
애자일 하라
 
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기
 
KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)
KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)
KGC 2014, 'Software Enginner in Test' in Game Development (Bluehole Studio)
 
EMOCON 2015 - 품질과 테스트는 다르다
EMOCON 2015 - 품질과 테스트는 다르다EMOCON 2015 - 품질과 테스트는 다르다
EMOCON 2015 - 품질과 테스트는 다르다
 
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
 

파이썬 TDD 101

  • 1. –Kent Beck ‘내가 12살 괴짜시절에 읽었던 책이 있는데, 실제 입력 테이프를 넣었을 때 그 결과로 기대할 수 있는 출력 테이 프를 미리 타이프해 넣고, 실제 결과가 기대 결과와 같아 질 때까지 코딩하라고 제안했다. 그 책을 쓴 이름 모르는 저자에게: 고마워요, 고마워요, 고마워요.’
  • 2. – 김창준 ‘테스트를 먼저 하다니 도대체 말이나 될 법한 소리인 가? 아니 말이 된다. 그것도 아주 훌륭히.’
  • 3. 파이썬 TDD 101 for Python Korea
  • 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%에 도전!
  • 22.
  • 24. 알고리즘 풀이에 적용하자 • 알고리즘 문제 풀이는 TDD 적용이 용이한 분야 • 먼저 예시를 만족하는 풀이를 구현하고, • 다음과 같은 TC를 생각해서 테스트 하자 • 경계조건 • 퍼포먼스 측정 • 리팩토링 후 점검
  • 25. 웹 개발을 TDD로 하려면?
  • 26. TDD의 확장 • CI(Continuous Integration)툴과의 연계 • Travis CI, drone.io 등 이용 • Coveralls로 커버리지 모니터링
  • 28. Q&A “좋은 습관이 좋은 코드를 만듧니다.”
  • 29. 실습 문제: 계산기 • 한 줄씩 수식을 받아들이고, 계산 결과를 출력 1. 3 + 4 ==> 7 # 단순 계산 2. 3 + 4 / 2 ==> 5 # 연산자 우선 순위 3. (3 + 4) / 2 ==> 3 # 괄호 처리 4. x = 4
 (3 + x) / 2 ==> 3 # 변수 대입
  • 30. 참고 자료 • 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