博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

下一代C&C++测试框架TestNG++入门指导

Posted on 2010-05-22 17:18  sinojelly  阅读(2735)  评论(0编辑  收藏  举报
    xUnit框架改变了单元测试的历史,一时间,很多语言的多种单元测试框架蜂涌而至。
    发展至今,xUnit已经有很多年的历史了,炙手可热的JAVA测试框架JUnit也经历了JUnit2、JUnit3、JUnit4的发展历程,后来发展到了TestNG。身为中级语言的C/C++,虽然不具备JAVA语言的很多特性,比如反射,给测试框架开发带来一定困难,但它也毫不示弱,今年来出现了很多测试框架,比如CppUnit、UnitTest++、CppUTest、gtest、CxxTest等等,不仅如此,与Java世界的TestNG对应,C++世界中也有TestNG++(又称testngpp),它具备很多优秀的特质,比如:
(1)TestNG++支持任意字符作为用例名。gtest借助VC支持Unicode标识符,支持中文用例名,但这种方案存在固有缺陷,gcc是不支持标识符为Unicode字符串的,所以就无法使用这个特性,TestNG++巧妙的使用描述信息来标示用例,真正的用例标识符只是内部自动生成的毫无意义的名字,这使得用例可读性问题得到了很好的解决,而且这种方案完全是可以跨平台、跨编译器的。
(2)TestNG++支持Annotation、Tag等TestNG才具备的特征。
(3)TestNG++支持sandbox用例运行方式,每个用例都在独立的环境中运行,互不影响。
(4)TestNG++采用加载dll的方式运行用例,可以根据需要只加载需要测试的dll,避免了用例过滤的搜索时间。
(5)TestNG++的用例编写接口简单方便,把很多容易混淆的概念进行了巧妙的处理,避免使用者的记忆负担。比如:setup方法名字,各种不同的测试框架中有不同的定义,gtest中是SetUp,CppUnit中是setUp,TestNG++中把所有测试框架规定的关键字全作为宏封装起来,使用SETUP()宏即可。
(6)TestNG++使用CMake自动生成编译器对应的Makefile或者工程文件,支持几乎所有平台、所有编译器下的使用。
更多特性请参见:http://code.google.com/p/test-ng-pp/wiki/ChineseUserManual
    从技术的角度讲,TestNG++与CxxTest类似,也采用了Python解析用例的方法,这是因为C++不支持反射,只能通过解析用例代码的方法来具备一定的反射能力,这使得使用者必须先安装Python(目前使用的是Python 2.6版本)。
 
    本文以VC2008为例介绍testngpp的安装和使用方法。
 
准备活动
1、下载testngpp
该网站还有testngpp-msvc.pdf是很好的VC下使用testngpp的介绍文档,本文也是参考该文档实践成功之后所写。
另外,ChineseUserManual是很好的testngpp特性的介绍文档。
本文用到的工程类似的测试工程,网上也有下载:
http://code.google.com/p/testngpp-samples/
2、下载cmake
根据自己的需要下载相应的包即可,Windows下可以下载zip压缩的绿色版本。
3、编译并安装testngpp
(1)运行CMake中的bin\cmake-gui.exe,设置源代码路径为testngpp-1.0根目录,设置CMake产生的文件放置在build目录中(build目录会自动创建)。
(2)点击Configure。
弹出选择编译器的对话框,选择VC2008。
(3)一段时间之后,配置完成。
我这里存在告警,但不影响使用。
(4)再点击一次Configure,很快提示配置完成,并且Generate按钮变得可用。
(5)点击Generate按钮,生成sln和vcproj工程。
(6)用VC2008打开testngpp.sln。
(7)按F7编译解决方案。
(8)在INSTALL上点右键,编译,就可以把testngpp安装到C:\Program Files\testngpp目录(该路径在cmake中可设置)。
 
在项目中使用testngpp
一、被测工程
1、建立被测工程。
注意:
(1)工程类型为静态库。
(2)一般可以设置为不使用预编译头文件。
 
2、在被测工程目录下建立src和include目录。
源代码文件放在src目录中。
头文件放在include目录中。
编译过程中,可能需要搜索include下的头文件,所以一般要把include目录加入头文件搜索路径。
 
二、测试工程
1、建立测试工程。
注意:
(1)工程类型为动态库。
(2)创建为空的项目。
 
2、创建文件AllTests.cpp并加入测试工程。
其内容为:
#include "Sample1Test.cc"
注:Sample1Test.cc是自动生成的、可编译运行的用例。
把它包含进AllTests.cpp比直接把它加入工程要好,避免每次自动生成Sample1Test.cc之后,都要重新加载该文件。
 
3、配置测试工程的头文件包含路径。
包括被测工程对外公开头文件的目录,以及testngpp头文件目录、testngpp使用到的第三方库boost目录(主要用了boost的typeof实现)。
 
4、把testngpp.lib链接到测试工程。
配置testngpp.lib所在路径为库文件搜索路径:
 
5、配置Sample1Test运行时的命令行参数。
命令:C:\Program Files\testngpp\bin\testngpp-runner.exe
参数:$(OutDir)\$(TargetName) -L"C:\Program Files\testngpp\testngpp\listener" -l"testngppstdoutlistener -c -v"
注:参数中第一个是测试工程编译成的dll文件名;-L表示测试结果listener的dll所在路径;-l 表示使用哪一种结果输出的listener。
 
6、配置测试工程的自定义生成规则,以便根据测试文件(.h)自动生成Sample1Test.cc。
(1)项目上右键,选择“自定义生成规则”。
(2)新建规则文件。
注:如果已经创建过testngpp generator规则,则只需要把它勾上即可。该规则创建一次之后,就可以在任意解决方案中使用,当然需要注意是否能直接使用,可能需要编辑规则中的输出文件名。
(3)填写新建规则的名称、文件名、规则文件存放路径。然后点击“添加生成规则”。
(4)生成规则填写为如下图所示的样子。
命令行需要填写为:python.exe "C:\Program Files\testngpp\testngpp\generator\testngppgen.pyc" -e gb2312 -o Sample1Test.cc [inputs]
(5)最后,把TestGenerator勾上即可,它就在测试工程中生效了,编译的时候就会自动生成Sample1Test.cc 。
 
7、把被测工程编译生成的.lib链接到测试工程的dll中。
可以简单的设置Sample1Test依赖Sample1即可。
 
三、向被测工程添加被测代码。
这里是把已有的CBar.h等四个文件添加到被测工程。(当然也可以是你想编写的任何内容)
 
四、向测试工程添加测试代码。
测试代码写在.h文件中,参见下图。
 
五、编译运行。
按F7编译整个解决方案,然后再按Ctrl+F5即可运行用例。