SlideShare a Scribd company logo
1 of 26
Mock Object 소개 2011.04.11 원종필
TDD? Mock? Q : ……한 경우에 TDD를 어떻게 적용하면 좋을 까요? 				A : Mock을 쓰세요.                                  Mock을 쓰면해결 할 수 있어요. Mock은 또 뭐???
목차 ,[object Object]
 Mock Object 사용 예
언제 Mock Object를 만들 것 인가?
 Mock 분류
 Test Double 살펴보기
 Mock Framework 사용 유의사항,[object Object]
Mock Object 사용 예(1/3) UserRegister를 구현, User 암호 저장 기능에 대한 테스트 class UserRegister { public: UserRegister() {}; 	~UserRegister() {}; void SavePassword(const std::string& user_id, const std::string& user_pwd) 	{ user_pwd_table_[user_id] = user_pwd; 	} std::string GetPassword(const std::string& user_id) 	{ 		std::map<std::string, std::string>::iterator it = user_pwd_table_.find(user_id); 		assert(it != user_pwd_table_.end()); 		return it->second; 	} private: 	std::map<std::string, std::string> user_pwd_table_; }; TEST(PasswordTest, password_ciper_test) { UserRegister* user_register = new UserRegister(); 	std::string user_id = "aether"; 	std::string user_pwd = "potato"; user_register->SavePassword(user_id, user_pwd); 	EXPECT_EQ(user_pwd, user_register->GetPassword(user_id)); } 테스트 성공!!
Mock Object 사용 예(2/3) 요구 사항 – 사용자 암호는 반드시 암호화한 다음에 저장해야 한다 class Cipher { public: 	Cipher(); 	~Cipher(); 	virtual std::string Encryption(const std::string& source)=0; 	virtual std::string Decryption(const std::string& source)=0; }; MD5 기반으로 다른 개발자가 독립적으로  구현하기로.. TEST(PasswordTest, password_ciper_test) { UserRegister* user_register = new UserRegister(); // Ciper* ciper = ... 이거 만들어주면되는데.. 	std::string user_id = "aether"; 	std::string user_pwd = "potato"; user_register->SavePassword(user_id, cipher->Encryption(user_pwd)); 	std::string decripted_pwd = cipher->Decryption(user_register->GetPassword(user_id)); 	EXPECT_EQ(user_pwd, decripted_pwd); } 테스트 코드를 통과시켜야 하는데...............  다른 개발자가 MD5를 기반으로 Cipher를 만들어 줄 때까지 기다려야 하는가?
Mock Object 사용 예(3/3) MD5Cipher처럼 보이는 객체를 만들어서 사용하자. class MockMD5Cipher : public Cipher { public: 	MockMD5Cipher()	{}; 	~MockMD5Cipher()	{}; virtual std::string Encryption(const std::string& source)  	{  		return "8ee2027983915ec78acc45027d874316“; 	} 	virtual std::string Decryption(const std::string& source) 	{ return "potato“; } }; TEST(PasswordTest, password_ciper_test) { UserRegister* user_register = new UserRegister(); Cipher* cipher = new MockMD5Cipher(); 	std::string user_id = "aether"; 	std::string user_pwd = "potato"; user_register->SavePassword(user_id, cipher->Encryption(user_pwd)); 	std::string decripted_pwd = cipher->Decryption(user_register->GetPassword(user_id)); 	EXPECT_EQ(user_pwd, decripted_pwd); } MockMD5Cipher의 구현자체는 임시적이겠지만, 정말 구현하려고 하는  SavePassword기능을 테스트 케이스로 만들기에는 충분한 코드이다.
언제 Mock Object를 만들 것인가? 모듈이 가진 의존성이 근본적인 원인 모듈이 필요로 하는 의존성은 테스트 작성을 어렵게 만든다.
언제 Mock Object를 만들 것인가? 1. 테스트 작성을 위한 환경 구축이 어려울 때 ,[object Object]
사용하고 있는 DB와 다른 DB를 설치해야만 테스트가 가능한 경우
특정 모듈을 아직 갖고 있지 않아서 테스트 환경을 구축하지 못할 때
아직 모듈 개발이 완료되지 않았거나 심각한 버그가 있는 경우2. 테스트가 특정 경우나 순간에 의존적일 때 ,[object Object]
테스트 할 때마다 원하는 만큼의 네트워크 지연을 만들기 위해수동적으로 환경을 조성하기에는 노력이 많이 든다.,[object Object]
xUnit Test Patterns의 저자 제라드메스자로스(Gerard Meszaros)가용어를 만들고, 분류하여 사용하기 시작함.
많은 개발자들이 좀 더 포괄적이고 보편적인 개념으로   Mock이라는 단어를 사용하고있지만, 분류법은 알아둘 만함.,[object Object]
테스트 대역(Test Double) 하나씩 살펴보기
예제 설명 class Item { public: 	Item()	{}; virtual ~Item()	{}; virtual std::string GetName() = 0; 	virtual boolIsValid() = 0; 	virtual boolIsAppliable(Actor* actor) = 0; 	virtual intGetPrice() = 0; 	virtual intGetDiscountPrice() = 0; }; Actor에 Item 추가 기능 구현  - Item은 인터페이스 논의만 된 상태 class Actor { public: 	Actor(const std::string actor_name)	{}; 	~Actor()	{}; void AddItem(Item* item) { item_list_.push_back(item); } intGetTotalItemCount() { return item_list_.size(); } private: 	std::list<Item*> item_list_; }; TEST(TestDouble, test_double_dummy_object) { 	Actor* actor = new Actor("Warrior");	 	EXPECT_EQ(0, actor->GetTotalItemCount()); //Item* item =  	actor->AddItem(item); 	EXPECT_EQ(1, actor->GetTotalItemCount()); }
더미 객체(Dummy Object) 더미 객체는 말 그대로 모조품, 단순한 껍데기에 해당한다 class DummyItem : public Item { public: DummyItem()  {}; 	~DummyItem() {}; 	virtual std::string GetName()  {  		assert(false);  		return "";  } 	virtual boolIsValid()  {  		assert(false);  		return false;  } 	virtual boolIsAppliable(Actor* actor)  {  		assert(false);  		return false;  } 	virtual intGetPrice() {  		assert(false);  		return -1;  } 	virtual intGetDiscountPrice()  {  		assert(false);  		return -1;  } }; TEST(TestDouble, test_double_dummy_object) { 	Actor* actor = new Actor("Warrior");	 	EXPECT_EQ(0, actor->GetTotalItemCount()); 	Item* item = new DummyItem(); 	actor->AddItem(item); 	EXPECT_EQ(1, actor->GetTotalItemCount()); } ,[object Object]
더미 객체의 메소드가 호출 됐을 때의 동작은 보장하지 않는다.
테스트 과정에서 메소드 호출이 필요한 경우더미보다 좀더 발전된 객체를 사용해야 한다,[object Object]
하드 코딩되어 있기 때문에 로직이들어가는 부분은 테스트 할 수 없다,[object Object]
적절한 수준에서 구현을 접고, 필요 시  Mock 프레임워크를 사용해라.,[object Object]

More Related Content

What's hot

Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
Python 테스트 시작하기
Python 테스트 시작하기Python 테스트 시작하기
Python 테스트 시작하기Hosung Lee
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증dagri82
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블YongEun Choi
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
Python Unittest
Python UnittestPython Unittest
Python Unittest명규 최
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초진수 정
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
JUnit 지원 라이브러리 소개
JUnit 지원 라이브러리 소개JUnit 지원 라이브러리 소개
JUnit 지원 라이브러리 소개Hyunil Shin
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기Heo Seungwook
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 

What's hot (20)

Javascript
JavascriptJavascript
Javascript
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Python 테스트 시작하기
Python 테스트 시작하기Python 테스트 시작하기
Python 테스트 시작하기
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
3-1. css
3-1. css3-1. css
3-1. css
 
Python Unittest
Python UnittestPython Unittest
Python Unittest
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
Java lambda
Java lambdaJava lambda
Java lambda
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Java class
Java classJava class
Java class
 
JUnit 지원 라이브러리 소개
JUnit 지원 라이브러리 소개JUnit 지원 라이브러리 소개
JUnit 지원 라이브러리 소개
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 

Similar to [2011 04 11]mock_object 소개

[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowRyan Park
 
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...Ryan Park
 
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Ji Ung Lee
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
Naver api for android
Naver api for androidNaver api for android
Naver api for androidSangon Lee
 
Android UI Test (Espresso/Kakao)
Android UI Test (Espresso/Kakao)Android UI Test (Espresso/Kakao)
Android UI Test (Espresso/Kakao)MDLicht
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례SangIn Choung
 
자바스크립트 패턴 3장
자바스크립트 패턴 3장자바스크립트 패턴 3장
자바스크립트 패턴 3장Software in Life
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDSuwon Chae
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개Dong Jun Kwon
 
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It종빈 오
 
Design patterns
Design patternsDesign patterns
Design patternsdf
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장tedypicker
 
Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018KyungHo Jung
 

Similar to [2011 04 11]mock_object 소개 (20)

[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And How
 
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
[IT기술칼럼#2] 고급자바스크립트 for AngularJS, React_고급자바스크립트,AngularJS,React전문교육학원
 
Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
Naver api for android
Naver api for androidNaver api for android
Naver api for android
 
Android UI Test (Espresso/Kakao)
Android UI Test (Espresso/Kakao)Android UI Test (Espresso/Kakao)
Android UI Test (Espresso/Kakao)
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례
 
W14 chap13
W14 chap13W14 chap13
W14 chap13
 
자바스크립트 패턴 3장
자바스크립트 패턴 3장자바스크립트 패턴 3장
자바스크립트 패턴 3장
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDD
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
 
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
 
Design patterns
Design patternsDesign patterns
Design patterns
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
 
Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018
 

More from Jong Pil Won

[2012 11 12]애자일 회고
[2012 11 12]애자일 회고[2012 11 12]애자일 회고
[2012 11 12]애자일 회고Jong Pil Won
 
[2012 03 17]clean_code 14장 점진적개선
[2012 03 17]clean_code 14장 점진적개선[2012 03 17]clean_code 14장 점진적개선
[2012 03 17]clean_code 14장 점진적개선Jong Pil Won
 
파이썬3프로그래밍 2장 2003
파이썬3프로그래밍 2장 2003파이썬3프로그래밍 2장 2003
파이썬3프로그래밍 2장 2003Jong Pil Won
 
[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장Jong Pil Won
 
[2012 02 03]clean_code 4장
[2012 02 03]clean_code 4장[2012 02 03]clean_code 4장
[2012 02 03]clean_code 4장Jong Pil Won
 
[2012 01 28]cleancode 3장
[2012 01 28]cleancode 3장[2012 01 28]cleancode 3장
[2012 01 28]cleancode 3장Jong Pil Won
 
[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장Jong Pil Won
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어Jong Pil Won
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어Jong Pil Won
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어Jong Pil Won
 
[2011 04 30]python-3장
[2011 04 30]python-3장[2011 04 30]python-3장
[2011 04 30]python-3장Jong Pil Won
 
Tdd 실습&나머지
Tdd 실습&나머지Tdd 실습&나머지
Tdd 실습&나머지Jong Pil Won
 
10장 동기부여와훈련 경험
10장 동기부여와훈련 경험10장 동기부여와훈련 경험
10장 동기부여와훈련 경험Jong Pil Won
 

More from Jong Pil Won (14)

[2012 11 12]애자일 회고
[2012 11 12]애자일 회고[2012 11 12]애자일 회고
[2012 11 12]애자일 회고
 
[2012 03 17]clean_code 14장 점진적개선
[2012 03 17]clean_code 14장 점진적개선[2012 03 17]clean_code 14장 점진적개선
[2012 03 17]clean_code 14장 점진적개선
 
파이썬3프로그래밍 2장 2003
파이썬3프로그래밍 2장 2003파이썬3프로그래밍 2장 2003
파이썬3프로그래밍 2장 2003
 
[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장[2012 02 03]clean_code 5장
[2012 02 03]clean_code 5장
 
[2012 02 03]clean_code 4장
[2012 02 03]clean_code 4장[2012 02 03]clean_code 4장
[2012 02 03]clean_code 4장
 
[2012 01 28]cleancode 3장
[2012 01 28]cleancode 3장[2012 01 28]cleancode 3장
[2012 01 28]cleancode 3장
 
[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장[2012 01 28]cleancode 1장
[2012 01 28]cleancode 1장
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
 
[2011 05 21] 4장 제어
[2011 05 21] 4장 제어[2011 05 21] 4장 제어
[2011 05 21] 4장 제어
 
[2011 04 30]python-3장
[2011 04 30]python-3장[2011 04 30]python-3장
[2011 04 30]python-3장
 
Tdd 마무리
Tdd 마무리Tdd 마무리
Tdd 마무리
 
Tdd 실습&나머지
Tdd 실습&나머지Tdd 실습&나머지
Tdd 실습&나머지
 
10장 동기부여와훈련 경험
10장 동기부여와훈련 경험10장 동기부여와훈련 경험
10장 동기부여와훈련 경험
 

[2011 04 11]mock_object 소개

  • 1. Mock Object 소개 2011.04.11 원종필
  • 2. TDD? Mock? Q : ……한 경우에 TDD를 어떻게 적용하면 좋을 까요? A : Mock을 쓰세요. Mock을 쓰면해결 할 수 있어요. Mock은 또 뭐???
  • 3.
  • 4. Mock Object 사용 예
  • 5. 언제 Mock Object를 만들 것 인가?
  • 7. Test Double 살펴보기
  • 8.
  • 9. Mock Object 사용 예(1/3) UserRegister를 구현, User 암호 저장 기능에 대한 테스트 class UserRegister { public: UserRegister() {}; ~UserRegister() {}; void SavePassword(const std::string& user_id, const std::string& user_pwd) { user_pwd_table_[user_id] = user_pwd; } std::string GetPassword(const std::string& user_id) { std::map<std::string, std::string>::iterator it = user_pwd_table_.find(user_id); assert(it != user_pwd_table_.end()); return it->second; } private: std::map<std::string, std::string> user_pwd_table_; }; TEST(PasswordTest, password_ciper_test) { UserRegister* user_register = new UserRegister(); std::string user_id = "aether"; std::string user_pwd = "potato"; user_register->SavePassword(user_id, user_pwd); EXPECT_EQ(user_pwd, user_register->GetPassword(user_id)); } 테스트 성공!!
  • 10. Mock Object 사용 예(2/3) 요구 사항 – 사용자 암호는 반드시 암호화한 다음에 저장해야 한다 class Cipher { public: Cipher(); ~Cipher(); virtual std::string Encryption(const std::string& source)=0; virtual std::string Decryption(const std::string& source)=0; }; MD5 기반으로 다른 개발자가 독립적으로 구현하기로.. TEST(PasswordTest, password_ciper_test) { UserRegister* user_register = new UserRegister(); // Ciper* ciper = ... 이거 만들어주면되는데.. std::string user_id = "aether"; std::string user_pwd = "potato"; user_register->SavePassword(user_id, cipher->Encryption(user_pwd)); std::string decripted_pwd = cipher->Decryption(user_register->GetPassword(user_id)); EXPECT_EQ(user_pwd, decripted_pwd); } 테스트 코드를 통과시켜야 하는데............... 다른 개발자가 MD5를 기반으로 Cipher를 만들어 줄 때까지 기다려야 하는가?
  • 11. Mock Object 사용 예(3/3) MD5Cipher처럼 보이는 객체를 만들어서 사용하자. class MockMD5Cipher : public Cipher { public: MockMD5Cipher() {}; ~MockMD5Cipher() {}; virtual std::string Encryption(const std::string& source) { return "8ee2027983915ec78acc45027d874316“; } virtual std::string Decryption(const std::string& source) { return "potato“; } }; TEST(PasswordTest, password_ciper_test) { UserRegister* user_register = new UserRegister(); Cipher* cipher = new MockMD5Cipher(); std::string user_id = "aether"; std::string user_pwd = "potato"; user_register->SavePassword(user_id, cipher->Encryption(user_pwd)); std::string decripted_pwd = cipher->Decryption(user_register->GetPassword(user_id)); EXPECT_EQ(user_pwd, decripted_pwd); } MockMD5Cipher의 구현자체는 임시적이겠지만, 정말 구현하려고 하는 SavePassword기능을 테스트 케이스로 만들기에는 충분한 코드이다.
  • 12. 언제 Mock Object를 만들 것인가? 모듈이 가진 의존성이 근본적인 원인 모듈이 필요로 하는 의존성은 테스트 작성을 어렵게 만든다.
  • 13.
  • 14. 사용하고 있는 DB와 다른 DB를 설치해야만 테스트가 가능한 경우
  • 15. 특정 모듈을 아직 갖고 있지 않아서 테스트 환경을 구축하지 못할 때
  • 16.
  • 17.
  • 18. xUnit Test Patterns의 저자 제라드메스자로스(Gerard Meszaros)가용어를 만들고, 분류하여 사용하기 시작함.
  • 19.
  • 20. 테스트 대역(Test Double) 하나씩 살펴보기
  • 21. 예제 설명 class Item { public: Item() {}; virtual ~Item() {}; virtual std::string GetName() = 0; virtual boolIsValid() = 0; virtual boolIsAppliable(Actor* actor) = 0; virtual intGetPrice() = 0; virtual intGetDiscountPrice() = 0; }; Actor에 Item 추가 기능 구현 - Item은 인터페이스 논의만 된 상태 class Actor { public: Actor(const std::string actor_name) {}; ~Actor() {}; void AddItem(Item* item) { item_list_.push_back(item); } intGetTotalItemCount() { return item_list_.size(); } private: std::list<Item*> item_list_; }; TEST(TestDouble, test_double_dummy_object) { Actor* actor = new Actor("Warrior"); EXPECT_EQ(0, actor->GetTotalItemCount()); //Item* item = actor->AddItem(item); EXPECT_EQ(1, actor->GetTotalItemCount()); }
  • 22.
  • 23. 더미 객체의 메소드가 호출 됐을 때의 동작은 보장하지 않는다.
  • 24.
  • 25.
  • 26.
  • 27. 아주 특수한 경우를 제외하고 잘 쓰이지않는다. 필요한 경우 Mock 프레임워크를이용하는 것이 더 간편함.
  • 28. Mock 프레임워크에서대부분 기본 제공한다.class SpyItem : public Item { SpyItem() { appliable_state_list_.push_back(Actor::kDeath); appliable_state_list_.push_back(Actor::kZombie); }; virtual boolIsAppliable(Actor* actor) { Actor::ActorStateactor_state = actor->GetActorState(); std::list<Actor::ActorState>::iterator it = std::find(appliable_state_list_.begin(),appliable_state_list_.end(), actor_state); is_appliable_call_count ++; if(it != appliable_state_list_.end()) { … } IntGetAppliableCallCount() { return is_appliable_call_count ++; } TEST(TestDouble, test_double_test_spy) { Actor* actor = new Actor("Warrior"); EXPECT_EQ(0, actor->GetTotalItemCount()); actor->SetActorState(Actor::kDeath); Item* item = new SpyItem(); EXPECT_EQ(true, actor->UseItem(item)); intmethod_call_count = ((SpyItem*)item)->GetAppliableCallCount(); EXPECT_EQ(1, method_call_count); }
  • 29.
  • 30. 테스트 대상 클래스의 메소드를 호출하고, 그 결과값과예상 값을 비교하는 방법입력A MethodA ?? 결과 값 예상 값
  • 31.
  • 32. 올바른 로직 수행 판단의 근거로 특정한 동작의 수행여부를이용한다.
  • 33. 리턴 값을 확인하는 것만으로는 예상대로 동작했음을보증하기 어려운 경우에 사용한다입력A 입력B 실행 MethodA MethodB MethodA MethodB
  • 34.
  • 35. 대표적인 C++ Mock 프레임워크
  • 36. Google MockTEST(TestDouble, test_double_gmock_test) { Actor* actor = new Actor("Warrior"); EXPECT_EQ(0, actor->GetTotalItemCount()); MockItem* item = new MockItem(); EXPECT_CALL(*item, IsAppliable(actor)) .Times(::testing::AtLeast(2)) .WillOnce(::testing::Return(true)) .WillOnce(::testing::Return(false)); EXPECT_EQ(true, actor->UseItem(item)); EXPECT_EQ(false, actor->UseItem(item)); } classMockItem: public Item { public: MockItem() {}; virtual ~MockItem() {}; MOCK_METHOD0(GetName, std::string()); MOCK_METHOD0(IsValid, bool()); MOCK_METHOD1(IsAppliable, bool(Actor*)); MOCK_METHOD0(GetPrice, int()); };
  • 37.
  • 38.
  • 39.
  • 40. 한번 Mock 프레임워크를 사용하면 해당 테스트 케이스를유지하는데 지속적인 비용이 발생한다.
  • 41.
  • 42.
  • 44.
  • 45. END