'cxxtest'에 해당되는 글 2건

  1. 2007.08.30 [CxxTest] 사용하려면... 이렇게.. 1
  2. 2007.08.30 [CxxTest] 소개 - 단위(유닛)테스트를 위한 C++용 라이브러리

[CxxTest] 사용하려면... 이렇게..

개발 2007. 8. 30. 15:09

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

작성일 : 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은 사용하기가 어떨까??

ps : 실제 적용된 환경에 맞추어서 작성된 간단한 샘플을 첨부파일로 올려두었다.



:

[CxxTest] 소개 - 단위(유닛)테스트를 위한 C++용 라이브러리

개발 2007. 8. 30. 14:50

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

저자 : hanburn

날짜 : 2007.08.30

환경 : VS-2003, CxxTest, Python

 

단위테스트를 클래스를 작성하고 클래스단위로 테스트 모듈을 만들어 두면, 추후에 수정을 가해가 할 때 조금 편리하게 작업을 할 수 있게 된다. 자바쪽에서는 JUnit이라는 라이브러리를 이용하고 C++ 쪽에서는 이것을 포팅한 CppUnit 이라는 것이 있다. 그런데 CppUnit 이라는 것이 사용하기가 좀 불편한 감이 있다. 그래서 조금 가볍고 사용이 쉬운 CxxTest라는 것을 소개한다.

 

소스받는곳 : http://cxxtest.sourceforge.net

기본사용법 : http://cxxtest.sourceforge.net/guide.html

 

 

CxxTest를 사용하기 위해서는 Python을 설치하는게 좋다. 왜냐하면, python 스크립트 중에서 cxxtestgen.py라는 스크립트가 포함되어 있는데, 이 스크립트가 testcode를 만들어 주기 때문이다. , CxxTest와 궁합이 잘 맞는다고 할 수 있다.

 

컴퓨터에 Python이 설치가 않되었다면 먼저 설치부터 하도록 하자.

 

파이선받기 : http://www.python.org

 

파이선은 받아서 설치만 하면 되니까 별다른 설정없이 그냥 설치하면 된다. 필자는 C:\밑에 그냥 설치를 하였다. 설치된 폴더에 보면 cxxtestgen.py라는 파이선 스크립트 파일이 보일 것이다. 내용이 꽤 긴 스크립트 파일이다. 이것이 용도는 파일을 열어보면 알겠지만, 테스트용 소스파일을 생성해주는 역할을 하는데, 옵션이 꽤 된다. 그래서 좀금더 편리하게 하기 위해서 다음과 같은 파이서 스크립트를 더 생성한다. (출처는 인터넷에서 구했다. )

 

 

import os

 

def toStr(aList):

           return ' '.join(aList)

 

def main():

           testFiles = []

           for eachFile in os.listdir("."):

                     if os.path.isfile(eachFile):

                                lastestPeriod = eachFile.rfind(".")

                                fileName = eachFile[:lastestPeriod]

                                extension = eachFile[lastestPeriod+1:]

                                if fileName.endswith("Test"):

                                          print fileName, extension

                                          testFiles.append(eachFile)

                    

           files = toStr(testFiles)

           if files == '':

                     print "No Test Files... Make XxxText.xxx..."

           else :

                     #cmd= "python cxxtestgen.py --runner=ParenPrinter --gui=Win32Gui -o runner.cpp "+toStr(testFiles)

                     cmd= "C:\Python25\python.exe C:\Python25\cxxtestgen.py --runner=ParenPrinter --gui=Win32Gui -o runner.cpp "+toStr(testFiles)

                     print cmd

                     os.system(cmd)

 

if __name__=="__main__":

           main()

 

 

대충보면 폴더에서 파일을 찾아서 확장자 전에 Test 라는 이름이 들어가는 파일을 찾아서 cxxtestget.py 스크립트 파일에 몇가지 옵션과 함께 넘겨서 테스트 소스를 생성해주는 역할이다.

 

위의 내용을 MakeCxxTest.py 라는 이름으로 파이선이 설치된 폴더(C:\Python25)에 생성을 해 놓는다.

 

다음으로는 우리가 사용할 VS2003에서 방금 만든 MakeCxxTest.py를 호출(실행)할수 있도록 간단하게 환경설정을 해보도록 하자.

메뉴에서 도구 -> 외부도구를 누르면 뜨는 창에 아래처럼 추가를 한다.

 

사용자 삽입 이미지


제목을 써주고, 명령과 인수를 각자 환경에 맞추어서 설정해주면 된다. 그리고 오류내용을 보기 쉽게 출력창사용에 체크를 해주면 된다. 요렇게 간단하게 설정하면 CxxTest를 사용할 준비가 된된 것이. ^^

 

위에보면 Run Cxx Test Runner 라는 명령도 추가를 해주었는데, 별로 필요는 없다. 왜냐하면, 나중에 테스트 프로젝트를 실행 프로젝트로 하고 실행을 하는 것과 같기 때문이다. 개발시에 그냥 실행프로젝트를 설정해놓고 개발하는 것이 더 편리한 것 같더라. VS-2003의 개발환경에 익숙하고 단축키에도 익숙하므로..   단축키 얘기가 나왔으니, 위의 명령을 단축키로 할당해 놓는 것도 편리하다.




: