C++单元测试工具之CPPUnit使用
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),文件夹目录如下
2)对于vs2010,需要进行如下修改
(1)修改目标文件名
进入cppunit目录下src文件夹,用vc程序(vs2010)打开CppUnitLibraries文件,提示需要转换,选择转换,对于vs2010,需要进行额外的对目标文件夹的修改。
右键cppunit,选择属性,在弹出窗口将目标文件名由$(ProjectName)改成$(ProjectName)d,如下
同样的将cppunit_dll的目标文件名改成cppunitd_dll
将DllPlugInTester改成$(ProjectName)d_dll
将TestPlugInRunner的改成$(ProjectName)d
将TestRunner的改成$(ProjectName)d
(2)修改DSPlugin
右键属性à配置属性à链接器à高级à无入口点,由“否”改成“是(/NOENTRY)”,如下
(3)最后再修改TestRunner
在vs中打开TestRunner\UserInterface\ MsDevCallerListCtrl.cpp,在67行中将version由7.0改成8.0,如下
3)接下来编译生成lib库
在vs中选择生成-->批生成,全选后点击生成,如下
过一会,等待编译结束,这过程可能会有一些提示说错误或失败,不用管,最后我的编译结果如下
进入cppunit-1.12.1\lib文件夹,出现如下即可(我们在使用时主要使用cppunitd.lib,所以这个库文件一定要有)
到此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')
然后make, make install即可。
到此linux版cppunit安装编译成功。
3. windows版 cppunit使用案例
1)cppunit自带测试example
打开cppunit-1.12.1\examples\money文件夹的money.dsw文件
修改项目目标文件名
右键money工程名,配置属性-->常规-->目标文件名,将$(ProjectName)改成$(ProjectName)d
运行money工程。F5或ctrl+f5调试,出现如下即ok
2) 编写一个简单的Fibonacci的测试
(1)在vs2010中新建一个项目,配置如下
在工程中添加被测类的头文件和cpp文件
结果及这两个文件内容如下
到此被测函数的类就定义好了。
(2)接下来再添加一个用来测试Fibonacci类的项目,如下
(3)接下来首先在vs2010中配置测试项目的属性:
右键测试项目(test_Fibonacci),选择属性,添加cppunit的库文件和lib路径
两个都配置好后,内容应该如下
最后再添加cppunitd.lib链接库,如下,确定即可
(4) 在测试项目(test_Fibonacci)中添加刚刚在项目Fibonacci项目中新建的两个文件(fibonacci.h和fibonacci.cpp),添加后效果应该如下
这样在头文件中便包含了要测试的Fibonacci.h,源文件包含Fibonacci.cpp文件
(5) 编写测试类头文件和cpp文件
添加测试类头文件和cpp文件,如下图所示
test_Fibo.h和test_Fibo.cpp内容如下
(6) 最后在test_Fibonacci.cpp中编写main函数,如下
将test_Fibonacci项目设为启动项目,右键test_Fibonacci项目,选择“设为启动项目”。运行结果如下
考察如果结果不对,会不会报错?
测试fibonacci(5)==9,则结果如下
到此win下使用结束
4. linux下cppunit使用Fibonacci测试(可先见win下cppunit使用)
(1)安装完cppunit后,首先同样新建Fibonacci类的头文件和cpp文件,如下
(下图内容应修改成红框所示,下同)
(2)然后再新建测试类的头文件和cpp文件,如下
(3)再添加个main.cpp
如下编译结果报错(其中gcc编译选项-L表示添加lib目录,-l表示添加include目录,-lcppunit表示在上述lib中寻找libcppunit.so动态库文件,如果加-static表示查找libcppunit.lib静态库文件)
将cppunit的头文件复制到系统路径(原因:#include <>直接到系统指定的某些目录中去找某些头文件。#include “”先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件)。然后再次编译,
经过查看main.cpp发现CompileOutputter应该是CompilerOutputter(单词写错。。。),然后编译,报错undefined reference,如下
这个是因为库文件未添加成功。
(补充头文件和库文件的搜索顺序:
头文件搜索顺序:
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命令的参数顺序不对,静态链接具体如下。
添加动态链接:
(添加路径到环境变量命令
exportLD_LIBRARY_PATH=/usr/local/CPP/lib:$LD_LIBRARY_PATH)
结果显示应该只执行测试了Fibonacci(3)==3,后面两个没有执行,于是修改成多个测试函数试试。修改test_Fibo.h和test_Fibo.cpp,如下
重新编译运行,结果还是一样,不知什么原因,似乎不是放在一个测试函数的原因。
经过一段时间的检查,终于发现问题,原来是main.cpp中未添加test_Fibo.cpp头文件,同时test_Fibo.cpp中也未添加正确的Fibonacci.cpp路径,其中也会报错undefined reference,经过以上修改后,再次编译运行,结果如下
最后附上测试成功的完整代码,各文件内容具体如下