二、编写单元测试代码
在 CppUnit 中,每一个测试用例用一个类表示,该类通常用于测试一个模块,如果该模块是一个类,正好对应这个测试用例。
定义类:
每个测试用例类都必有继承自 CPPUNIT_NS::TestFixture。如:
class SampleTestCase : public CPPUNIT_NS::TestFixture
并且,这个类还需要定义一对宏:
CPPUNIT_TEST_SUITE (SampleTestCase);
CPPUNIT_TEST_SUITE_END ();
这对宏里面用于定义这个测试类所包含的测试方法。而且,在实现的源程序中也需要定义一个宏来
标识该测试类:
CPPUNIT_TEST_SUITE_REGISTRATION (SampleTestCase);
除此之外,每个类还可以实现两个方法:setUp(), tearDown()。第一个方法在运行这个类的测试
方法之前被调用,而第二个方法则是在运行完这个类的测试方法之后被调用。例如,如果这个测试
类需要操作一个文件里的信息,通常在运行测试方法之前,需要打开指定的文件,这些处理则可以
放在 setUp() 中实现。而完成测试之后,又需要将打开的文件关闭,这些操作可以在 tearDown()
中实现。这两个方法的原型是:
void setUp ();
void TearDown ();
定义测试方法
每个测试方法用于测试一段功能,通常对应于被测试类的某公开方法。例如,在 Sample 类中有一个
foo () 方法,在测试类 SampleTestCase 中也可以声明一个 foo () 方法。注意,强烈建议使用相同
的名称,这样便于维护。
每一个测试方法需要在类的 CPPUNIT_TEST_SUITE 宏中添加一个定义,以便 CppUnit 能够发现该测试方
法,如:
CPPUNIT_TEST (foo);
在定义测试方法之后,就可以在该方法内编写单元测试代码了。单元测试框架都采用断言式的测试方式,
即编写一个表达式,检查其结果是否为真,真则表示通过。在 CppUnit 中,用于检验测试是否通过的宏
包括:
CPPUNIT_ASSERT (expr) : 检查表达式 expr 是否为真,真则通过,假则错误。
CPPUNIT_ASSERT_TRHOW (expr, exception) : 检查表达式 expr 是否抛出异常类型 exception,
如果抛出了指定类型的异常,则通过测试。
CPPUNIT_ASSERT_MESSAGE (message, expr) : 类似于CPPUNIT_ASSERT, 但在没有通过时输出消息 message。
CPPUNIT_FAIL (message) : 强制性不通过测试,并输出消息 message。