Notice
Recent Posts
Recent Comments
Dharma
[CppUnit] Helper Macros & TestFactory 본문
Helper Macros
TestRunner 에서 봤듯이 Fixture 에는 Static 함수는 suite() 가
필요합니다. 하지만 이것을 매번 작성하다보면 , 내용이 귀찮고,
반복적으로 해야 하고 그러다 보면 실수를 유발하게 됩니다. 그래서
이부분을 편리한 매크로로 만들어서 쓰게 할 수 있습니다.
기존의 파일에서
를 추가하면 macro를 쓸 수 있게 해줍니다.
('' 이것을 선언해주면 suite 를 쓰겠다고 선언하는 것입니다.
suite 에 추가해줄 함수들을 추가하고요
그리고 suite 선언이 끝났다고 선언해주는 것입니다.
여기까지 차례로 쓰면 , 아래 나와 있는 메서드 전체를 선언 과 구현해준
것입니다.
나머지 부분들은 기존과 동일하게 처리하시면 됩니다.
complextest.h 를 보기로 하지요
EXCEPTION 부분은 생략하기로 합니다.
TestFactoryRegistry
TestFactoryRegistry 는 두가지 이유로 씁니다.
fixture suite 를 테스트 러너에 추가하는 것을 가끔 잊어먹을때가
있습니다. 다른 파일에 보통 fixuture 가 있기 때문에 종종 그렇게
잊어먹곤 합니다.
test case 의 모든 헤더를 한곳에 집중해서 선언하면 컴파일 할때 병목
현상이 생기기 때문입니다.
다음의 예를 봅시다.
ComplexNumberTest 를 등록 시키기 위해서는 .cpp 파일에 다음과 같이
추가합니다.
이 이면에는 AutoRegisterSuite 의 static 변수가 선언되어 , 생성시에 그
변수가 TestSuiteFactory 를 TestFactoryRegistry 에 등록시킵니다. 그리고
TestSuiteFacctory 가 ComplexNumberTest::suite() 에 의해 반환되는
TestSuite를 반환합니다.
주절 주절 말을 늘어놓아지만 결국 할 이야기는 TestSuite 를 짜고 등록을
시키면 나중에 한꺼번에 몰아서 호출이 가능하다는 이야기 입니다.
실제로 이 테스트를 실행시키려고 하면 우리는 더이상 주저리 주저리
헤더를 등록 시킬 필요 없이
Factory 와 TestRunner 만 인클루드 시키면 됩니다.
이렇게 하면 CPPUNIT_TEST_SUITE_REGISTRATION () 를 통해서 등록한 모든
test suite를 가져올수 있습니다.
이렇게 실행합니다. (기존의 코드를 지우고 새로 위의 코드들을 써 넣으십시요)
main 함수가 간단해 지고 , 간결해 지는 장점이 있습니다.
Post build Check 부분은 나중에 따로 다른 예로 설명 드리고 CookBook 은
여기서 마치는 걸로 하겠습니다.
TestRunner 에서 봤듯이 Fixture 에는 Static 함수는 suite() 가
필요합니다. 하지만 이것을 매번 작성하다보면 , 내용이 귀찮고,
반복적으로 해야 하고 그러다 보면 실수를 유발하게 됩니다. 그래서
이부분을 편리한 매크로로 만들어서 쓰게 할 수 있습니다.
기존의 파일에서
#include <cppunit/extensions/HelperMacros.h>
를 추가하면 macro를 쓸 수 있게 해줍니다.
CPPUNIT_TEST_SUITE ( ComplexNumberTest) ;
('' 이것을 선언해주면 suite 를 쓰겠다고 선언하는 것입니다.
suite 에 추가해줄 함수들을 추가하고요
CPPUNIT_TEST (testEquality ) ;
CPPUNIT_TEST (testAddition ) ;
CPPUNIT_TEST (testAddition ) ;
그리고 suite 선언이 끝났다고 선언해주는 것입니다.
CPPUNIT_TEST_SUITE_END () ;
여기까지 차례로 쓰면 , 아래 나와 있는 메서드 전체를 선언 과 구현해준
것입니다.
static CppUnit::TestSuite * suite () ;
나머지 부분들은 기존과 동일하게 처리하시면 됩니다.
complextest.h 를 보기로 하지요
class ComplexNumberTest : public CppUnit::TestFixture {
private:
Complex *m_10_1, *m_1_1, *m_11_2;
public:
CPPUNIT_TEST_SUITE( ComplexNumberTest );
CPPUNIT_TEST( testEquality);
CPPUNIT_TEST( testAddition);
CPPUNIT_TEST_SUITE_END();
public:
void testDivideByZeroThrows ()
{
}
void setUp()
{
m_10_1 = new Complex( 10, 1 );
m_1_1 = new Complex( 1, 1 );
m_11_2 = new Complex( 11, 2 );
}
void tearDown()
{
delete m_10_1;
delete m_1_1;
delete m_11_2;
}
void testEquality()
{
CPPUNIT_ASSERT( *m_10_1 == *m_10_1 );
CPPUNIT_ASSERT( !(*m_10_1 == *m_11_2) );
}
void testAddition()
{
CPPUNIT_ASSERT( *m_10_1 + *m_1_1 == *m_11_2 );
}
};
private:
Complex *m_10_1, *m_1_1, *m_11_2;
public:
CPPUNIT_TEST_SUITE( ComplexNumberTest );
CPPUNIT_TEST( testEquality);
CPPUNIT_TEST( testAddition);
CPPUNIT_TEST_SUITE_END();
public:
void testDivideByZeroThrows ()
{
}
void setUp()
{
m_10_1 = new Complex( 10, 1 );
m_1_1 = new Complex( 1, 1 );
m_11_2 = new Complex( 11, 2 );
}
void tearDown()
{
delete m_10_1;
delete m_1_1;
delete m_11_2;
}
void testEquality()
{
CPPUNIT_ASSERT( *m_10_1 == *m_10_1 );
CPPUNIT_ASSERT( !(*m_10_1 == *m_11_2) );
}
void testAddition()
{
CPPUNIT_ASSERT( *m_10_1 + *m_1_1 == *m_11_2 );
}
};
EXCEPTION 부분은 생략하기로 합니다.
TestFactoryRegistry
TestFactoryRegistry 는 두가지 이유로 씁니다.
fixture suite 를 테스트 러너에 추가하는 것을 가끔 잊어먹을때가
있습니다. 다른 파일에 보통 fixuture 가 있기 때문에 종종 그렇게
잊어먹곤 합니다.
test case 의 모든 헤더를 한곳에 집중해서 선언하면 컴파일 할때 병목
현상이 생기기 때문입니다.
다음의 예를 봅시다.
ComplexNumberTest 를 등록 시키기 위해서는 .cpp 파일에 다음과 같이
추가합니다.
CPPUNIT_TEST_SUITE_REGISTRATION ( ComplexNumberTest) ;
이 이면에는 AutoRegisterSuite 의 static 변수가 선언되어 , 생성시에 그
변수가 TestSuiteFactory 를 TestFactoryRegistry 에 등록시킵니다. 그리고
TestSuiteFacctory 가 ComplexNumberTest::suite() 에 의해 반환되는
TestSuite를 반환합니다.
주절 주절 말을 늘어놓아지만 결국 할 이야기는 TestSuite 를 짜고 등록을
시키면 나중에 한꺼번에 몰아서 호출이 가능하다는 이야기 입니다.
실제로 이 테스트를 실행시키려고 하면 우리는 더이상 주저리 주저리
헤더를 등록 시킬 필요 없이
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/ui/text/TestRunner.h>
Factory 와 TestRunner 만 인클루드 시키면 됩니다.
CppUnit::TestFactoryRegistry & registry =
CppUnit::TestFactoryRegistry::getRegistry();
CppUnit::TestFactoryRegistry::getRegistry();
이렇게 하면 CPPUNIT_TEST_SUITE_REGISTRATION () 를 통해서 등록한 모든
test suite를 가져올수 있습니다.
runner.addTest (registry.makeTest () );
runner.run () ;
return 0 ;
runner.run () ;
return 0 ;
이렇게 실행합니다. (기존의 코드를 지우고 새로 위의 코드들을 써 넣으십시요)
main 함수가 간단해 지고 , 간결해 지는 장점이 있습니다.
Post build Check 부분은 나중에 따로 다른 예로 설명 드리고 CookBook 은
여기서 마치는 걸로 하겠습니다.