CppUnit 是开放源代码的测试工具,来源于 Java 版本的 JUnit。单元测试在极限编程理论中有非常重要的作用。即使不采用极限编程方式,每个软件工程师应该写测试程序、准备测试数据、测试自己写的软件模块能够运行。
CppUnit 可以用来同时测试多个软件模块,并且显示有多少成功、多少失败。有命令行方式运行,VC 写的 GUI 程序界面,也有 QT 的 GUI 程序界面。以下是 VC 运行界面。
如果您想用 CppUnit 来进行软件测试的话,可以到 CppUnit 在 Sourceforge 上面的网站下载原代码,里面有示例程序。
我们可以从 cppunit-1.10.2/examples/msvc6/CppUnitTestApp/CppUnitTestApp.dsw 改造入手,全部编译后,将原有的 cppunit、DSPlugIn、TestRunner 几个project 删除,只留下CppUnitTestApp project。在 VC 的 File View 将原有的 DLL Dependencies,Tests 删除。然后增加自己的测试程序。
测试的 C++ 代码都必须加入到这个 Project ,如果用 C++ Builder 就只能用那个命令行的版本了。如果有失败的测试单元,则显示是哪些测试单元。
一般的测试单元,写一个 CPPUNIT_NS::TestCase 的子类,里面写一个或者多个 testXXX 函数。在 testXXX 中调用正式代码:
void testXXX(){undefined
int result = myFun(1,2);
CPPUNIT_ASSERT_EQUAL(result,7);
result = myFun(10,70);
CPPUNIT_ASSERT_EQUAL(result,9);
}
每个 test 函数算一个测试基本元素。如果它里面的所有 assert 都成功,这个 test 函数才算通过。
通常来说,测试所用的数据,一般不用写在源代码中,而是写在 xml 或者 ini 或者其他文件中。这样的好处是测试时更改测试数据,不用重新编译程序,方便测试。
比较通用的方法是,写一个 BaseTestCase 类,里面处理好数据读入、输出,其它测试单元都从这个 BaseTestCase 继承。
相对于 JUnit 而言,CppUnit 的不方便之处是新的测试程序需要加入测试 project,对于很多人同时在写测试单元的时候,大家都在等别人修改完了测试 project自己才能进行,不太好。相对而言,Java 测试程序可以不需要任何 project 文件。变通的方法是,将测试 project 拆分成多个子 project ,但是这样一来就无法在一个测试程序中运行所有的测试。
CppUnit 的好处是运行速度比较快。