速成者,囫囵吞枣也,不究其精要,只探其皮毛。今天花了两个小时研究了一下CppUnit,大体上了解到了CppUnit的框架和简单的使用方法,记述如下:

研究了一下CppUnit的源码,本想把它的框架类图画出来的,可是Together无论如何搞不定。只好作罢。那么就说说怎么用吧。回头有时间再来把它的源码架构说明一下。

(一)、在console程序内部使用CppUnit

1、建立一个继承自CppUnit::TestFixture的类,类的声明的开始部分使用CppUnit的预定义的宏CPPUNIT_TEST_SUITE和CPPUNIT_TEST_SUITE_END来声明一个TestSuite。具体格式如下(必须包含cppunit/extensions/helpermacros.h才能正确的使用下面提到的宏):

class TestOfDummy : public CppUnit::TestFixture {
   CPPUNIT_TEST_SUITE(TestOfDummy);
   ... //some test here, refer to point 2.
   CPPUNIT_TEST_SUITE_END();
public:
   ... //your class definition
};

2、在该类内部建立成员方法用作测试用例,并在类声明中的CPPUNIT_TEST_SUITE和CPPUNIT_TEST_SUITE_END之间添加CppUnit预定义的宏CPPUNIT_TEST来声明一个测试。具体格式如下:

in .h file

class TestOfDummy : public CppUnit::TestFixture {
   CPPUNIT_TEST_SUITE(TestOfDummy);
   CPPUNIT_TEST(testEqual);
   ... //other tests
   CPPUNIT_TEST_SUITE_END;
public:
   void testEqual();
   ...
// other member functions

};

in .cpp file

#include

#include

void TestOfDummy::testEqual(){
   CPPUNIT_ASSERT( 1 == 1); 
   ... //other asserts
}

3、在类的实现(通常在cpp文件中)的开始部分添加CppUnit预定义的宏CPPUNIT_TEST_SUITE_REGISTRATION来注册这个TestSuite。具体格式如下:

in .cpp file

#include
#include

CPPUNIT_TEST_SUITE_REGISTRATION(TestOfDummy);

void TestOfDummy::testEqual(){
   CPPUNIT_ASSERT( 1 == 1); 
   ... //other asserts
}

4、在main方法中通过CppUnit提供的方法得到这个已注册的TestSuite,并把这个suite加到一个TestRunner中(在console程序中,一般使用TextUi::TestRunner),然后调用该TestRunner的run方法运行这个suite的测试。具体格式如下:

using CPPUNIT_NS::Test;
using CPPUNIT_NS::TestFactoryRegistry;
using CPPUNIT_NS::TextUi;

int main(int argc, char* argv[]) {
   Test *suite = TestFactoryRegistry::getRegistry::makeTest();
   TextUi::TestRunner runner;
   runner.addTest(suite);
   runner.run();
}