계속 .NET으로 만들고 작성하다 보니, 어느새 VS 에 물이 들만큼 들어 Unit Test 할 때도 VS 에서 제공하는 Unit Test를 그럭저럭 사용할 수 있게 되었다. 그래서 어느새 C#을 이용한 프로젝트 생성시, VS의 UnitTest로 다양한 TDD 적용을 시도할 수 있었다. 게다가 UI나 기능도 나름대로 흡족했다.
그런데, 어느날 프로젝트의 구성을 Visual C++로 구성해야 될 일이 생겼다. 그런데 막상 VS의 테스트 기능을 보고 나니 VS에서 제공하는 UnitTest기능은 .NET의 Managed Code에서만 동작하는 반쪽짜리 UnitTest 였다. 그러니 MFC나 Win32 순수 API 프로그램에서는 VS의 UnitTest를 사용할 수 없었다. 다른 대안을 찾아야 되는 시점이 오고야 만 것이다.
만일 TDD를 몰랐다면, 예전 처럼 처음 부터 하나씩 다시 짤 생각이 꽉찼을지 모른다. (아직은 초보이긴 하지만)이미 TDD의 맛을 맛보고, 감동의 여운속에서 헤메는 나로써는 결국 결국 C++용 TDD를 찾기 시작했다.
C++ 언어를 위한 TDD Framework를 찾아보면 알겠지만, 무척 다양하다. 그래서 처음 찾아본 내 입장에서는 무엇이 좋고, 나쁜지를 명확히 알 수 없었다. 그 중 나름대로 평이 좋다는 이런 저런 블로그 이야기를 듣고
UnitTest++를 선택했다. ( http://unittest-cpp.sourceforge.net )
하지만 이 UnitTest 방법은 VS의 UnitTest와는 다른 형태였고, 어떻게 하는지 전혀 알 수 없었다. 겨우 겨우 하나씩 따라 갈 수 있을 정도까지 익히고 보니, 이젠 결과물이 문제였다. 실제로 샘플코드를 시작해보았더니 왠 까만 화면만 휙 나타나다 휙 사라져버렸다. 맨날 녹색 깃발이라고 불리는 테스트 All Green은 커녕, 오로지 텍스트 기반의 메시지 밖에 없을 뿐이였다.
그러다가 찾은 것이 Visual UnitTest++( http://code.google.com/p/vutpp ) 이였다. 이 도구를 사용하면 UnitTest++의 결과를 Visual Studio에서 Add-on 형식으로 녹색깃발을 구경할 수 있다는 것이였다.
그래서 하나씩 적용해 보았고, 그 실행 결과에 대한 내용을 적어보록 한다.
기본작업 환경.
개발자들은 각 개발내용이나 프로젝트에 따라 개발자별 개발 환경이 다를 수 밖에 없다.
그래서 아마 이 작업을 할때도 그 변경된 사항이나 구성된 제품들에 따라 조금씩 다를 수 있다.
이에 이 작업이 성공한 환경을 먼저 언급하고 정리하도록 한다.
- 개발 운영 체제 : MS Windows 2003 Enterprise 한글판.
- 개발 도구 : MS Visual Studio 2005 Team Suite
- SDK : Windows SDK 6.0A
UnitTest++ 설치(?) 하기.
맨 먼저 다음 위치(http://sourceforge.net/projects/unittest-cpp/files/) 에서 최신 버전의 UnitTest++을 받도록 한다. 이거 압축 풀면 소스 밖에 없다. 즉 컴파일을 할 수 있어야 된다는 의미다. 지금까지 계속 Visual Studio로 개발을 해왔다면, 이런 형태의 결과물은 받자마자 많이 당혹스럽다.
일단 이 소스를 적당한 위치에 넣도록 한다. 여기서는 압축 푼 내용을 모두 D:\Works\UnitTest++\ 에 모두 복사했다. 복사된 결과값을 보면 그 안에, VS 2003과 2005용 솔루션 파일을 볼 수 있다. ( 2008은 솔루션과 프로젝트 파일을 업그레이드 한 뒤 작업을 해야 할 것 같은데, 아직 해본적은 없다.)
파일 들 중에, UnitTest++.vsnet2005.sln 파일이 VS 2005 솔루션 파일인데, 이 파일을 열도록 한다.
솔루션 탐색기에서 보면 다음과 같이 보일 것이다.
이 프로젝트 내용 중 “UnitTest++.vsnet2005”를 컴파일 하도록 한다. 그러면 폴더 아래 쪽에 debug 라는 폴더가 자동으로 만들어지면서, 그 안에 UnitTest++.vsnet2005.lib 파일이 생성된다. 이 파일이 이 UnitTest++의 핵심 파일인데, 이 파일의 위치를 나중에 넣어서 사용하니까, 명확히 경로를 기억하도록 하자.
여기 까지가 UnitTest++ 설치 작업이였다.
UnitTest VisualUnitTest++ 설치.
UnitTest의 메인은 위의 단계까지 하면 끝이긴 하다. 하지만, All Green Flag와 같은 Unit Test 만의 로망인 결과값을 보기가 어렵다. 모든 결과값이 텍스트로 Success와 Fail 밖에 없기 때문이다. 그래서 이 내용을 그림으로 보여고 싶으면 이런 별도의 솔루션을 설치하는 것이 좋다. ( 혹시 DOS 창에서 Success와 Fail 로 표시되는 Text에 로망이 가득하신 분은 무시해도 상관 없다.)
현재(2009/8/29 기준) 최신 버전은 0.4 버전으로 다양한 UnitTest 솔루션을 지원한다. 하지만 현재로 사용할 내용은 UnitTest++ 이며, 원래 이 Visual UnitTest++도 UnitTest++을 지원하기 위해 태어난 존재이기 때문에 호환에 아무런 문제가 없다.
일단 사이트에서 최신 버전을 다운로드 받는다. ( http://code.google.com/p/vutpp/downloads/list )
여기서 꼭 받아야 되는 파일이 두가지인데, 한개는 확장자가 .msi 로 끝나는 파일로 이 파일이 Visual UnitTest++을 실행해주는 중요한 파일이다. 그리고 vuppsample.X.X.zip 파일을 받는다. ( X.X는 버전을 의미) 설치 파일이야 당연히 필요하지만, 대개 sample 파일은 잘 받지 않는 편이다. 하지만, 이 도구로 작업 결과를 보려면 sample 파일이 꼭 필요하다. 문서화가 조금 부실해 설명 내용으로 잘 이해되지 않는 부분이 많은데, 이런 부족한 설명은 바로 이 Sample을 보고 터득해야 되기 때문이다. 여튼 설치 파일과 Sample 파일은 꼭 받기를 바란다.
다운로드가 되었다면, 먼저 .msi를 실행하고 설치한다.
시스템에 문제가 없다면 정상적으로 설치되며 VS를 실행해서 메뉴 항목을 보면 다음 그림과 같이 도움말 옆에 떡하니 붙어 있게된다.
일단 실행하지 말고, 이제는 아까 받은 샘플 파일 압축을 풀도록 한다.
이건 굳이 정해져 있는 것이 아니기 때문에, 바탕화면과 같이 적당하게 풀고 그 프로젝트를 열도록 한다.
그러면 C++ 용 UnitTest Framework 별로 프로젝트가 달랑 달랑 붙어 있다. 자 여기서는 최소한 Unit Test가 어떻게 되는지를 보고, 설정이 제정신으로 되었는지를 체크하는데 그 주안점을 둘 예정이다. 그래서 다른 프로젝트는 일단 두고, 이 Samle 에서 제공하는 SampleUnitTest++.2005 만 이용하여 설정 관련 확인 작업을 할 예정이다.
자 이제 Unit Test를 그럴싸 하게 할 모든 준비가 되었다.
이제 본격적으로 진행할 시점만 나왔다.
UnitTest 프로젝트 생성.
이 UnitTes++은 그 프로그램이 무척 간단하기 때문에, Windows UI로 동작되는 부분이 전혀 없다. 그래서 이 Test용 프로젝트는 단순 “Win32 콘솔 응용 프로그램”로 생성해주면 된다.
자신이 진행 중인 솔루션이 있다면 그 솔루션에서 오른쪽 버튼을 클릭한 뒤, 새 프로젝트를 해주도록 한다.
그러면 생성할 새 프로젝트에 대한 템플릿들을 보여주는데, 그 중 Visual C++의 Win32 항목에 있는 Win 32 콘솔 응용 프로그램을 선택해주면 된다.
적당한 프로젝트 이름을 주고(가급적이면 맨 앞의 이름을 test 라고 붙이는게 좋을 것이다. ) 만들기 하면 정상적으로 완료될 것이다. 그러면 stdafx.h와 cpp 파일 그리고 프로젝트 이름과 동일한 CPP 파일이 생성된다.
일단 stdafx 파일들은 그냥 삭제하시고 프로젝트 이름의 cpp 파일만 남겨놓도록 한다.
이제 프로젝트를 수정하도록 한다.
제일 먼저 구성 속성의 C/C++의 일반 속성 에서 “추가 포함 디렉터리” 부분에 아까 압축을 풀어 넣었던 "UnitTest++” 프로젝트의 Src 경로를 걸어주도록 한다.
이제 C/C++ 트리 안쪽에 있는 전처리기 항목에 들어가 “전처리기 정의” 에서 VUTPP_UNITTEST++ 을 추가한다.
아래쪽에 있는 미리 컴파일된 헤더 항목으로 이동해서 이번엔 “미리 컴파일된 헤더 만들기/사용” 항목 중 미리 컴파일된 헤더 사용 안 함을 선택하도록 한다. ( 그래야 아까 뺀 stdafx.h 와 cpp 파일을 찾지 않는다. )
마지막으로 아래의 링커 부분에서 입력 부분에 들어가 “추가 종속성”에서 아까 만들어진 UnitTest++을 컴파일해서 만든 .lib 파일을 연결하도록 한다.
이렇게 한 뒤, 이제 마지막으로 프로젝트 이름의 .cpp 파일을 열도록 한다. 연 뒤에, Visual UnitTest++의 샘플 파일 중 VUTPPBind.cpp 파일 내용에서 전부 복사 해오도록 한다.
자 이제 테스트 로직을 하나 추가한다. 적당한 이름의 .cpp 파일을 만들고 아래의 코드로 넣도록 한다.
#include <windows.h>
#include "UnitTest++.h"namespace
{
TEST(testUnitTest)
{
bool bResult = true;
CHECK(bResult);}
}
그리고 컴파일 해보자.
컴파일 오류가 났다면 에러의 내용을 보고 위의 내용을 참고하여 수정하도록 한다.
정상적으로 컴파일 되었다면, 이제 VS의 메뉴에 있는 VUTPP –> UnitTestBrowser를 실행하도록 한다.
화면 상에 VisualUnitTest++이 뜰 것이고, Run All을 하면 아래의 화면과 같은 결과를 볼 수 있다.
UPDATE : 2009 / 12 / 24
주의사신 님 댓글을 보고 저도 잠시 이 포스팅 내용을 조금 읽었습니다. 약간 쇼크.
제가 다시 보는데 이게 무슨 말이야… 라고 생각이 들었습니다.
조금 다듬어 보려고 했지만, 결과는 비슷한듯 싶군요.
단지 보기가 조금이나마 편하라고, 약간의 정리만 해봤습니다.