googletest 환경 구축

 

 

안녕하세요. moltak입니다. 오늘은 TDD를 사용하기 위한 Google C++ Testing Frameworks를 설치해보고 예제를 돌려보겠습니다.

 

 

C++ Unit Test Framework는 굉장히 많습니다. JAVA는 JUnit과 Hamcrest라는 Framework 많이 사용하더군요. 하지만 C++은 언뜻 봐도 굉장히 많습니다. 저는 C++의 모든 Test Framework를 사용해본 것은 아닙니다. 그렇다고 Google Framework가 아주 좋다는 것도 아닙니다. 다만 사용하기 쉽고 굉장히 직관적이었습니다. (다른 Framework도 그런지는 모르겠네요. )

 

 

잔소리는 여기까지 하고 일단 사용해보도록 하겠습니다.

 

 

구글 Framework 또한 다른 라이브러리와 마찬가지로 아래 순서를 따르게 됩니다. 하나 하나 보도록 하죠.

1. Downloads

2. 설치

3. Visual Studio 설정

4. 사용하기

 

 

1. Downloads : : http://code.google.com/p/googletest/ 에 들어가서 상단에 Downloads 탭을 선택한 후 윈도우 버전 다운로드.

Figure 1 google test downloads

 

 

2. 설치 : 자신이 원하는 폴더에 압축해제. 그 후 gtest\msvc 폴더에 가서 gtest.sln 파일을 더블 클릭.

만약 버전이 안 맞아서 솔루션 파일을 변경해야 할 경우 .vcproj(프로젝트 파일)의 읽기 전용 속성을 해제하세요.

그 후 해당 솔루션을 컴파일 합니다.

 

 

3. VS 설정

VS2005~2008 : 도구->옵션->프로젝트 및 솔루션->VC++ 디렉터리

VS2010 : 프로젝트 옵션에서 설정해야 합니다.

포함 파일과 라이브러리 파일 경로 설정.

  • 포함파일에 \include 경로 설정
  • 라이브러리 파일에 \msvc\gtest\debug 경로 설정

Figure 2 Visual Studio Setting

 

 

위 그림처럼 하시면 됩니다.

 

Google Testing Framework는 런타임 라이브러리가 다중 스레드 디버그(/MTd) 이기 때문에 우리의 프로젝트 설정도 위 처럼 바꿔 줘야 합니다.

 

프로젝트 설정 -> 구성 속성 -> C++ -> 코드 생성 -> 런타임 라이브러리 -> 다중 스레드 디버그(/MTd)

Figure 3 런타임 라이브러리 변경

 

 

그 후 라이브러리 링크

 

이렇게 하시면 기본적인 설정 방법은 끝이 났습니다. 다른 라이브러리와 사용법이 같기 때문에 쉽게 하셨을 것 같네요.

 

 

4. 사용

이제 진짜로 사용해보도록 하죠.

 

문법은 위 그림과 같습니다. (http://soupim.tistory.com/48 참조)

사용 하실 때는 아래 소스처럼 하시면 쉽게 사용이 가능하십니다.

 

 

Figure 4 사용 예제 소스

 

 

저는 Test Fixtures를 사용해서 테스트를 수행하곤 하는데요. 이 방법이 Java나 다른 책에서 설명하는 TDD기법과 아주 유사합니다.

 

Figure 5 Test Fixtures 사용 예제

 

 

여러분들도 위 방법을 사용해서 테스트를 수행해보세요. 그리고 테스트 이름은 한글로 하는 것이 좋다고 하더라고요. (채수원 : 고품질 쾌속개발을 위한 TDD 실천법과 도구(한빛미디어))

위 책을 보고 있는데요. 상당히 좋습니다.

 

Figure 6 실행 화면

 

 

5. 정리

이렇게 해서 Google Testing Framework 설치와 사용법이 설명이 끝났습니다. 많이 사용해 보시고 저한테도 알려주셨으면 감사하겠습니다. ^^

그리고 Google Test UI도 있는데요. 아래 경로로 찾아 들어가시면 됩니다.

Figure 7 Google Test UI

 

 

위 손가락 위치에 가시면 다운 받으실 수 있습니다. 상당히 보기 편하더라고요. 다른 Unit Test 툴처럼. 하지만 저만 그런지는 모르겠으나. 굉장히 느립니다. 5초 이상 걸리는 것 같습니다. 다른 분들도 한번씩 사용해 보세요. 더 보기 좋답니다. ^^

 

 

이만 마치도록 하겠습니다.

 

Bloger : moltak.net

이것보다 더 좋은 ListCtrl 사용법은 없을 듯 싶네요!!

1. 리스트컨트롤 추가 

2. 멤버변수 추가 
m_list 

3. 체크박스 레이아웃 
m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES ); 

4. 초기화 
m_list.DeleteAllItems(); 

5. 칼럼명 설정 
m_list.InsertColumn(0, _T("번호"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(1, _T("제목"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(2, _T("작성자"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(3, _T("코멘트"), LVCFMT_LEFT, 100, -1); 
m_list.InsertColumn(4, _T("파일"), LVCFMT_LEFT, 100, -1); 
//칼럼 추가 인덱스, 칼람명, 정렬방향, 칼럼길이, 서브아이템 갯수 

6. 데이터 추가 
int seq = 0; 
CString seq_string; 
seq_string.Format(_T("%d"),seq); 
CString title=_T("test"); 
CString writer=_T("이대한"); 
CString comment=_T("없음"); 
CString file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 

seq = 1; 
seq_string.Format(_T("%d"),seq); 
title=_T("test2"); 
writer=_T("이대한2"); 
comment=_T("있음"); 
file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 


7. 아이템 선택(1개 이상 선택 및 확인) 
POSITION pos = m_list.GetFirstSelectedItemPosition(); 

if (pos == NULL) 
AfxMessageBox(_T("No items were selected!\n")); 
else 
{ 
while (pos) 
{ 
int nItem = m_list.GetNextSelectedItem(pos); 
CString temp = m_list.GetItemText(nItem,0); 
temp.Format(_T("%s seq가 선택됨"),temp); 
AfxMessageBox(temp); 


// you could do your own processing on nItem here 
} 
} 


8. 체크박스 전체 체크 
int nCount=m_list.GetItemCount(); 
for(int i = 0; i< nCount;i++) 
m_list.SetCheck(i); 

9. 체크박스 전체 해제 
//헤더파일에 
#ifdef ListView_SetCheckState 
#define ListView_SetCheckState(hwndLV,i,fCheck) \ 
ListView_SetItemState(hwndLV,i, \ 
INDEXTOSTATEIMAGEMASK((fCheck)+1),LVIS_STATEIMAGEMASK) 
#endif 

//소스파일에 
CListCtrl* tmp; 
tmp=&m_list; 
int nCount=m_list.GetItemCount(); 
for(int i = 0; i< nCount;i++) 
ListView_SetCheckState(tmp->GetSafeHwnd(),i,FALSE); 

10. 체크 확인(1개 이상) 
int nCount=m_list.GetItemCount(); 
for(int i =0 ; i
{ 
BOOL a = m_list.GetCheck(i); 
if(a==TRUE) 
{ 
CString temp = m_list.GetItemText(i,0); 
temp.Format(_T("%s seq가 선택됨"),temp); 
AfxMessageBox(temp); 
} 
} 



11. 데이터 삽입 
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. 
int seq = 0; 
CString seq_string; 
seq_string.Format(_T("%d"),seq); 
CString title=_T("test"); 
CString writer=_T("이대한"); 
CString comment=_T("없음"); 
CString file=_T("파일경로"); 

m_list.InsertItem(seq,seq_string); 
m_list.SetItem(seq,1,LVIF_TEXT,title,0,0,0,NULL); 
m_list.SetItem(seq,2,LVIF_TEXT,writer,0,0,0,NULL); 
m_list.SetItem(seq,3,LVIF_TEXT,comment,0,0,0,NULL); 
m_list.SetItem(seq,4,LVIF_TEXT,file,0,0,0,NULL); 


12. 데이터 삭제 
POSITION pos = m_list.GetFirstSelectedItemPosition(); 

if (pos == NULL) 
AfxMessageBox(_T("No items were selected!\n")); 
else 
{ 
while (pos) 
{ 
int nItem = m_list.GetNextSelectedItem(pos); 
CString temp = m_list.GetItemText(nItem,0); 
temp.Format(_T("%s seq가 삭제됨"),temp); 
AfxMessageBox(temp); 
m_list.DeleteItem(nItem); 
// you could do your own processing on nItem here 
} 
} 

'NativeCode > mfc' 카테고리의 다른 글

MySQL C++, MFC에서 사용하기  (0) 2010.06.17
CDC 글 쓰기  (0) 2010.03.18
Font 바꾸기  (0) 2010.03.18
CFile  (0) 2010.03.18
Modal Vs Modless  (0) 2010.03.18

stl의 find와 sort를 사용하기란 함수 객체를 모르는 상태에서는 조금 어렵습니다.

함수 객체는 말 그대로 "함수이면서 객체" 입니다.

함수이면서 객체인 것은 어떤 것이 있을까요? 아래 코드를 보면 쉽게 알 수 있습니다.

(참조: http://www.hanb.co.kr/network/view.html?bi_id=1626 )

 

 

구조체 안에 함수를 담으면 함수 객체이냐고?? 일단은 그렇게 생각하세요. 그게 쉽습니다.

 

자 이제 그럼 stl::find()와 stl::sort()를 사용해 보도록 하겠습니다. 사용법은 위 함수객체만 안다면 너무나 쉽습니다.

아, 한가지 덧 붙이자면 find는 정수 같은 것은 바로 찾을 수 있지만 "사용자 정의 데이터 타입"은 find를 할 수 없습니다. 그래서 우리는 find_if함수를 사용해야 합니다. find_if 함수는 우리가 만든 데이터도 찾게 해줍니다.

 

소트 수행 전

 

소트 수행 후

 

 

100번 말보다는 한번 보는게 낫겠죠. 한번 보시고 돌려 보세요. 쉽게 아실 수 있을 겁니다.

 

결과입니다. 열공하세요!!


Bloger : moltak.net

'NativeCode > C++ STL' 카테고리의 다른 글

Algorithm  (0) 2010.03.18
list  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
String  (0) 2010.03.18

+ Recent posts