C++单元测试工具之CPPUnit使用

摘要:
CppUnit[1]是JUnit根据GNULGPL条约从MichelFeathers移植的C++单元测试框架,并在sourcefogre网站上开源。此Linux版本的cppunit安装和编译成功。测试fibonacci==9,结果如下。4.cppunit在linux下使用斐波那契测试并安装cppunit后,首先创建斐波那奇类的头文件和cpp文件,然后创建测试类的头和cpp,并添加一个main,如下所示。cpp的以下编译结果报告错误。将cppunit的头文件复制到系统路径(原因:#include直接转到系统指定的某些目录以查找一些头文件。

CppUnit[1]是Micheal Feathers由JUnit移植过来的一个在GNU LGPL条约下的并在sourcefogre网站上开源的C++单元测试框架。(转自百度)

本文是对cppunit的一个初步体验,将分别在windows 7和ubuntu 12上进行尝试

文章本着极端细致的原则,力求让每个第一次接触的人都能按照教程完整实现,同时文章也贴出了在这过程中所遇到的问题及其解决方法

本文写于几个月以前,现整理发表于本博客,有点粗糙,还烦见谅

如果影响阅读,还请指出

1.首先来段windows版cppunit安装教程:

1)首先下载cppunit最新版本(cppunit-1.12.1.tar.gz),解压(如E:ProgramFiles),文件夹目录如下

C++单元测试工具之CPPUnit使用第1张

2)对于vs2010,需要进行如下修改

(1)修改目标文件名

进入cppunit目录下src文件夹,用vc程序(vs2010)打开CppUnitLibraries文件,提示需要转换,选择转换,对于vs2010,需要进行额外的对目标文件夹的修改。

右键cppunit,选择属性,在弹出窗口将目标文件名由$(ProjectName)改成$(ProjectName)d,如下

C++单元测试工具之CPPUnit使用第2张

同样的将cppunit_dll的目标文件名改成cppunitd_dll

C++单元测试工具之CPPUnit使用第3张

将DllPlugInTester改成$(ProjectName)d_dll

将TestPlugInRunner的改成$(ProjectName)d

将TestRunner的改成$(ProjectName)d

(2)修改DSPlugin

右键属性à配置属性à链接器à高级à无入口点,由“否”改成“是(/NOENTRY)”,如下

C++单元测试工具之CPPUnit使用第4张

(3)最后再修改TestRunner

在vs中打开TestRunnerUserInterface MsDevCallerListCtrl.cpp,在67行中将version由7.0改成8.0,如下

C++单元测试工具之CPPUnit使用第5张

3)接下来编译生成lib库

在vs中选择生成-->批生成,全选后点击生成,如下

C++单元测试工具之CPPUnit使用第6张

过一会,等待编译结束,这过程可能会有一些提示说错误或失败,不用管,最后我的编译结果如下

C++单元测试工具之CPPUnit使用第7张

进入cppunit-1.12.1lib文件夹,出现如下即可(我们在使用时主要使用cppunitd.lib,所以这个库文件一定要有)

C++单元测试工具之CPPUnit使用第8张

到此windows版cppunit安装编译成功。

2. linux版cppunit安装:

首先下载cppunit-1.12.1.tar.gz,接下来按下图配置(如果直接./configure会如下报错)

(../../src/cppunit/.libs/libcppunit.so: undefined reference to`dlsym' 

../../src/cppunit/.libs/libcppunit.so:undefined reference to `dlopen' 

../../src/cppunit/.libs/libcppunit.so: undefined referenceto `dlclose')

C++单元测试工具之CPPUnit使用第9张

然后make, make install即可。

到此linux版cppunit安装编译成功。

3. windows版 cppunit使用案例

1)cppunit自带测试example

打开cppunit-1.12.1examplesmoney文件夹的money.dsw文件

修改项目目标文件名

右键money工程名,配置属性-->常规-->目标文件名,将$(ProjectName)改成$(ProjectName)d

运行money工程。F5或ctrl+f5调试,出现如下即ok

C++单元测试工具之CPPUnit使用第10张

2)  编写一个简单的Fibonacci的测试

(1)在vs2010中新建一个项目,配置如下

C++单元测试工具之CPPUnit使用第11张

在工程中添加被测类的头文件和cpp文件

C++单元测试工具之CPPUnit使用第12张

结果及这两个文件内容如下

C++单元测试工具之CPPUnit使用第13张

         到此被测函数的类就定义好了。

         (2)接下来再添加一个用来测试Fibonacci类的项目,如下

 C++单元测试工具之CPPUnit使用第14张

C++单元测试工具之CPPUnit使用第15张

(3)接下来首先在vs2010中配置测试项目的属性:

右键测试项目(test_Fibonacci),选择属性,添加cppunit的库文件和lib路径

C++单元测试工具之CPPUnit使用第16张

两个都配置好后,内容应该如下

C++单元测试工具之CPPUnit使用第17张

最后再添加cppunitd.lib链接库,如下,确定即可

C++单元测试工具之CPPUnit使用第18张

(4)      在测试项目(test_Fibonacci)中添加刚刚在项目Fibonacci项目中新建的两个文件(fibonacci.h和fibonacci.cpp),添加后效果应该如下

C++单元测试工具之CPPUnit使用第19张

这样在头文件中便包含了要测试的Fibonacci.h,源文件包含Fibonacci.cpp文件

(5)      编写测试类头文件和cpp文件

添加测试类头文件和cpp文件,如下图所示

C++单元测试工具之CPPUnit使用第20张

test_Fibo.h和test_Fibo.cpp内容如下

C++单元测试工具之CPPUnit使用第21张

(6)      最后在test_Fibonacci.cpp中编写main函数,如下

C++单元测试工具之CPPUnit使用第22张

将test_Fibonacci项目设为启动项目,右键test_Fibonacci项目,选择“设为启动项目”。运行结果如下

C++单元测试工具之CPPUnit使用第23张

考察如果结果不对,会不会报错?

测试fibonacci(5)==9,则结果如下

C++单元测试工具之CPPUnit使用第24张

 到此win下使用结束

4. linux下cppunit使用Fibonacci测试(可先见win下cppunit使用)

(1)安装完cppunit后,首先同样新建Fibonacci类的头文件和cpp文件,如下

C++单元测试工具之CPPUnit使用第25张

(下图内容应修改成红框所示,下同)

C++单元测试工具之CPPUnit使用第26张

(2)然后再新建测试类的头文件和cpp文件,如下

C++单元测试工具之CPPUnit使用第27张

C++单元测试工具之CPPUnit使用第28张

(3)再添加个main.cpp

C++单元测试工具之CPPUnit使用第29张

如下编译结果报错(其中gcc编译选项-L表示添加lib目录,-l表示添加include目录,-lcppunit表示在上述lib中寻找libcppunit.so动态库文件,如果加-static表示查找libcppunit.lib静态库文件)

C++单元测试工具之CPPUnit使用第30张

         将cppunit的头文件复制到系统路径(原因:#include <>直接到系统指定的某些目录中去找某些头文件。#include “”先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件)。然后再次编译,

C++单元测试工具之CPPUnit使用第31张

经过查看main.cpp发现CompileOutputter应该是CompilerOutputter(单词写错。。。),然后编译,报错undefined reference,如下

C++单元测试工具之CPPUnit使用第32张

这个是因为库文件未添加成功。

(补充头文件和库文件的搜索顺序:

头文件搜索顺序:

1.      由参数-I指定的路径(指定路径有多个路径时,按指定路径的顺序搜索)

2.      然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH

3.      再找系统内定目录

动态库的搜索路径搜索的先后顺序是:

1.      编译目标代码时指定的动态库搜索路径;

2.      环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.      配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.      默认的动态库搜索路径/lib;

5.      默认的动态库搜索路径/usr/lib。)

经过一番折腾后,原来是gcc命令的参数顺序不对,静态链接具体如下。

C++单元测试工具之CPPUnit使用第33张

添加动态链接:

(添加路径到环境变量命令

exportLD_LIBRARY_PATH=/usr/local/CPP/lib:$LD_LIBRARY_PATH)

C++单元测试工具之CPPUnit使用第34张

结果显示应该只执行测试了Fibonacci(3)==3,后面两个没有执行,于是修改成多个测试函数试试。修改test_Fibo.h和test_Fibo.cpp,如下

C++单元测试工具之CPPUnit使用第35张

C++单元测试工具之CPPUnit使用第36张

重新编译运行,结果还是一样,不知什么原因,似乎不是放在一个测试函数的原因。

经过一段时间的检查,终于发现问题,原来是main.cpp中未添加test_Fibo.cpp头文件,同时test_Fibo.cpp中也未添加正确的Fibonacci.cpp路径,其中也会报错undefined reference,经过以上修改后,再次编译运行,结果如下

C++单元测试工具之CPPUnit使用第37张

最后附上测试成功的完整代码,各文件内容具体如下

C++单元测试工具之CPPUnit使用第38张

C++单元测试工具之CPPUnit使用第39张

C++单元测试工具之CPPUnit使用第40张

C++单元测试工具之CPPUnit使用第41张

C++单元测试工具之CPPUnit使用第42张

免责声明:文章转载自《C++单元测试工具之CPPUnit使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇干掉微信小程序-解决点击(bindTap)和长按(bindLongTap)冲突N76E003之串口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

事务使用心得-事务隔离级别-DB2数据(一)

org.springframework.dao.DeadlockLoserDataAccessException: ### Error updating database.  Cause: com.ibm.db2.jcc.am.SqlTransactionRollbackException: DB2 SQL Error: SQLCODE=-911, SQ...

JUnit4总结

JUnit4使用要求: 测试方法必须使用@Test进行修饰 测试方法必须使用public void 进行修饰,不能带任何的参数 新建一个源代码目录来存放我们的测试代码 测试类的包应该和被测试类保持一致 测试单元中的每个方法必须可以独立测试,测试方法不能有任何的依赖 测试类使用Test作为类名的后缀 测试方法使用test作为方法名的前缀 注意:3,6,7...

单元测试框架TestNg使用总结

工欲善其事,必先利其器 单元测试的重要性是不言而喻的。但如果没有好的单元测试工具,是无法激起开发人员的欲望。 Testng便是利器之一。TestNG是基于Annotation的测试框架的先驱,他拥有通过添加诸如灵活的装置、测试分类、参数测试和依赖方法等特性来克服JUnit3的一些不足之处。下面我将总结一些TestNg的重要特性。 关于testng.xml...

关于在vue里使用脚手架空行、空格会报错的问题

第一种方法:   重新用脚手架安装项目,在命令行里选择Use ESLint to lint your code?这项是输入  n   第二种方法: 找到build文件夹下的 webpack.base.config.js文件 打开注释到下面一段代码, var path = require('path')var utils = require('./utils...

企业级虚拟化实战之KVM——虚拟机迁移

迁移概述 系统的迁移是指把源主机上的操作系统和应用程序移动到目的主机,并且能够在目的主机上正常运行 在没有虚拟机的时代,物理机之间的迁移依靠的是系统备份和恢复技术。在源主机上实时备份操作系统和应用程序的状态,然后把存储介质连接到目标主机上,最后在目标主机上恢复系统。随着虚拟机技术的发展,系统的迁移更加灵活和多样化。 迁移的目的: 简化系统维护管理 提高系...

深入浅出Node.js(上)

(一):什么是Node.js Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹。从在github的访问量超过Rails,到去年底Node.jsS创始人Ryan Dalh加盟Joyent获得企业资助,再到今年发布Windows移植版本,Node.js的前景获得了技术社区的肯定。InfoQ一直在关注Node.js的发展,在今年的两次...