Page1of13调测工具VcTester攻略之搭建运行环境密级:公开调测工具VcTester攻略之搭建运行环境作者:网际游民,成稿于2010年1月关于VcTester工具VcTester由ezTester公司推出,是业界众多VC调测辅助工具中功能最强悍的一款,为准确起见,我还是加上“之一”后缀,尽管VcTester很强,但仍有适用性限制,并非所有VisualC/C++代码在VcTester中都工作得很好(下面还有介绍),另外,本人尚不清楚今后是否还会冒出比VcTester更强的工具。集众多工具的优势于一身是VcTester一个显著特色,在源代码编辑方面,VcTester与SourceInsight有得一比,大体是SI提供功能更多、更丰富些,但VcTester的功能要精巧些,集成度更高些。在提示输入方面,包括键入单词的步随提示,数据结构或类成员提示输入,函数参数信息提示等,VcTester比VisualAssist的智能程度更高些,当然VisualAssist嵌入到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就封闭起来只对商业用户开放了,在网上只能找到三年前的版本(VcTesterV2.1.4),目前VcTester已发展到V5.1,从5.1起ezTester公司重新向公众开放一个可免费体验的版本(VcTesterMini),请到下载最新版本,本系列文章就是基于这个Mini版展开介绍的(老版本太陈旧,就别用了)。关于本系列文章Page2of13调测工具VcTester攻略之搭建运行环境密级:公开自从一年前我第一次接触VcSmith与VcSmart工具时,就被它精练实用的语言映射技术所吸引,我拿它配合VC做开发用得很顺手,很早就想写点东西,总结一些经验分享出来,因为工作忙没顾上写,直到上个月我从事的项目终于收尾了,晚上不必加班,我才倒腾出一点时间。恰巧,这时VcTesterMini发布了,终于有免费体验的新版本了,欣喜之余我把原计划写一篇文章改成写一个系列,写作时间拉长,内容更充实些。初步设想是在这系列文章中逐次描述本人曾经历的应用体验,有一些与本人前阶段的工作有关,我用VcSmith辅助我们的项目开发已有半年,有一些实际使用经验,另一些则是本人业余爱好,喜欢琢磨点东西,像API测试、数据驱动测试体系,ezTester没提供相关材料(或许有,但我不是他们的商业客户),是我自己琢磨出来的,如果大家第一次看到此类应用,就追认我为创始人吧。多说一句闲话,ezTester似乎该多提供一些应用实例,单有用户手册是不够的。上面提到VcSmith、VcSmart,可能大家一头雾水,这与VcTester有什么关系?我先说明一下,VcSmith与VcSmart是VcTester的共享版,VcTester近半功能已在VcSmith中公开,而VcSmart则是VcSmith的精简版本。脚本驱动在VcSmith中是完整的,但脚本桩缺失,随着VcTesterMini版本推出,脚本桩也能免费体验了。本系列文章中有近半内容与脚本桩相关,这也是ezTester公开Mini版后,我才决定将一篇改成一个系列的原因。本系列文章罗列如下:《调测工具VcTester攻略之:搭建敏捷开发环境》《调测工具VcTester攻略之:使用快捷编辑功能》《调测工具VcTester攻略之:快速定位问题》《调测工具VcTester攻略之:敏捷开发方式下调测组织过程》《调测工具VcTester攻略之:脚本驱动API测试》《调测工具VcTester攻略之:使用脚本桩构造数据驱动测试》撰写本系列文章时得到ezTester技术专家Sundy多次帮助,在此谨表感谢!VcTester适用性VcTester只能与VisualC/C++配套使用,被测工程既可以是C代码,也可以是C++代码。据推测,VcTester有不少功能依赖于VC的调试数据库(PDB文件),所以离开VC编译环境,这个工具估计不会这么好用。VcTester支持的VC6、VC7(即VisualStudio2003)、VC8(即VisualStudio2005)、VC9(即VisualStudio2008)各个版本。据本人验证,如果您的代码越接近于C语言,VcTester用得就越爽,越玩高级C++特性,用VcTester就没那么爽了,VcTester明确不支持对C++的动态数据类型RTTI、模板Template实施映射,另外,C++的inline风格的函数、fastcall风格的函数、操作符重载函数,VcTester也不支持映射。对未支持的C++特性的使用影响限于如下几个方面:1、某些变量或函数不能解析,所以在提示输入或函数调用图中找不到。此项影响甚小,Page3of13调测工具VcTester攻略之搭建运行环境密级:公开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提供了与SourceInsight、VisualAssist、CppUnit、CSE等工具对等的功能,是这些工具所提供功能的一个综合体。但VcTester绝非只是叠加某些工具的功能,重要的是,它承载了一套基于敏捷实践的研发理念,这才是本人看好VcTester发展前景的根本原因。搭建一个简单到不能再简单的调测环境先安装VcTesterMiniV5.1版本,下载版本后,运行安装程序,接受许可协议,如下图:Page4of13调测工具VcTester攻略之搭建运行环境密级:公开之后按缺省配置,一路按“下一步”完成安装即可。然后我们在VC中创建一个简单的被测工程,这里以VC6为例,创建一个工程名为test控制台项目,添加一个被测C++文件(root.cpp),该文件源码如下:这里我们定义一个全局变量iForTest,一个函数MyAdd,后面我们将用这个变量与这个函数做演示。入口函数main仅让控制台程序挂起,等待用户键入一个字串后退出。之后在Debug模式下编译该工程,生成被测程序test.exe。如下图:#includestdio.hintiForTest=5;intMyAdd(inti,intj){returni+j;}intmain(intargc,char*argv[]){charbuff[256];printf(Pleaseinput'exit'toquit\n);scanf(%s,buff);return0;}Page5of13调测工具VcTester攻略之搭建运行环境密级:公开之后,启动VcTester安装目录下的VcSmart.exe程序,VcSmart是VcTester的精简界面版本,在其主界面,我们先启动刚才生成的被测程序test.exe,点击“Runtargetapplication”按钮,弹出如下对话框:指定被测的EXE程序(如果需要,还可再指定它的启动参数与工作目录)后,点OK按钮Page6of13调测工具VcTester攻略之搭建运行环境密级:公开关闭对话框即启动被测的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用脚本成功调起来了。Page7of13调测工具VcTester攻略之搭建运行环境密级:公开上面是最精简方式的脚本化调测环境搭建过程,您需要做的,只一件事:在VcSmart中把被测程序运行起来。至于如何编写调测脚本,VcSmart用户手册有详细介绍,您可以使用CSE脚本构造任意复杂的测试数据,调用任意被测函数来发起各种调试操作或测试操作。是不是很神奇?从试用VcSmart、VcSmith,到VcTester,该系列产品曾多次让我觉得神奇,就说最近试用VcTesterMini,支持脚本打桩总得在被测代码中做点文章吧?插装改造、加个钩子什么的,偏不