cppunit小记
cppunit的代码还是比较容易读的,比看文档还要省事一些。
拣主要的说一下:
1. Test和TestSuite
这个关系有点像composite模式,如图
当然除了TestSuite外,Test还有其它的子类,比如TestCase等
2.TestResult和TestRunner和Test
TestRunnder组织起Test(/TestSuite),之后run时,实际将所有Test交给TestResult执行,TestResult一一执行每个Test,在每个Test运行时会通知注册在TestResult上的TestListener。
3. TestFixture\TestCaller等
TestCaller名为Caller,实为TestCase(子类)。
为方便用户写case而设计了TestFixture,用户可通过继承TestFixture在其中写自己的case,而TestCaller实际使用TestFixture完成回调(也是被称为Caller的原因)形成了TestCase。
4.宏们
CPPUNIT_TEST_SUITE
CPPUNIT_TEST CPPUNIT_TEST_SUITE_END
这几个宏在用户所写Fixture中插入代码,加入必要的函数,及添加case并形成Fixture被Caller调用形成Test的代码,于是每一个被CPPUNIT_TEST的函数都成了一个Test。
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION
形成一个static的Registry,其中加入了参数所指的Fixture.之后可通过registry的名字将它找到,并使用makeTest找出其中包含(并组织后的)Test们。
示例代码: 参考:http://www.ibm.com/developerworks/cn/linux/l-cppunit/的第4部分。
/// MathTest.h // A TestFixture subclass. // Announce: use as your owner risk. // Author : liqun (liqun@nsfocus.com) // Data : 2003-7-5 #include "cppunit/extensions/HelperMacros.h" class MathTest : public CppUnit::TestFixture { // 声明一个TestSuite CPPUNIT_TEST_SUITE( MathTest ); // 添加测试用例到TestSuite, 定义新的测试用例需要在这儿声明一下 CPPUNIT_TEST( testAdd ); // TestSuite声明完成 CPPUNIT_TEST_SUITE_END(); // 其余不变 protected: int m_value1, m_value2; public: MathTest() {} // 初始化函数 void setUp (); // 清理函数 void tearDown(); // 测试加法的测试函数 void testAdd (); // 可以添加新的测试函数 }; /// MathTest.cpp // A TestFixture subclass. // Announce: use as your owner risk. // Author : liqun (liqun@nsfocus.com) // Data : 2003-7-5 #include "MathTest.h" // 把这个TestSuite注册到名字为"alltest"的TestSuite中, 如果没有定义会自动定义 // 也可以CPPUNIT_TEST_SUITE_REGISTRATION( MathTest );注册到全局的一个未命名的TestSuite中. CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( MathTest, "alltest" ); // 下面不变 void MathTest::setUp() { m_value1 = 2; m_value2 = 3; } void MathTest::tearDown() { } void MathTest::testAdd() { int result = m_value1 + m_value2; CPPUNIT_ASSERT( result == 5 ); } /// main.cpp // Main file for cppunit test. // Announce: use as your owner risk. // Compile : g++ -lcppunit MathTest.cpp main.cpp // Run : ./a.out // Test : RedHat 8.0 CppUnit1.8.0 // Author : liqun ( a litthle modification. liqun@nsfocus.com) // Data : 2003-7-5 // 不用再包含所有TestFixture子类的头文件 #include <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/ui/text/TestRunner.h> // 如果不更改TestSuite, 本文件后期不需要更改. int main() { CppUnit::TextUi::TestRunner runner; // 从注册的TestSuite中获取特定的TestSuite, 没有参数获取未命名的TestSuite. CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry("alltest"); // 添加这个TestSuite到TestRunner中 runner.addTest( registry.makeTest() ); // 运行测试 runner.run(); }