CppUnit测试是软体开发过程中必不可少的一个部分,是软体质量的保障的重要手段. 单元测试作为代码级最小的单位的测试,在软体开发过程中起着举足轻重的作用。
基本介绍
- 中文名CppUnit
- 外文名CppUnit
- 开发环境Windows
- 测试单元测试
- 移植JUnit
- 框架GNU LGPL条约
概述
极限编程(XP)推崇测试优先原则,由此引发了软体开发方法从传统的瀑布模型转向以测试为驱动的敏捷开发模式的革命。在这场软体开发方法革命中,以xUnit系列的单元测试框架是一切的中心。xUnit的成员有很多,如JUnit,NUnit.PythonUnit,HtmlUnit,HttpUnit等。CppUnit就是xUnit家族中的一员,它是一个专门面向C++的单元测试框架。
CppUnit是Micheal Feathers由JUnit移植过来的一个在GNU LGPL条约下的并在sourcefogre网站上开源的C++单元测试框架。
安装
Windows
(选择开发环境为MS Visual C++ 6.0)需要如下五个步骤
一 、到CppUnit 的官方网站上下载CppUnit的软体包。
二、 编译、安装CppUnit库。在VC中打开CPPUNITHOME/src/CppUnitLibraries.dsw,选择“Build | BatchBuild...”,选中所有的项目,点击build按钮。在CPPUNITHOME/lib/下生成所需要的所有库档案。CPPUNITHOME是CppUnit在你磁碟上的目录。下同。
三、在Visual C++中进行设定。告诉VC在哪里能找到CppUnit中的程式档案和库档案打开“Tools | Options...”,切换到'Directories'标籤页,选择'include files',添加CPPUNITHOME/include/;切换到'libraries files'标籤页,添加CPPUNITHOME/lib/;切换到'source files'标籤页,添加CPPUNITHOME/src/cppunit/,保存。
四、在测试代码中进行设定。在VC中打开你写的测试程式,启动Project Settings对话框,切换到'C++'标籤页,选择'Code generation'项,对于release版,选择'Multithreaded DLL',对于Debug版,选择'Debug Multithreaded DLL'。同样是在这个标籤页,选择'C++ langage'项,选择All Configurations,选择'enable Run-Time Type Information (RTTI)'。切换到'Link'标籤页,在'Object/library modules'中添入需要的lib档案cppunitX.lib (debug模式为cppunitd.lib, release 模式为cppunit.lib )和testrunnerX.lib(debug模式为testrunnerd.lib, release 模式testrunner.lib,debug Unicode模式为testrunnerud.lib, release Unicode模式为testrunneru.lib)
五、添加系统路径。为使测试程式在运行时能找到CppUnit提供的dll,我们在环境变数中指出CppUnit提供的dll的路径在我的电脑中,打开环境变数,编辑系统变数中的path变数,向其中添加CPPUNITHOME\lib,从新启动计算机,使设定生效。
Linux
- Ubuntu或者Debian下的安装
sudo apt-get install libcppunit-dev libcppunit-doc
2. 原始码安装
一、下载最新的CppUnit的源码包,并解压: tar -zxvf cppunit1.21.1.tar.gz
二、进入CppUnit介质的目录,依次执行
cd cppunit1.21.1
./configure
make
sudo make install(需要root许可权将库档案拷贝到/usr/local/lib目录下)
如果编译安装时遇到错误可以参考资料2
三、将CppUnit生成的动态库档案所在的路径(默认是/usr/local/lib)添加到/etc/ld.so.conf档案里,然后运行ldconfig。注意:可以通过 cat /etc/ld.so.conf.d/ 观察一下/usr/local/lib是否已经在动态连线库路径中,然后在做修改。
如果在命令行(cmd DOS/Shell)下,在编译连线程式时,需要使用-lcppunit 选项,如g++ -lcppunit 1.cpp 2.cpp 3.cpp。如果是在VC 6.0 的IDE中,需要配置一下连线路径,将-lcppunit添加到连线路径中。
简介
CppUnit按照层次来管理测试,最底层的就是TestCase,当有了几个TestCase以后,可以将它们组织成TestFixture。在TestFixture中,可以建立被测试的类的实例,并编写TestCase对类实例进行测试,多个TestFixture可以通过TestSuite来对测试进行管理。
通过派生TestFixture类来设计某个类或某组相关功能的单元测试,Fixture定义公共函式setUp()初始化每个成员变数,tearDown()来释放setUp中使用的资源。在每个测试中,CPPUNIT_ASSERT(bool)来判断某个函式和表达式的正确性,在派生类的声明中,通过CPPUNIT_TEST来增加对应的测试函式,通过CPPUNIT_TEST_SUITE和CPPUNIT_TEST_SUITE_END来分装所有的测试函式,规定这些测试函式执行的顺序.
框架
1)CppUnit核心部分(core)
- 基本测试类:Test,TestFixture,TestCase,TestSuite
- 测试结果记录SychronizedObject,TestListener,TestResult
- 错误处理:TestFailure,SourceLine,Execption,NotEqualException
- 断言:Asserter,TestAssert
2)输出部分(Ouput)
- 基本部件:Outputter,TestResultCollector
- 衍生类:TestOutputter,CompilerOutputer,XmlOutputer
3)辅助部分(Helper)
TypeInfoHelper,TestFactory,TestFactoryRegistry,NamedRegisters,TestSuiteFactory,
TesSuiteBuilder,TestCaller,AutoRegisterSuite,HelperMacros.
4)扩展部分(Extension)
TestDecorator,RepeatedTest,Orthodox,TestSetUp
5)监听者部分(Listener)
TestSucessListener,TextTestProgressListener,TextTestResult
6)界面部分(UI)
TestRunner(TextUI,MfcUI,QtUI)
7)移植(Portabilty):OStringStream
使用
一个CppUnit版的Helloworld
/Program:testcppunit.cpp -- a simple hellow example which use the cppunit tool/#include <iostream>#include <cppunit/TestRunner.h>#include <cppunit/TestResult.h>#include <cppunit/TestResultCollector.h>#include <cppunit/extensions/HelperMacros.h>#include <cppunit/BriefTestProgressListener.h>#include <cppunit/extensions/TestFactoryRegistry.h>class Test : public CPPUNIT_NS::TestCase{ CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST(testHelloWorld); CPPUNIT_TEST_SUITE_END(); public: void setUp(void) {} void tearDown(void) {} protected: void testHelloWorld(void) { std::cout << "Hello, world!" << std::endl; }};CPPUNIT_TEST_SUITE_REGISTRATION(Test);int main( int argc, char argv ){ // Create the event manager and test controller CPPUNIT_NS::TestResult controller; // Add a listener that colllects test result CPPUNIT_NS::TestResultCollector result; controller.addListener( &result ); // Add a listener that print dots as test run. CPPUNIT_NS::BriefTestProgressListener progress; controller.addListener( &progress ); // Add the top suite to the test runner CPPUNIT_NS::TestRunner runner; runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() ); runner.run( controller ); return result.wasSuccessful() ? 0 : 1;}
编译命令: gcc -o testcppunit testcppunit.cpp -lcppunit (如果是VC/windows的话,使用cl 代替gcc--注意要配置cl的环境变数才可以在cmd命令行下使用。,也可以使用VC6.0的集成环境来测试.)
运行结果:
Test::testHelloWorldHello,world!
:OK
深入学习
介绍一些扩展阅读资料:
- CppUnit 快速使用指南
- CppUnit原始码解读