SlideShare uma empresa Scribd logo
1 de 17
Refactoring 리팩토링 4장 테스트만들기 아꿈사http://cafe.naver.com/architect1 TTF	http://www.npteam.net
시작 ■ 리팩토링과 테스트   - 리팩토링 할 때 견고한 테스트는 필수조건이다.   - 리팩토링을 자동화하는 도구가 있더라도, 테스트는 여전히 중요하다.   - 잘 짜여진 테스트는 프로그래밍을 빠르게 한다.  - 이것은 정말 놀라운 사실이며, 많은 프로그래머들의 직관과도 반대되는 것이다.
자체 테스트 코드의 가치 ■ 대부분의 프로그래머들이 시간을 보내는 방법  - 무엇을 해야 하는지 생각한다.   - 디자인을 하느라 시간을 보낸다.   - 대부분의 시간은 디버깅을 하면서 보낸다.   - 실제로 코드를 작성하는 시간은 매우 적다.
자체 테스트 코드의 가치 ■ 자체 테스트 코드의 길로 들어선 계기   - 92년 OOPSLA에서 누군가와의 대화를 통해,   “클래스는 그 자신의 테스트를  포함하고 있어야 한다.”   - 테스트를 체계화 하는데 좋은 방법이라고 생각.     “클래스는 그 자신을 테스트하는데 사용될 수 있는 메소드를 가지고 있어야 한다.”   - 당시 점진적 개발에 관심이 많았으며, 각각의 단계가 끝날 때마다 클래스에 메소드를 추가함.
자체 테스트 코드의 가치 ■ 자체 테스트 코드의 길로 들어선 계기   - 테스트 메소드를 실행하는 것은 간단했지만, 테스트는 여전히 지루한 작업이었다.  - 화면을 모니터링 하면서 결과를 확인하는 대신, 컴퓨터가 테스트를 스스로 하도록 할 수 있다는 것을 깨달았다. 핵심 : 모든 테스트를 완전히 자동화하고, 테스트가 자신의 결과를 스스로 확인하게 하라.
자체 테스트 코드의 가치 ■ 시간을 절약하는 버그 탐지기 설치   - 테스트를 실행하는 것은 컴파일을 하는 것 만큼이나 쉬워졌다.   - 디버깅에 많은 시간을 허비하지 않게 되고, 그 시간만큼 생산성이 높아졌다.   - 버그가 생기더라도 테스트가 짧은 시간에 반복적으로 실행되기 때문에 적은 디버깅 시간을 투자하여, 버그의 원인을 찾아낼 수 있다. 핵심 : 한 벌의 테스트는 버그를 찾는데 걸리는 시간을 엄청나게 단축시키는 강력한 버그 탐지기이다.
자체 테스트 코드의 가치 ■ 테스트 작성이 쉽다(?)   - 테스트를 작성하기 위해서는 별도의 코드를 많이 작성하기 때문에 다른 사람들을 설득하기 어렵다.   - 테스트 코드를 작성하는 것이 프로그래밍을 빠르게 한다는 사실을 경험하지 못했다면, 수긍하기 어렵다.     (결국 경험하지 못하면 알기 어렵다.)   - 그나마 수작업으로 테스트하는 것보다, 자동화된 테스트를 위해 테스트를 작성하는 것은 재미있는 작업이 될 수도 있다.
자체 테스트 코드의 가치 ■ 테스트를 작성하기 좋은 시점은?   - 테스트를 작성하기 좋은 시점은  프로그래밍을 시작하기 전이다.   - 기능 추가를 위해 테스트를 먼저 작성하면, 기능 추가를 위해 무엇을 해야 할지 명확히 알 수 있다.   - 또한 구현보다는 인터페이스에 집중할 수 있다.    (이렇게 하는 것은 항상 바람직한 일이다.)  - 코딩을 완료할 명확한 지점(테스트를 통과하는 지점)을 갖게 된다.
자체 테스트 코드의 가치 ■ 테스트는 얼만큼 자주 해야 할까?   - 익스트림 프로그래밍(eXtream Programming)에서는  테스트를 자주하는 것이 매우 중요하다.   - 익스트림 프로그래머는 테스트에 대단히 열성적이고, 빠른 개발을 원하기 때문에, 테스트를 사용한다.   - 리팩토링에서는 테스트를 필요로 하고, 리팩토링을 원한다면 테스트를 작성해야 한다.   - 테스트를 전혀 안 하는 것보다는 아주 적은 테스트로도 놀랄만큼큰 이득을 얻을 수 있다.
Junit테스트 프레임워크 ■ 단위 테스트와 기능 테스트의 차이점   - 단위 테스트 ,[object Object]
하나의 패키지 내에서 패키지를 검증하는 수단
다른 패키지에 대한 인터페이스까지는 테스트하지만그 이상은 테스트 하지 않는다.  - 기능 테스트 ,[object Object]
사용자에게 확실한 품질을 제공하지만,프로그래머의 생산성은 상관하지 않는다.
기능 테스트는 전체를 하나의 블랙박스로 취급한다.,[object Object]
테스트 추가하기 ■ 결국 테스트는 버그를 잡기 위한 것   - 테스트는 문제가 생길만한 곳에 집중되어야 한다.   - 너무 많은 테스트를 작성하려다 보면, 오히려 소홀해질 수 있다.   - 적은 노력으로 큰 효과를 볼 수 있는 생산적인 테스트를하자.  - 뭔가 잘못되었을 때에는 경계조건을 생각하고, 테스트를 경계조건에 집중한다. 핵심 : “완전한 테스트”를실행하지 않는 것 보다는,       “불완전한 테스트”를 실행하는 것이 낫다.
테스트 추가하기 ■ 코드를 대하는 방식을 바꿔보자!  - 어떻게 하면 적극적으로 코드를 파괴시킬 수 있는지 생각한다.    (이렇게 생각하면 마음 상태가 생산적이고 재미있는 상태가 된다.)   - 예상되는 에러를 테스트 코드로 작성한다. 핵심 : 뭔가 잘못되리라 예상될 때 적절한 예외(Exception)가  발생하는지 테스트를 하는 것을 잊지 마라.
테스트 추가하기 ■ 테스트는 위험이 있는 곳에 집중해야 한다.  - 테스트 코드가 많다고 버그가 발생되는 것도 아니고, 너무 많은 테스트 코드를 작성하려다가  오히려 아무것도 작성하지 않게 될 위험이 있다.   - 테스트로 모든 버그를 찾을 수 없겠지만,  리팩토링을 하면 코드를 더 잘 이해하게 되고, 더 많은 버그를 찾을 수 있다.    (테스트 + 리팩토링 조합으로 버그를 찾을 수 있다.) 핵심 : 테스트로 모든 버그를 잡을 수 없다는 걱정 때문에, 대부분의 버그를 잡을 수 있는        “테스트를 작성하는 것”을멈추지 마라.

Mais conteúdo relacionado

Mais procurados

코드의 품질 (Code Quality)
코드의 품질 (Code Quality)코드의 품질 (Code Quality)
코드의 품질 (Code Quality)ChulHui Lee
 
유지보수를 고려한 SW 개발
유지보수를 고려한 SW 개발유지보수를 고려한 SW 개발
유지보수를 고려한 SW 개발도형 임
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기CONNECT FOUNDATION
 
[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스철민 신
 
클린코드와 테스트코드
클린코드와 테스트코드클린코드와 테스트코드
클린코드와 테스트코드Herren
 
Ui test 자동화하기 - Selenium + Jenkins
Ui test 자동화하기 - Selenium + JenkinsUi test 자동화하기 - Selenium + Jenkins
Ui test 자동화하기 - Selenium + JenkinsChang Hak Yeon
 
[Pl in c++] 11. chapter
[Pl in c++] 11. chapter[Pl in c++] 11. chapter
[Pl in c++] 11. chapterMinGeun Park
 
필요해서 하는 개발 자동화
필요해서 하는 개발 자동화필요해서 하는 개발 자동화
필요해서 하는 개발 자동화none
 
행복한 개발을 위한_테스트_케이스
행복한 개발을 위한_테스트_케이스행복한 개발을 위한_테스트_케이스
행복한 개발을 위한_테스트_케이스도형 임
 
사내 TDD 도입을 위한 설명 문서
사내 TDD 도입을 위한 설명 문서사내 TDD 도입을 위한 설명 문서
사내 TDD 도입을 위한 설명 문서Kim kyoung-song
 
How to Contribute to OSS
How to Contribute to OSSHow to Contribute to OSS
How to Contribute to OSSSanghyeon Seo
 
왜 Swift를 해야할까요?
왜 Swift를 해야할까요?왜 Swift를 해야할까요?
왜 Swift를 해야할까요?선협 이
 
IoT 개발자를 위한 Embedded C에서 TDD를 해보자
IoT 개발자를 위한 Embedded C에서 TDD를 해보자IoT 개발자를 위한 Embedded C에서 TDD를 해보자
IoT 개발자를 위한 Embedded C에서 TDD를 해보자Taeyeop Kim
 
TDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDDTDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDDSuwon Chae
 
프레젠테이션3
프레젠테이션3프레젠테이션3
프레젠테이션3Yoo Jaeeun
 
짝 테스트(Pair Testing) 소개와 사례
짝 테스트(Pair Testing) 소개와 사례짝 테스트(Pair Testing) 소개와 사례
짝 테스트(Pair Testing) 소개와 사례SangIn Choung
 
테스팅을위한선행조건 명세
테스팅을위한선행조건 명세테스팅을위한선행조건 명세
테스팅을위한선행조건 명세규동 최규동
 
ㅃㅃㅃㅃㅃ
ㅃㅃㅃㅃㅃㅃㅃㅃㅃㅃ
ㅃㅃㅃㅃㅃYoo Jaeeun
 

Mais procurados (20)

코드의 품질 (Code Quality)
코드의 품질 (Code Quality)코드의 품질 (Code Quality)
코드의 품질 (Code Quality)
 
유지보수를 고려한 SW 개발
유지보수를 고려한 SW 개발유지보수를 고려한 SW 개발
유지보수를 고려한 SW 개발
 
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
[부스트캠프 Tech Talk] 최재필_P 스테이지에서 Git으로 협업하기
 
[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스[AUG]개발자와 QA가 상생하는 테스트 프로세스
[AUG]개발자와 QA가 상생하는 테스트 프로세스
 
클린코드와 테스트코드
클린코드와 테스트코드클린코드와 테스트코드
클린코드와 테스트코드
 
Ui test 자동화하기 - Selenium + Jenkins
Ui test 자동화하기 - Selenium + JenkinsUi test 자동화하기 - Selenium + Jenkins
Ui test 자동화하기 - Selenium + Jenkins
 
[Pl in c++] 11. chapter
[Pl in c++] 11. chapter[Pl in c++] 11. chapter
[Pl in c++] 11. chapter
 
필요해서 하는 개발 자동화
필요해서 하는 개발 자동화필요해서 하는 개발 자동화
필요해서 하는 개발 자동화
 
행복한 개발을 위한_테스트_케이스
행복한 개발을 위한_테스트_케이스행복한 개발을 위한_테스트_케이스
행복한 개발을 위한_테스트_케이스
 
사내 TDD 도입을 위한 설명 문서
사내 TDD 도입을 위한 설명 문서사내 TDD 도입을 위한 설명 문서
사내 TDD 도입을 위한 설명 문서
 
C++과 TDD
C++과 TDDC++과 TDD
C++과 TDD
 
How to Contribute to OSS
How to Contribute to OSSHow to Contribute to OSS
How to Contribute to OSS
 
왜 Swift를 해야할까요?
왜 Swift를 해야할까요?왜 Swift를 해야할까요?
왜 Swift를 해야할까요?
 
애자일프랙티스
애자일프랙티스애자일프랙티스
애자일프랙티스
 
IoT 개발자를 위한 Embedded C에서 TDD를 해보자
IoT 개발자를 위한 Embedded C에서 TDD를 해보자IoT 개발자를 위한 Embedded C에서 TDD를 해보자
IoT 개발자를 위한 Embedded C에서 TDD를 해보자
 
TDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDDTDD&Refactoring Day 02: TDD
TDD&Refactoring Day 02: TDD
 
프레젠테이션3
프레젠테이션3프레젠테이션3
프레젠테이션3
 
짝 테스트(Pair Testing) 소개와 사례
짝 테스트(Pair Testing) 소개와 사례짝 테스트(Pair Testing) 소개와 사례
짝 테스트(Pair Testing) 소개와 사례
 
테스팅을위한선행조건 명세
테스팅을위한선행조건 명세테스팅을위한선행조건 명세
테스팅을위한선행조건 명세
 
ㅃㅃㅃㅃㅃ
ㅃㅃㅃㅃㅃㅃㅃㅃㅃㅃ
ㅃㅃㅃㅃㅃ
 

Destaque

Cruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedevCruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedevHeo Seungwook
 
리펙토링 11장 p389_p400
리펙토링 11장 p389_p400리펙토링 11장 p389_p400
리펙토링 11장 p389_p400Heo Seungwook
 
리펙토링 10장 p316_p324
리펙토링 10장 p316_p324리펙토링 10장 p316_p324
리펙토링 10장 p316_p324Heo Seungwook
 
2010 연말행사 온라인스터디
2010 연말행사 온라인스터디2010 연말행사 온라인스터디
2010 연말행사 온라인스터디Heo Seungwook
 
리팩토링 10장 p357_p369
리팩토링 10장 p357_p369리팩토링 10장 p357_p369
리팩토링 10장 p357_p369Heo Seungwook
 
리펙토링 6장 p147_p158
리펙토링 6장 p147_p158리펙토링 6장 p147_p158
리펙토링 6장 p147_p158Heo Seungwook
 
Master slave pattern
Master slave patternMaster slave pattern
Master slave patternHeo Seungwook
 
프로그램은 왜 실패하는가
프로그램은 왜 실패하는가프로그램은 왜 실패하는가
프로그램은 왜 실패하는가Heo Seungwook
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_patternHeo Seungwook
 

Destaque (11)

Cruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedevCruise control net_and_terminal_with_gamedev
Cruise control net_and_terminal_with_gamedev
 
리펙토링 11장 p389_p400
리펙토링 11장 p389_p400리펙토링 11장 p389_p400
리펙토링 11장 p389_p400
 
리펙토링 10장 p316_p324
리펙토링 10장 p316_p324리펙토링 10장 p316_p324
리펙토링 10장 p316_p324
 
2010 연말행사 온라인스터디
2010 연말행사 온라인스터디2010 연말행사 온라인스터디
2010 연말행사 온라인스터디
 
리팩토링 10장 p357_p369
리팩토링 10장 p357_p369리팩토링 10장 p357_p369
리팩토링 10장 p357_p369
 
Pac pattern
Pac patternPac pattern
Pac pattern
 
리펙토링 6장 p147_p158
리펙토링 6장 p147_p158리펙토링 6장 p147_p158
리펙토링 6장 p147_p158
 
Master slave pattern
Master slave patternMaster slave pattern
Master slave pattern
 
프로그램은 왜 실패하는가
프로그램은 왜 실패하는가프로그램은 왜 실패하는가
프로그램은 왜 실패하는가
 
Client dispatcher server_pattern
Client dispatcher server_patternClient dispatcher server_pattern
Client dispatcher server_pattern
 
Mvc pattern
Mvc patternMvc pattern
Mvc pattern
 

Semelhante a 리펙토링 4장 테스트만들기

애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)SangIn Choung
 
[H3 2012] 행복한 개발을 위한 테스트 케이스
[H3 2012] 행복한 개발을 위한 테스트 케이스[H3 2012] 행복한 개발을 위한 테스트 케이스
[H3 2012] 행복한 개발을 위한 테스트 케이스KTH, 케이티하이텔
 
[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
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스한 경만
 
testing for agile?, agile for testing
testing for agile?, agile for testingtesting for agile?, agile for testing
testing for agile?, agile for testingSangIn Choung
 
발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법SangIn Choung
 
실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)
실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)
실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)Kay Kim
 
애자일 도입과 사례 공유
애자일 도입과 사례 공유애자일 도입과 사례 공유
애자일 도입과 사례 공유agilekorea
 
『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기복연 이
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법복연 이
 
SWDeveloperStory201501
SWDeveloperStory201501SWDeveloperStory201501
SWDeveloperStory201501Suho Kwon
 
Testing & refactoring
Testing & refactoringTesting & refactoring
Testing & refactoringLim Hosung
 
버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제Kiyoung Moon
 
SWDeveloprStory201601
SWDeveloprStory201601SWDeveloprStory201601
SWDeveloprStory201601Suho Kwon
 
전통적인 개발과 테스트 주도 개발, 그리고 애자일
전통적인 개발과 테스트 주도 개발, 그리고 애자일전통적인 개발과 테스트 주도 개발, 그리고 애자일
전통적인 개발과 테스트 주도 개발, 그리고 애자일Tap ToRestart
 
Clean code chapter9
Clean code chapter9Clean code chapter9
Clean code chapter9ukjinkwoun
 
Code Review - DevOn2013
Code Review - DevOn2013Code Review - DevOn2013
Code Review - DevOn2013호정 이
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)Jay Park
 

Semelhante a 리펙토링 4장 테스트만들기 (20)

애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
애자일과 애자일 테스트 소개 (테스트기본교육 3장 2절)
 
[H3 2012] 행복한 개발을 위한 테스트 케이스
[H3 2012] 행복한 개발을 위한 테스트 케이스[H3 2012] 행복한 개발을 위한 테스트 케이스
[H3 2012] 행복한 개발을 위한 테스트 케이스
 
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
[FEConf 2018] Front-End 프로젝트의 Test code 작성경험기
 
애자일 프랙티스
애자일 프랙티스애자일 프랙티스
애자일 프랙티스
 
testing for agile?, agile for testing
testing for agile?, agile for testingtesting for agile?, agile for testing
testing for agile?, agile for testing
 
발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법
 
실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)
실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)
실전 애자일 게임 개발 (Agile Game Agile Game Development From The Trenches)
 
애자일 도입과 사례 공유
애자일 도입과 사례 공유애자일 도입과 사례 공유
애자일 도입과 사례 공유
 
TDD or TFD
TDD or TFDTDD or TFD
TDD or TFD
 
『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
SWDeveloperStory201501
SWDeveloperStory201501SWDeveloperStory201501
SWDeveloperStory201501
 
Testing & refactoring
Testing & refactoringTesting & refactoring
Testing & refactoring
 
버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제버그 트래킹 시스템 Mantis의 사용 그리고 예제
버그 트래킹 시스템 Mantis의 사용 그리고 예제
 
SWDeveloprStory201601
SWDeveloprStory201601SWDeveloprStory201601
SWDeveloprStory201601
 
전통적인 개발과 테스트 주도 개발, 그리고 애자일
전통적인 개발과 테스트 주도 개발, 그리고 애자일전통적인 개발과 테스트 주도 개발, 그리고 애자일
전통적인 개발과 테스트 주도 개발, 그리고 애자일
 
Clean code chapter9
Clean code chapter9Clean code chapter9
Clean code chapter9
 
애자일의 모든것
애자일의 모든것애자일의 모든것
애자일의 모든것
 
Code Review - DevOn2013
Code Review - DevOn2013Code Review - DevOn2013
Code Review - DevOn2013
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)
 

리펙토링 4장 테스트만들기

  • 1. Refactoring 리팩토링 4장 테스트만들기 아꿈사http://cafe.naver.com/architect1 TTF http://www.npteam.net
  • 2. 시작 ■ 리팩토링과 테스트 - 리팩토링 할 때 견고한 테스트는 필수조건이다. - 리팩토링을 자동화하는 도구가 있더라도, 테스트는 여전히 중요하다. - 잘 짜여진 테스트는 프로그래밍을 빠르게 한다. - 이것은 정말 놀라운 사실이며, 많은 프로그래머들의 직관과도 반대되는 것이다.
  • 3. 자체 테스트 코드의 가치 ■ 대부분의 프로그래머들이 시간을 보내는 방법 - 무엇을 해야 하는지 생각한다. - 디자인을 하느라 시간을 보낸다. - 대부분의 시간은 디버깅을 하면서 보낸다. - 실제로 코드를 작성하는 시간은 매우 적다.
  • 4. 자체 테스트 코드의 가치 ■ 자체 테스트 코드의 길로 들어선 계기 - 92년 OOPSLA에서 누군가와의 대화를 통해, “클래스는 그 자신의 테스트를 포함하고 있어야 한다.” - 테스트를 체계화 하는데 좋은 방법이라고 생각. “클래스는 그 자신을 테스트하는데 사용될 수 있는 메소드를 가지고 있어야 한다.” - 당시 점진적 개발에 관심이 많았으며, 각각의 단계가 끝날 때마다 클래스에 메소드를 추가함.
  • 5. 자체 테스트 코드의 가치 ■ 자체 테스트 코드의 길로 들어선 계기 - 테스트 메소드를 실행하는 것은 간단했지만, 테스트는 여전히 지루한 작업이었다. - 화면을 모니터링 하면서 결과를 확인하는 대신, 컴퓨터가 테스트를 스스로 하도록 할 수 있다는 것을 깨달았다. 핵심 : 모든 테스트를 완전히 자동화하고, 테스트가 자신의 결과를 스스로 확인하게 하라.
  • 6. 자체 테스트 코드의 가치 ■ 시간을 절약하는 버그 탐지기 설치 - 테스트를 실행하는 것은 컴파일을 하는 것 만큼이나 쉬워졌다. - 디버깅에 많은 시간을 허비하지 않게 되고, 그 시간만큼 생산성이 높아졌다. - 버그가 생기더라도 테스트가 짧은 시간에 반복적으로 실행되기 때문에 적은 디버깅 시간을 투자하여, 버그의 원인을 찾아낼 수 있다. 핵심 : 한 벌의 테스트는 버그를 찾는데 걸리는 시간을 엄청나게 단축시키는 강력한 버그 탐지기이다.
  • 7. 자체 테스트 코드의 가치 ■ 테스트 작성이 쉽다(?) - 테스트를 작성하기 위해서는 별도의 코드를 많이 작성하기 때문에 다른 사람들을 설득하기 어렵다. - 테스트 코드를 작성하는 것이 프로그래밍을 빠르게 한다는 사실을 경험하지 못했다면, 수긍하기 어렵다. (결국 경험하지 못하면 알기 어렵다.) - 그나마 수작업으로 테스트하는 것보다, 자동화된 테스트를 위해 테스트를 작성하는 것은 재미있는 작업이 될 수도 있다.
  • 8. 자체 테스트 코드의 가치 ■ 테스트를 작성하기 좋은 시점은? - 테스트를 작성하기 좋은 시점은 프로그래밍을 시작하기 전이다. - 기능 추가를 위해 테스트를 먼저 작성하면, 기능 추가를 위해 무엇을 해야 할지 명확히 알 수 있다. - 또한 구현보다는 인터페이스에 집중할 수 있다. (이렇게 하는 것은 항상 바람직한 일이다.) - 코딩을 완료할 명확한 지점(테스트를 통과하는 지점)을 갖게 된다.
  • 9. 자체 테스트 코드의 가치 ■ 테스트는 얼만큼 자주 해야 할까? - 익스트림 프로그래밍(eXtream Programming)에서는 테스트를 자주하는 것이 매우 중요하다. - 익스트림 프로그래머는 테스트에 대단히 열성적이고, 빠른 개발을 원하기 때문에, 테스트를 사용한다. - 리팩토링에서는 테스트를 필요로 하고, 리팩토링을 원한다면 테스트를 작성해야 한다. - 테스트를 전혀 안 하는 것보다는 아주 적은 테스트로도 놀랄만큼큰 이득을 얻을 수 있다.
  • 10.
  • 11. 하나의 패키지 내에서 패키지를 검증하는 수단
  • 12.
  • 13. 사용자에게 확실한 품질을 제공하지만,프로그래머의 생산성은 상관하지 않는다.
  • 14.
  • 15. 테스트 추가하기 ■ 결국 테스트는 버그를 잡기 위한 것 - 테스트는 문제가 생길만한 곳에 집중되어야 한다. - 너무 많은 테스트를 작성하려다 보면, 오히려 소홀해질 수 있다. - 적은 노력으로 큰 효과를 볼 수 있는 생산적인 테스트를하자. - 뭔가 잘못되었을 때에는 경계조건을 생각하고, 테스트를 경계조건에 집중한다. 핵심 : “완전한 테스트”를실행하지 않는 것 보다는, “불완전한 테스트”를 실행하는 것이 낫다.
  • 16. 테스트 추가하기 ■ 코드를 대하는 방식을 바꿔보자! - 어떻게 하면 적극적으로 코드를 파괴시킬 수 있는지 생각한다. (이렇게 생각하면 마음 상태가 생산적이고 재미있는 상태가 된다.) - 예상되는 에러를 테스트 코드로 작성한다. 핵심 : 뭔가 잘못되리라 예상될 때 적절한 예외(Exception)가 발생하는지 테스트를 하는 것을 잊지 마라.
  • 17. 테스트 추가하기 ■ 테스트는 위험이 있는 곳에 집중해야 한다. - 테스트 코드가 많다고 버그가 발생되는 것도 아니고, 너무 많은 테스트 코드를 작성하려다가 오히려 아무것도 작성하지 않게 될 위험이 있다. - 테스트로 모든 버그를 찾을 수 없겠지만, 리팩토링을 하면 코드를 더 잘 이해하게 되고, 더 많은 버그를 찾을 수 있다. (테스트 + 리팩토링 조합으로 버그를 찾을 수 있다.) 핵심 : 테스트로 모든 버그를 잡을 수 없다는 걱정 때문에, 대부분의 버그를 잡을 수 있는 “테스트를 작성하는 것”을멈추지 마라.
  • 18. 테스트 추가하기 ■ 객체의 상속성과 다형성은 테스트를 어렵게 한다. - 테스트할 조합이 많다. - 모든 조합을 테스트하기보다, 독립적인 모듈에 대한 테스트를 한다. - 모든 버그를 잡기 위해 오랜 시간을 보내는 것보다, 대부분의 버그를 잡기 위해 합당한 시간을 보내는 것이 낫다.
  • 19. 결론 좋은 버그 탐지기를 만들고 자주 실행해라. 이것은 어느 개발에서나 훌륭한 도구이고, 리팩토링을 하기 위한 필수조건이다.