티스토리 뷰

Gui를 지원하고 테스트를 선택할 수 있는 멋진 테스트 프레임워크인 CppUnit을 사용해봅시다.

CppUnit 미디어 위키
CppUnit 다운로드 페이지

위 다운로드 페이지에서, CppUnit을 다운로드 받으세요.
CppUnit은 MSVC 6.0의 프로젝트 파일인 dsw로 작성이 되어있습니다.

기본적으로 MSVC 6.0의 프로젝트 파일은 업그레이드 시 큰 문제가 없기 때문에, (CppUnit은 표준을 잘 지켰기에 ) VS7.x 버전 이상에서도 무리 없이 사용 가능합니다.

압축을 푸신 후에, ".\src\CppUnitLibraries.dsw" 를 컨버팅 하신 후에, ".\examples\examples.dsw"도 업그레이드 하시면 됩니다.
프로젝트 별로, 프로젝트 종속성이 안걸려있는데, 이 부분은 어떤 dll을 사용하는지 확인해서 처리하면 된다.
기본적으로, cppunit, cppunit_dll, TestRunner 이 세가지 프로젝트를 우선적으로 빌드하고 이외의 프로젝트를 빌드하면 무리없이 빌드됩니다.

Cppunit을 사용하려는 프로젝트에도 세팅이 필요한데, 해당 프로젝트 세팅에서 Enable Run_time Type Information (RTTI)를 활성화 시켜 주셔야 합니다.

그리고 프로젝트별로 lib, include 폴더와, 릴리즈 모드에서는 testrunner.lib , cppunit.lib, 디버그 모드에서는 testrunnerd.lib, cppunitd.lib를 링크시켜주시면 컴파일이 가능해집니다.

CppUnit을 사용한 프로그램이 실행될 때에는 반드시 testrunner와 cppunit의 dll들이 실행될 프로그램과 같은 경로에 존재해야만 합니다.

또 다른 주의 사항은 GUI 사용시 QT 또는 MFC를 사용해야 된다는 점입니다.
만약, Win32 Console Application이나, Win32 Application인 경우에는 MFC 사용을 위한 선행작업이 필요해지죠.

해당 방법에 대해서는 아래 글을 참조하십시오. 

실제 테스트할 프로젝트에서도 세팅이 필요합니다.
우선 CppUnit을 실행할 곳에서의 설정이 우선입니다. (대게는 main 함수 안이 되겠죠?)
#include <msvc6/testrunner/testrunner.h>#include <cppunit/extensions/testfactoryregistry.h>TestRunner runner;runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());runner.run();

이어서 테스트 할 대상 파일 (*.cpp) 에서 해주어야 할 설정입니다.
CPPUNIT_TEST_SUITE_REGISTRATION( 테스트대상클래스 ); // CppUnit에 등록!!!

헤더 파일(*.h, *.hpp)에도 설정이 필요합니다.
#include <cppunit/testcase.h>  
#include <cppunit/extensions/helpermacros.h> 

class 테스트대상클래스 : public CppUnit::TestCase  
{	
	//...	
	CPPUNIT_TEST_SUITE( 테스트대상클래스 ); //테스트 등록 시작	
	
	// TestCase 의 등록. 다수의 테스트 등록 가능	
	CPPUNIT_TEST( 테스트대상메소드);	

	CPPUNIT_TEST_SUITE_END(); //테스트 메소드 등록 끝
}
자 이제 테스트할 메소드 내부에서 사용할 매크로들을 소개합니다~
CPPUNIT_ASSERT(expr) // expr이 true일 때에만 테스트 통과 
CPPUNIT_ASSERT_MESSAGE(msg, expr) // 위와 같은. 메시지 지정 가능. 
CPPUNIT_ASSERT_EQUAL(expected, actual) // expected와 actual이 같을 때에만 테스트 통과. operator==() 로 비교(맞나?) 
CPPUNIT_ASSERT_EQUAL_MESSAGE(msg, expected, actual) // 위와 같음. 메시지 지정 가능. 
CPPUNIT_FAIL(msg) // 이 코드를 만나면 테스트 실패. 
CPPUNIT_ASSERT_THROW(expr, exceptionType) // expr이 exceptionType의 exception을 던지는 경우에만 테스트 통과. 
CPPUNIT_ASSERT_NO_THROW(expr) // expr이 exception을 던지지 않는 경우에만 테스트 통과 
CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, delta) // primitive type의 경우에 사용. expected와 actual이 delta 오차 범위 내에서 같을 때에만 테스트 통과. 
CPPUNIT_ASSERT_ASSERTION_FAIL(assertion) // assertion이 실패한 경우에만 테스트 통과. ex) CPPUNIT_ASSERT_ASSERTION_FAIL(CPPUNIT_ASSERT(1 == 2)) 
CPPUNIT_ASSERT_ASSERTION_PASS(assertion) // assertion이 성공한 경우에만 테스트 통과. ex) CPPUNIT_ASSERT_ASSERTION_PASS(CPPUNIT_ASSERT(1 == 2)) 
 

댓글