CPPUNIT的运用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CPPUNIT概述
几乎每个开发人员都写过测试代码,但是往往这些代码不系统,也没有良好的管理,同时在测试代码编写过程中也有很多重复的劳动,比较繁琐。
在一个软件开发过程中,往往会进行很多修改,迭代开发的模型随处可见,如何验证程序的功能、性能和结构是否符合要求是一项重要的工作。
单元测试是属于白盒测试和结构性测试,一般由开发人员开展,当然如果有好的测试工具支持,测试人员甚至最终用户都可以参与。
单元测试框架是编写和运行单元测试的软件工具,用来构建测试、运行测试、报告测试结果。
对于c/c++开发,比较著名的收费单元测试工具是C++ T est,免费开源的则是CPP UNIT。
CPPUNIT是基于LGP L 的开源项目,最初版本移植自JUNIT ,是一个非常优秀的开源测试框架。
CPPUNIT和JUNIT 一样主要思想来源于极限编程。
主要功能就是对单元测试进行管理,并可进行自动化测试。
CPP UNIT设计遵循很多设计模式,代码结构也相对好理解。
下面CPPUNIT的类关系图(只列出主要的类)
CPPUNIT类图分析
测试对象族
在CppUnit的框架中,测试类分为两种,某些测试类代表单个测试,比如TestCase(测试用例),另一种则由若干测试类共同构成,比如TestSuite(测试包)。
TestSuite可以嵌套包含。
1. Test:所有测试对象类的抽象基类,主要是定义run方法和统计子对象个数和查找遍历子对象的方法;
2. TestFixture:该类非常简单,只定义了两个方法setUp和tearDown,作为测试对象的准备和拆除方法,一般用
户编写的测试类都直接继承它;
3. TestComposite、T estLeaf:根据设计模式中组合模式而设计的两个类,都继承自T est;
4. TestSuite:具体化了T estComposite的内容存储方式、添加子对象接口等等。
该类对象包含了若干测试对象,作
为测试对象的容器,而且可以嵌套;
5. TestRunner:控制测试对象的构造和测试对象执行的类;
6. TestCase:定义了一个测试对象要实现的具体接口,同时继承T estFixture的setUp和tearDown;
7. TestCaller:使用了设计模式中的策略模式,作为测试对象的最终封装类,提供了测试运行的策略,在测试执行
中扮演了重要的角色。
它是一个模板类。
测试对象管理族
通过以下管理类,可以把测试用例嫁接到用例树上,CPPUNIT还提供一个可视的图形工具,便于使用者观察测试用例的情况。
1. TestFactory:运用了设计模式中工厂设计模式,这里只定义了一个makeT est方法,是一个抽象基类;
2. TestSuiteFactory:该类继承自T estFactory,而且是模板类,是生成T estSuite对象的工厂;
3. TestFactoryR egistry:管理T estFactory对象的类(这里继承T estFactory);
4. AutoRegisterSuite:模板类,自动把特定的T estSuiteFactory对象注册到T estFactoryRegistry对象;
5. TestSuiteBuilderContextBase、T estSuiteBuilderContext:用于构建测试对象的类。
这边还有一个非常重要的对象族没有提及,它们是用来输出错误的,称为信息收集与显示族,CPPUNIT提供多种方法向外输出错误,例如以文本流输出、XML格式的,还能以编译器信息类似方式输出测试信息。
当然CPPUNIT是开源的,只要了解它的代码,就可以自己去改造它。
例如,如果觉得输出的信息的格式或者输出的路径不满足我们的需求,你就可以继承TestListener来实现这些功能。
CPPUNIT安装与运用
1.首先到/projects/cppunit/上下载CPPUNIT测试框架的源代码。
CPPUNIT提供两套框架库,一个是静态的LIB,另一个是动态的DLL,可以根据具体的需求选择一种,为了方便,一般我们把lib和dll拷到我们的LIB文件夹下。
除了基于文本的测试环境,源代码中还提供一个TestRunner,它输出一个dll,提供一个基于GUI 方式的测试环境。
2.解压下载下来的文件,打开cppunit\src\CppUnitLibraries.dsw(注意:公司使用的STL
不一定是微软标准的STL,可能是STLPORT。
所以可能要把STLPORT引入,在VC的Project\Settings\C/C++下的Additional include directories,加入STLPORT的文件),进行编译,拷贝头文件、lib和dll到我们的开发环境中。
3.打开我们自己的工程,打开RTTI开关。
到这边,CPPUNIT的安装就完成了。
接下来就
是如何运用CPPUNIT。
上面介绍的很多关于CPPUNIT的类,让人看了很繁杂,不大好理解,所以CPPUNIT提供一系列功能强大的宏。
在编写代码时,一般这些宏就够用了。
1)首先先建一棵测试树,CPPUNIT提供多个宏,这边我使用
CPPUNIT_REGISTRY_ADD_TO_DEFAULT(“模块名”),这样就可以把工程中的各个模块
加入到这个测试树中。
2)分别为每个模块写一个测试用例,这个测试用例要继承于TestFixture。
然后在类定
义中,加入CPPUNIT_TEST_SUITE(类名),这边不加引号,并且类名要与上面的模块
名相同。
使用CPPUNIT_TEST_SUITE就把这个测试用例(结点)挂到测试树上了。
再在
这个结点上挂上测试函数,用CPPUNIT_TEST(“函数名”)。
最后以
CPPUNIT_TEST_SUITE_END()结束。
3)所有函数都挂载后,最后就是递归运行这棵测试树了。
首先创建一个TestResult,
在运行中,所有错误都会被TestResult捕捉,如何把这些错误输出,就要用
TestOutputter来输出。
当然,CPPUNIT还有其他方法,还有待我们进一步进行理解。
参考文献《CPPUINT》。