调测工具VcTester攻略之
搭建运行环境
作者:网际游民,成稿于2010年1月
关于VcTester工具
VcTester由ezTester公司推出,是业界众多VC调测辅助工具中功能最强悍的一款,为准确起见,我还是加上“之一”后缀,尽管VcTester很强,但仍有适用性限制,并非所有Visual C/C++代码在VcTester中都工作得很好(下面还有介绍),另外,本人尚不清楚今后是否还会冒出比VcTester更强的工具。
集众多工具的优势于一身是VcTester一个显著特色,在源代码编辑方面,VcTester与Source Insight有得一比,大体是SI提供功能更多、更丰富些,但VcTester的功能要精巧些,集成度更高些。在提示输入方面,包括键入单词的步随提示,数据结构或类成员提示输入,函数参数信息提示等,VcTester比Visual Assist的智能程度更高些,当然Visual Assist嵌入到VC的IDE中使用,是两个厂家提供功能,两者之间难有深层次互动,VcTester则使用自有IDE,与代码风险检查器、覆盖率插装等功能互为支援,在识别不同上下文环境并提供更准确信息方面做得更细致。
VcTester的脚本化调测驱动与脚本桩是独有功能,至少,本人尚未发现业界有类似工具出现,这两项应该是VcTester的最大亮点吧。简单来说,在VcTester中把被测程序运行起来后,用脚本可以把被测系统中变量的值修改掉,也可以用脚本将被测函数直接调起来,还可以写一个脚本函数,在线的替代被测的C/C++函数,比较神奇!不清楚它是怎么做到这一点的。我勉强拿CppUnit与VcTester作对比,但又觉得这两者完全不同,CppUnit用C++写测试用例,它与C++编程没太大区别,少不了编译链接,而VcTester用脚本写用例,写完后立即执行,立即看到运行效果,具有强烈的即兴操作风格。还有MOCK对象,尽管也起到打桩的作用,但理念很不相同,用惯MOCK桩后切换到脚本桩,思维方式会闹别扭,而用惯脚本桩后,又打心底瞧不上MOCK这种怪胎式做法。
以上权当VcTester的扼要介绍,相比ezTester的官方文档,随意了点,阅读官方材料可能半天不知所云,我拿几个现成工具作比较,先给大家一个大致的概念。
关于这个工具,还得补充一句,数年来大家一直找不到VcTester最新版本,从V2.2.0开始,VcTester就封闭起来只对商业用户开放了,在网上只能找到三年前的版本(VcTester V2.1.4),目前VcTester已发展到V5.1,从5.1起ezTester公司重新向公众开放一个可免费体验的版本(VcTester Mini),请到www.ezTester.com下载最新版本,本系列文章就是基于这个Mini版展开介绍的(老版本太陈旧,就别用了J)。
关于本系列文章
自从一年前我第一次接触VcSmith与VcSmart工具时,就被它精练实用的语言映射技术所吸引,我拿它配合VC做开发用得很顺手,很早就想写点东西,总结一些经验分享出来,因为工作忙没顾上写,直到上个月我从事的项目终于收尾了,晚上不必加班,我才倒腾出一点时间。恰巧,这时VcTester Mini发布了,终于有免费体验的新版本了,欣喜之余我把原计划写一篇文章改成写一个系列,写作时间拉长,内容更充实些。
初步设想是在这系列文章中逐次描述本人曾经历的应用体验,有一些与本人前阶段的工作有关,我用VcSmith辅助我们的项目开发已有半年,有一些实际使用经验,另一些则是本人业余爱好,喜欢琢磨点东西,像API测试、数据驱动测试体系,ezTester没提供相关材料(或许有,但我不是他们的商业客户),是我自己琢磨出来的,如果大家第一次看到此类应用,就追认我为创始人吧J。多说一句闲话,ezTester似乎该多提供一些应用实例,单有用户手册是不够的。
上面提到VcSmith、VcSmart,可能大家一头雾水,这与VcTester有什么关系?我先说明一下,VcSmith与VcSmart是VcTester的共享版,VcTester近半功能已在VcSmith中公开,而VcSmart则是VcSmith的精简版本。脚本驱动在VcSmith中是完整的,但脚本桩缺失,随着VcTester Mini版本推出,脚本桩也能免费体验了。本系列文章中有近半内容与脚本桩相关,这也是ezTester公开Mini版后,我才决定将一篇改成一个系列的原因。
本系列文章罗列如下:
《调测工具VcTester攻略之:搭建敏捷开发环境》
《调测工具VcTester攻略之:使用快捷编辑功能》
《调测工具VcTester攻略之:快速定位问题》
《调测工具VcTester攻略之:敏捷开发方式下调测组织过程》
《调测工具VcTester攻略之:脚本驱动API测试》
《调测工具VcTester攻略之:使用脚本桩构造数据驱动测试》
撰写本系列文章时得到ezTester技术专家Sundy多次帮助,在此谨表感谢!
VcTester适用性
VcTester只能与Visual C/C++配套使用,被测工程既可以是C代码,也可以是C++代码。据推测,VcTester有不少功能依赖于VC的调试数据库(PDB文件),所以离开VC编译环境,这个工具估计不会这么好用。
VcTester支持的VC6、VC7(即Visual Studio 2003)、VC8(即Visual Studio 2005)、VC9(即Visual Studio 2008)各个版本。据本人验证,如果您的代码越接近于C语言,VcTester用得就越爽,越玩高级C++特性,用VcTester就没那么爽了,VcTester明确不支持对C++的动态数据类型RTTI、模板Template实施映射,另外,C++的inline风格的函数、fast call风格的函数、操作符重载函数,VcTester也不支持映射。对未支持的C++特性的使用影响限于如下几个方面:
1、 某些变量或函数不能解析,所以在提示输入或函数调用图中找不到。此项影响甚小,VcTester对不能解析的符号只是简单忽略,编码时缺点辅助信息提示您而己。
2、 对未支持映射的变量,不能用脚本读它的值,写它的值,对未支持映射的函数,不能用脚本发起调用、不能打脚本桩。局部未支持映射的符号,不会扩大到其它地方,比如某个类方法被编译成inline函数,VcTester无法支持用脚本调用这个类方法,但该类的其它类属性或类方法仍正常支持脚本化操作。
如果被测VC工程涉及一些上面介绍的VcTester支持不到的特性,您应进一步分析相关代码是不是当前调测要关注的,如果调测时您根本用不到这些未持映射的变量或函数,那么,VcTester仍非常适用,因为您关注范围内的变量与函数都正常被映射,用脚本可以正常发起调测。如果您的被测代码使用少量template模板、操作符重载等特性,这时,VcTester是否适用取决于:无法用脚本操作这些不支持映射的变量与函数,对您的调测工作影响有多大。
VcTester提供的功能还算丰富,您可以浅层次简单使用这个工具,也可以深入研究,发展出一套适用自身企业的敏捷开发平台体系。浅层次应用包括:
Ø VcTester提供了一套不错的IDE环境,您可以将日常编码工作挪到VcTester。
Ø 用VcTester构造调试环境,拿脚本构造一些测试数据,再用脚本发起函数调用。
Ø 借助VcTester构建规范的白盒测试过程,VcTester支持测试集与测试例的工程化管理。
深层次应用包括如下几个方面(可能不全面,恕笔者研究还不够深入):
Ø 实施白盒覆盖率测试,VcTester宣称完整支持第4代白盒测试方法。
Ø 构造API测试与业务自动化测试体系,包括数据驱动测试、表格驱动测试、ActionWord驱动测试等。
Ø 构建一套以持续集成、每日构建、测试先行等为特征的敏捷开发平台。
Ø 让Scrum敏捷实践在C/C++项目落地,ezTester倡导的周演制度属此类应用。
Ø 脚本化开发,以脚本为主体实施开发,脚本最终翻译为C++代码用于产品发布,此项CSE网站称之为“扁平化开发体系”,但资料欠缺,尚不清楚其具体内涵。
总之,简单来看,VcTester提供了与Source Insight、Visual Assist、CppUnit、CSE等工具对等的功能,是这些工具所提供功能的一个综合体。但VcTester绝非只是叠加某些工具的功能,重要的是,它承载了一套基于敏捷实践的研发理念,这才是本人看好VcTester发展前景的根本原因。
搭建一个简单到不能再简单的调测环境
先安装VcTester Mini V5.1版本,下载版本后,运行安装程序,接受许可协议,如下图:
之后按缺省配置,一路按“下一步”完成安装即可。
然后我们在VC中创建一个简单的被测工程,这里以VC6为例,创建一个工程名为test控制台项目,添加一个被测C++文件(root.cpp),该文件源码如下:
这里我们定义一个全局变量iForTest,一个函数MyAdd,后面我们将用这个变量与这个函数做演示。入口函数main仅让控制台程序挂起,等待用户键入一个字串后退出。之后在Debug模式下编译该工程,生成被测程序test.exe。如下图:
之后,启动VcTester安装目录下的VcSmart.exe程序,VcSmart是VcTester的精简界面版本,在其主界面,我们先启动刚才生成的被测程序test.exe,点击“Run target application”按钮 ,弹出如下对话框:
指定被测的EXE程序(如果需要,还可再指定它的启动参数与工作目录)后,点OK按钮关闭对话框即启动被测的test.exe程序。之后,被测程序自动与VcSmart界面建立通信联接。我们的被测代码中没额外附加代码,只要在VcSmart中启动被测程序(要求是Debug模式下生成的EXE程序),两者就能自动连接,神奇吧?更神奇的还在后面。
在VcSmart主界面,我们键入如下脚本“vd.iForTest”,然后选中这句脚本,按Ctrl+E快捷键,选中的脚本立即被执行,从打印信息中可看到这个iForTest变量的当前值为5。
iForTest是被测系统中的一个全局变量,被测变量与被测函数都映射到脚本的vd模块下,所以要用“vd.iForTest”表达这个映射变量。接着键入脚本“vd.iForTest = 3;”,选中这行脚本运行后再查看这个变量的值是否被改成3了。
调用从C/C++映射过来的函数也很简单,键入脚本“vd.MyAdd(3,7);”选中运行这行脚本,其计算结果是10,说明被测函数MyAdd用脚本成功调起来了。
![](http://hi.csdn.net/attachment/201003/10/54765_1268200960D633.jpg)
上面是最精简方式的脚本化调测环境搭建过程,您需要做的,只一件事:在VcSmart中把被测程序运行起来。至于如何编写调测脚本,VcSmart用户手册有详细介绍,您可以使用CSE脚本构造任意复杂的测试数据,调用任意被测函数来发起各种调试操作或测试操作。
是不是很神奇?从试用VcSmart、VcSmith,到VcTester,该系列产品曾多次让我觉得神奇,就说最近试用VcTester Mini,支持脚本打桩总得在被测代码中做点文章吧?插装改造、加个钩子什么的,偏不,被测代码一点不动,只须在VcTester中把被测程序启动起来,然后在IDE界面定义脚本函数就能替代被测C函数了,我心跳加速,一种被黑客的感觉就地升起。
根据经验,我建议不要在被测程序的main函数里做太多事情,像上面举例的那样,通常只须让程序挂起来(等待键盘输入),程序启动后,无论接下来要做调试还是做测试,都依次用脚本调用被测系统的各项初始化函数,让程序初始化过程也用脚本来控制。这么做的好处是,让调测脚本具备更强的自动控制能力,以便构造各式各样的运行环境。
从VC工程导入VcTester集成环境
VcSmart只有简单界面,不具备集成IDE的功能,现在我们将VC工程导入到VcTester集成IDE界面(即CseWin.exe程序)中,在CseWin中建立工程,常规的编译链接操作,如build、build all、clean,启动被测程序等都集成到CseWin的IDE环境中,让日常编码、调试与测试工作都在VcTester的IDE中完成。
详细导入过程在VcSmith用户手册的基础篇“3.2创建VcSmith工程”中有介绍,下面我扼要讲述其操作过程。
第一步,在VC中按Debug模式生成被测EXE程序,然后运行CseWin.exe主界面的“File | Create project from EXE”菜单,指定这个被测程序。
第二步,系统自动分析出被测程序都包括了哪些被测C/C++源文件,我们选中要导入的源文件,然后再指定相关头文件。
第三步,指定与VC编译环境相关的配置。
经过上面几步操作,被测工程就导入到VcTester的集成环境中了。如下图:
验证一下导入的工程能否工作,不妨点击Preprocess build按钮 ,看看能否编译被测程序,之后点击run按钮 ,应能启动被测程序,之后VcTester与被测程序应该自动建立通信连接。
调整工程配置
如果经上面导入操作后,工程如果不能正常编译,或者被测程序不能正常启动,请检Option对话框中Build页的相关配置。
上图Compile选项描述编译VC工程的指令,格式为:
cmd.exe /c "call "%Vc6Env%" && msdev "%CseProjDir%/demo6.dsw" /MAKE "demo6 - Debug" /build"
cmd.exe是Windows的DOS控制台程序,“/C”指示DOS程序要执行的指令,“&&”连接两条指令,这里是先后分别执行“call "%Vc6Env%"”与“msdev "%CseProjDir%/demo6.dsw" /MAKE "demo6 - Debug" /build”,前一指令调用VC的环境变量批处理文件,即VcVars32.bat,后一指令是调用VC命令行方式下build指令。
除了上述Compile选项,您还可核对clean、build all等外部命令,请检查User Tool页下的相关配置,选中一条外部扩展命令后,点Modify按钮即可进入编辑,如下图:
集成外部工具
VcTester没提供二进制文件编辑器功能,而我在项目开发中经常要编辑一个数据文件,经常要手忙脚乱的切换到资源管理器,找到文件再用UltraEdit打开编辑。后来,我把UltraEdit工具集成到VcTester的IDE环境中,用起来就方便多了,该扩展命令在VcTester中配置如下图:
UltraEdit集成进来后,在VcTester主界面的文件树中选择待编辑的文件节点,然后点 快捷按钮(这个按钮图标由上面Image file配置项指定)便打开二进制编辑器了。
上面介绍的UltraEdit集成只是个例子,许多外部工具都可以方便的集成到VcTester中,比如,导入VC工程后,VC的build、clean等操作也是通过这个机制集成进来的。更详细信息请参考VcSmith用户手册提高篇中的“6.外部工具集成”,手册已介绍Pclint工具、VLD内存泄露检测工具、VSS版本机等工具如何集成到VcTester或VcSmith环境中。
构造敏捷开发环境的必备要求
VcTester非常适合于敏捷开发,当您选择“代码写一点测一点”的开发方式时,编程习惯将发生很大变化。研发中的产品随时可运行、可调试、可测试,测试用例随时跟进,研发过程中的产品始终保持较高的稳定性,此时,调测行为由原先调试器下的单步跟踪,转变为一次次由脚本驱动的产品试运行过程。VcTester工具很好的迎合了这些变化,本系列后续文章,如《VcTester攻略之使用快捷编辑功能》、《VcTester攻略之快速定位问题》还有介绍。
为适应敏捷化开发要求,根据笔者经验,您的开发环境或开发平台应具备如下能力:
Ø 提供一个集编辑、调试、测试为一体高效工作平台
在常规开发模式下,集中一段时间编码,编码完成后集中一段时间做测试,然后集中一段时间与他人联调,之后进入系统测试,这时,开发平台集成性高不高并不重要,因为某段时间内你只做一件事,要么编码,要么调试,要么生成release版本进入黑箱测试,所以,您完全可以在Source insight下编码,用VC做调试,再找专用工具做测试。
但在敏捷开发模式下,代码写一点测一点,编码、调试与测试操作高度耦合,一轮一轮快速迭代前进,其一次迭代消耗的时间长短直接决定敏捷开发模式能否取得成功,这时,是否有编码与调测高效融为一体的平台就显得非常重要。况且,当前整个业界在C/C++推行敏捷的成功率偏低,敏捷实践远没有在java、C#项目更容易取得成功,瓶颈就在于,C/C++的一次迭代过程达不到必要的敏捷程度,耗费时间偏长。
Ø 须有高效实施调测的手段
单步跟踪是低效的,且不能重用,依赖单步调试保证产品质量的研发过程是不可能实施敏捷流程的。
调试与测试应一体化解决,最好是调测都由脚本来驱动,用脚本构造各种调试运行环境,由脚本发起调试,这些脚本应能直接在自动测试中重用。如果能做到这一点,测试随时跟进不再是梦想,而是必备条件(如果有谁不随时跟进,他将付出更高代价,导致产品延期、质量低下)。
Ø 保障自动构建与自动测试
在Windows平台下做VC开发,哪怕不用任何工具,写批处理bat文件都能做到代码自动check in到版本机,从版本机自动check out,自动编译、链接,自动启动测试。
保障自动构建与自动测试,是支持每日构建、冒烟测试、自动回归测试等实践的基础。此项属基本要求,做到并不难。
以上概括了构造C/C++敏捷开发平台的通用要求,至于如何在VcTester中落实,描述起来比较琐碎,这里不再一一展开说明,有关内容散见于本系列的后续文章中,请继续阅读。
相关文章:
《调测工具VcTester攻略--敏捷开发方式下调测组织过程》
《调测工具VcTester攻略--使用脚本桩构造数据驱动测试》