VS2005下使用CPPUNIT进行单元测试(全过程)

来源:互联网 发布:校园网络系统建设方案 编辑:程序博客网 时间:2024/05/22 10:50
 一、单元测试与CPPUNIT简介

  几乎每个开发人员都写过测试代码,但是往往这些代码不系统,也没有良好的管理,同时在测试代码编写过程中也有很多重复的劳动,比较繁琐。在一个软件开发过程中,往往会进行很多修改,迭代开发的模型随处可见,如何验证程序的功能、性能和结构是否符合要求是一项重要的工作

  单元测试是属于白盒测试和结构性测试,一般由开发人员开展,当然如果有好的测试工具支持,测试人员甚至最终用户都可以参与。单元测试框架是编写和运行单元测试的软件工具,用来构建测试、运行测试、报告测试结果。对于C/C++开发,比较著名的收费单元测试工具是C++Test,免费开源的则是CPPUNIT。

  CPPUNIT是基于 LGPL 的开源项目,最初版本移植自 JUNIT ,是一个非常优秀的开源测试框架。CPPUNIT和 JUNIT 一样主要思想来源于极限编程。主要功能就是对单元测试进行管理,并可进行自动化测试。CPPUNIT设计遵循很多设计模式,代码结构也相对好理解。

  二、CPPUNIT安装、使用和框架

  1. 安装

  CPPUNIT的主页是http://sourceforge.net/projects/cppunit/,从这里可以获取它的源代码cppunit-1.12.1.tar。安装过程如下:

  1).解压 cppunit-1.12.0.tar.gz到C:\cppunit-1.12.1;

  2).打开src/CppUnitLibraries.dsw,如果是VC 7及以上版本,会有一个对话框询问是否将工程转换成更高版本,选择“Yes to all”进行转换;

  3).打开“Build”菜单,选择“Batch Build...”,弹出“Batch Build...”对话框后点击“Select All”,然后Build。

               这里可以选择编译自己需要的版本Debug或者Release或者Unicode版本。

  a.链接过程中会报错:

  error C3505: cannot load type library '{80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2}'

  出错的文件是:src\msvc6\testrunner\MsDevCallerListCtrl.cpp。这是由于使用VC 8.0编译的缘故,需要修改一下它的源码,打开该文件,找到出错行(#67),将其替换为:

#if _MSC_VER >= 1400    // VC++ 8 or more
  //The following #import imports EnvDTE based on its LIBID.
  #import "libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0") lcid("0") raw_interfaces_only named_guids
  //The following #import imports EnvDTE80 based on its LIBID.
  #import "libid:1A31287A-4D7D-413e-8E32-3B374931BD89" version("8.0") lcid("0") raw_interfaces_only named_guids
  #else // vc7
  #import "libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("7.0") lcid("0") raw_interfaces_only named_guids
  #endif

  这里也是先编译如果没有提示可以不做修改,以实际编译是否提示错误为准。

        b.另外还有一个错误:error C1189: #error :  This add-in is for VC++ 6.0 only。发生这个错误的是工程“DSPlugIn”,这只是个插件,没有也不影响CPPUnit的使用,因此可以无视这条错误。再次编译,可以从lib文件夹中找到所有的静态库文件及动态库文件。

  4).将include和lib文件夹加入到VC++的环境中。打开:Tools|Options|Projects and Solutions|VC++ Directories,将这两个文件夹的路径分别加入到Include files和Library files中。最好再将lib文件夹加入到系统环境变量PATH中,这样就不用再将其中的动态链接库拷到工程目录下而直接运行单元测试了。至此,CPPUnit的编译安装就完成了。

  5).使用CPPUnitProjectWizard向导创建支持使用CPPUnit的测试类的Visual Studio 2005项目,用这个向导生成的代码,只是生成一个动态库,有DllPlugInTesterd_dll.exe来调取这个动态库测试,个人感觉用处不大。

  安装向导

  a. 下载 CPPUnitProjectWizard

  http://cppunit.sourceforge.net/cppunit-wiki/CppUnitVisualStudio2005Wizard?action=AttachFile&do=get&target=CPPUnitProjectWizard.7z

  b. 复制文件

  CPPUnitProjectWizard.vsdir  - 为向导命名

  CPPUnitProjectWizard.vsz    - 让VS8知道从哪里找到向导

  到您的Visual Studio 8安装目录下的 VCProjects 文件夹中,C:\Program Files\Microsoft Visual Studio 8\VC\vcprojects。

  c. 把整个CPPUnitProjectWizard解决方案文件夹复制到您的Visual Studio 8安装目录下的VCWizards文件夹中。

  比如,我放在c:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\CPPUnitProjectWizard\CPPUnitProjectWizard

  或者,也可以放在你想放置的其它地方,然后编辑CPPUnitProjectWizard.vsz,定义参数 ABSOLUTE_PATH

  Param="ABSOLUTE_PATH = c:\Program Files\Microsoft Visual Studio 8\VC\VCWizards\CPPUnitProjectWizard\CPPUnitProjectWizard"

  d. 该项目需要定义环境变量 CPPUNITDIR

  比如,我的环境变量 CPPUNITDIR= D:\cppunit-1.12.1

  最后,修改 环境变量 %PATH%,在PATH路径中,增加 %CPPUNITDIR%/lib,以便程序加载时能找到 cppunit_dll.dll

  e. 在开发环境中,设置好Include/Lib路径

  %CPPUNITDIR%\Include

  %CPPUNITDIR%\LIB


网上资料补充:

CppUnit在VS2010上的正确使用

CppUnitvs2008里是可以完全编译的了,不过我也是试了几次才行的。

先下个最新版cppunit-1.12.1.tar.gz解压缩,进入cppunit-1.12.1\src目录,就是源代码所在,打开CppUnitLibraries.dsw工程,是用vc6.0写的,转换到CppUnitLibraries.slnok,接着只需要修改一点点内容,删除掉解决方案下的DSPlugIn工程,修改TestRunnerUserInterface\DynamicWindow\MsDevCallerListCtrl.cpp文件第67行,改成"#import"libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0")lcid("0") raw_interfaces_only named_guids"。这样就可以了,点解决方案里的生成解决方案,等等等等....终于好了,生成文件自动拷贝到上级目录的lib下,一共7个文件,除了原始里面那个。(用debugrelease都可以的,默认是debug

cppunit-1.12.1\include加到vs里的选择“选项”标签里的包含文件,cppunit-1.12.1\lib加到库文件,lib想加到环境变量里也行,那样不用拷贝dll文件。

接着新建一个测试gui界面的vs c++2008 MFC对话框工程CSS_CPPUNIT,修改项目属性里的配置属性里的链接器,启动增量链接改为否。 修改CSS_CPPUNIT.cpp文件,改成这样

1、  上面的红色字体给出的是我在网上查到的最常见的介绍CppUnit在vs2008里编译的方法,但是我尝试了很多遍都没有编译成功,害的我最后还以为是cppunit-1.12.1在VS2010上不可以使用。最后被导师所逼不得不弄清楚到底是怎么一回事才一步一步的运行终于找到了正确的方法。当然因为还只是一个菜鸟级别所以有些方法还是很笨拙的,之所以想把它写下来是怕以后会忘记了!

2、  先下个最新版cppunit-1.12.1.tar.gz解压缩,进入cppunit-1.12.1\src目录,就是源代码所在,打开CppUnitLibraries.dsw工程,是用vc6.0写的,转换到CppUnitLibraries.sln ok,

3、  然后依次运行CppUnitLibraries.dsw工程下的每个项目,这样做的目的是为了方面发现问题和找到正确的解决方法。下面是我在运行相应项目时所提示的错误以及解决办法

1)       运行项目Cppunit


解决办法:

选择Cppunit右键属性 ->(debug)配置属性->常规->目标文件名:$(ProjectName)修改成cppunitd(这样做是为保持链接器->常规->目标文件名 一致);


2)       运行项目cppunit_dll


              解决办法:

    选择Cppunit右键属性->(debug)配置属性->常规->目标文件名:$(ProjectName)修改成cppunitd_dll(这样做是为保持库管理器->常规->目标文件名 一致);

    3)到这里这里会发现其实每个项目的错误基本上都是TargeName(xxx)LinkerOutputFile属性值不匹配;依次修改项目DllPlugInTesterDSPlugInTestPlugInRunnerTestRunnerDebug配置属性

    4)当然当修改完DSPlugIn的Debug配置属性后再运行我们发现


 我们仔细观察到底新的错误是什么呢?         

 这里修改方式就是最上面的红色字中提到的

修改TestRunnerUserInterface\DynamicWindow\MsDevCallerListCtrl.cpp文件第67行,改成"#import"libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0")lcid("0") raw_interfaces_only named_guids"

5)再次运行DSPlugIn项目我们会发现依然有错误

解决方法:

选择项目->属性->配置属性->链接器->高级->无入口点选择"(/NOENTRY)"

6)最后为了生成全面的库文件我需要分别在DebugreleaseDebug unicoderelease unicode四种配置属性中生成全部解决方案。(运行过程中会遇到错误基本上都可以从上文中找到解决方法)