[CxxTest] 사용하려면... 이렇게..
개발 2007. 8. 30. 15:09
작성일 : 2007.05.09
작성자 : 한상철 (hanburn)
환경 : VS-2003, CxxTest
예전에 작석한 들인데 참 못섰다. 글제주가 이렇게 없다니~ ^^
CxxTest는 2006년에 처음 접해보았다. TDD를 접하면서 테스트코드를 만드는 도구라는 이야기에 사용하게 되었다
TDD에 대해서는 여기에서 이미 알고 있다는 가정하에 시작하겠다. ( 본인은 아직 TDD에 대해서 잘 모른다. ^^)
CxxTest는 C++을 위한 테스트 프레임 워크이다. 아마 이것을 만든 사람이 워드 커닝햄인가?
간단한 용어정리부터 해보자. (여기서만 사용할 용어이다. ^^)
원본코드 : 여기서는 원래의 의미와 조금 다른뜻으로 사용하였다. (적당한 표현이 없어서.. ㅎㅎ) 우리가 원하는 동작을 하는 코드이다. 일반적으로 어플, dll 모듈에 해당한다.
테스트코드 : 우리가 만든 코드를 테스트 해주는 코드이다. CxxTest 가 반자동으로 생성해 준다. 반자동이라는 얘기는 기초코드를 규치게 맞게 작성해야 한다는 말이다.
기본적으로 객체(class) 단위의 테스트코드를 작성하게 된다. 보통 프로젝트를 만들면 테스트코드를 위해서 테스트 하려는 부분을 클래스화 시켜야 한다. 그리고 원본코드를 테스트하기 위한 테스트 프로젝트를 만들어야 한다. 보통은 프로젝트이름+Test 정도로 이름을 붙여준다.
그리고 우리가 테스트할 class 를 위한 테스트코드 헤더파일을 작성해야 한다. 예를들어 CMyCalc 라는 목적클래스가 있으면 CMyCalcTest.h 라는 파일을 생성한다. (여기서 파일이름의 끝이 xxxtest.h로 끝나야만 된다. 이것은 파이선스크립트에서 파일이름을 가지고 테스트코드(C++)를 생성하기 때문다. ) 그리고 CxxTest::TestSuite를 상속받는 클래스를 만들어 준다. 그리고 test로 시작하는 테스트함수를 작성해준다. 글로 길게쓰니까 무슨 말인지 잘 모를 것 같아서 간단한 샘플코드를 보자.
// RawPlayerTest.h
#include <CxxTest/TestSuite.h> // for TestSuite
#include "..\\RawPlayer\\RawPicture.h" // for 테스트할 class 헤더
class RawPlayerTestSuit : public CxxTest::TestSuite
{
public:
CRawPicture rawPicture;
// 규칙 : 시작하기 전에 초기설정하는 함수(이름이 정확해야한다.)
void setUp()
{
// rawPicture.Init();
}
// 규칙 : 객체에 대한 종료작업하는 부분
void tearDown()
{
// rawPicture.Uninit();
}
// 규칙 : 테스트 함수는 test로 시작해야 한다.
// 규칙 : 테스트 함수가 새로 추가되면 runner.cpp를 새로 생성해야 한다.
void test_ReadRaw()
{
rawPicture.SetSize(2, 2);
rawPicture.SetRGBMode(TRUE);
TS_ASSERT_EQUALS(rawPicture.ReadFile("..\\Data\\small_2x2.raw"), TRUE);
std::vector<COLORREF> Pixcells;
Pixcells.push_back(RGB(0,0,0));
Pixcells.push_back(RGB(255,255,255));
Pixcells.push_back(RGB(255,255,255));
Pixcells.push_back(RGB(255,255,255));
TS_ASSERT_EQUALS( Pixcells == rawPicture.GetPixcells(), TRUE );
}
void test_111()
{
// 기타로 필요한 코드를 추가한다.
}
};
위의 샘플을 보면 대충 알수 있다 .
---------중요한것 몇개 정리해보면..---------------
* 테스트함수는 test로 시작해야 한다. (파이선스크립트때문에)
* 파일이름은 test로 끝나야 된다. (RawPlayerTest.h)
* 초기화 함수이름은 void setUP(), 종료작업 함수이름은 void tearDown() 이다. (대소문자 구분)
* 테스트함수가 추가되면 Runner를 재생성 시켜야 된다.
* 테스트 프로젝트는 보통 폴더구조상 같은 레벨에 위치한다.
* 테스트프로젝트에서 테스트할 클래스를 포함시켜야 된다. (작업시에도 테스트 프로젝트로 클래스를 개발하는 것이편하다.)
어찌 보면 사용하는데 불편할 수도 있어 보인다. 그러나 CppUnit 보다는 간결하다.
(간단하다는 증거가 있나요? 라고 물으면, 쩝.. 개인적인 생각입니다~ )
VS2005 에서는 테스트프로젝트가 생겼다던데.. 그것도 한번 봐야 겠다.
NUnit은 사용하기가 어떨까??