1、学习 QTP 经验 对于我来说,学习 QTP 是一个漫长而有艰苦的过程 。首先我不是计算机及相关专业毕业的 (医学相关)。跳入测试部时,我正在接受程序员的培训课程。由于自己认为需要,于是开始 学习 QTP。 刚开始使用 QTP,就一直对着说明书,不停的“订飞机票”(订飞机票是说明书里的一个 例子)。学会了一个步骤就拿到公司产品上玩玩,回忆起来还是挺有趣的。 当我用一些简单的功能开始录制脚本时,发现保存 ActiveXScreen 的话,生成的脚本很中空 间(因为程序会保存每个不同的录制页面),多录一些硬盘空间就满了,而且回放过程会很慢。 但如果不保存活动页(ActiveXScreen),对脚本
2、的再改造/维护起来就相对困难一些。 于是我开始去了解“关键字”视图里的内容,尝试了解代码。慢慢的,我了解到“关键字” 视图显示了整个操作步骤,第个组件相对于程序里一个元素。同时还记录了录制过程对该元素 的操作和结果。 然后我又开始在论坛在找些资料看看,从有点所谓的高级应用中,我发现脚本的维护并不 一定要有“活动页”。实际是 QTP 所有对象的识别,都存在脚本的一个对象库里了。QTP 经常 出现无法识别对象的问题,可以从这里着头修改。 为了减少 QTP 脚本占用空间大、录制慢的问题。我查阅了一些资料,可以在设置中进行修改, 让脚本中不保存活动控件(ActiveX)或仅保存出错时的录制 页面。干脆
3、,我就从此录制页面 了。所有的调试都从“关键字”视图和“专家”视图中进行修改。而且关于对象库,QTP 也有 个选项,可以设置加载页面上所有的 对象,我修改成只保存页面上录制过程使用的对象。 这 样,脚本的容量问题就解决了,录制后的脚本会比以前小很多,来了个彻底的瘦身。关于录制 速度的问 题,和保存“活动页”、动态脚本也有一定的关系,另外可以减小启动的加载项(如: 去掉 VB 插件、.net 插件,不需要的就不加进来)。这样的脚本上传到 TestDirector 上,或从 TestDirector 上调用就不会太慢了。 然而真正的问题,棘手的问题就不是上面所述的那么简单了。不过都是有办法解决了的
4、,嘿 嘿 以下是我经常遇到的问题: 一、无法识别控件。 二、错误回放过程未知弹出窗口。 三、加载.net 插件后和 TD 的关联问题。 四、动态加载元素的识别问题。 五、调用外部 dll 的问题。 六、随机验证码的问题。 问题一,解决办法有三种: 1、更改 QTP 自身对某控件的识别方式,在 toolsObject Identification 中。在这里 列出了所有 QTP 能识别的控件,以及控件的识别方式。你可以给他添加 X、Y 坐标进行识别。或 更明显的,列表中的信息,不按名称识别,而是按 ID 识别。这个修改可以解决一些问题,具体 的赶紧动手试试吧 2、使用虚拟物件,来定义一个控件,在
5、 toolsVirtual Object 中。在这里可以自定义 一个控件。例如在 ASP 的程序中,程序出错,在客户端的表现形式大部分是一样的,你可以把 整个错误页面当成一个控件来识别(感觉不错)。如果加一个判断,出错后你想做什么就由你 自己定了。 3、使用低级录制或鼠标录制。用 TestLowLevelRecording/AnlogRecording 吧,用它 录制就不需要什么设置了,他会记录你的程序控件相对屏幕的位置。用 LowLevelRecording 还 有代码可改,用 AnlogRecording 动作就被封装了(维护性极差)。两者因实际环境更取其长 吧 问题二的解决过程: 关于弹
6、出提示的问题,我当 时需要情况是这样的。一个信息录入系统,由于数据量很大,查询 需要一段时间。QTP 回放时动作比较快,点了保存,程序还没反应过来它就进行了下一步操作。 这时的操作就和录制时不一样了,程序给出一个提示,但这个提示是录制过程没有的。弹出框 是一般都是 POP 形势(至上)的,导致 QTP 无法继续回放,结果就 是回放失败。 解决办法有两个: 1、进行判断,当出现这个提示时,点是/否/取消按钮。 2、通过 ToolsRecorvery Scenario Manager 设置默认操作。 我最初就是用的第一种方法。写一个函数判断是否出现这个提示,如果出现就点“取消” 然后 wait(2
7、)。 每个可能出现弹出框的动作后都调用一次这个函数。虽然可以解决这个问 题,但回放的效率就低了,而且需要你预知提示框的信息。 当我知道了第二种方法,显然更科学_。它可以对所有预知甚至不知的提示进行指定的操 作。 实际上,当程序出现了未预知的提示时,可能就是程序的 BUG,所以使用上述办法解决工 具问题时,也要考虑是否会掩盖程序的缺陷。 问题三的解决办法: 用好 QTP 后,会不自觉的和 TD 关联起来。但从 TD 直接启动 QTP 时,程序只会加载 QTP 自带的插件,如果你安装了其它插件(如.net、java、etc.),默认是不加载的。这会导致上 传的脚本无法正确执行。解决办法很简单,去
8、TestSetting 里进行 Modify 吧。从本地打 开的脚本,这里不能进行 Modify 的。所以办法很简单,但如果不知道的话就很难了。当初为这 个问题我可是废了八牛三虎之力呢 问题四的解决过程: 当我开始改代码时,定义一个动作,然后可以生成 N 个动作。假设 N 个动作产生了 N 个结 果,你要对这结果进行处理时,你会发现这 N 个结果都不能被识别: 网页上有个表格,是往数据库里加数据的。 两个表格显示在同一个页面上,左边为父表,右边为子表。 点击左表,右表显示其子项目。 结构如下: A 1 2 3 4 B 1 2 3 4 思想很清晰: 添加一个父项 A、选中此父项 A、对其添加子项
9、 1、2、3、4 添加一个父项 B、选中此父项 B、对其添加子项 1、2、3、4 代码也很简单: dim M 定义父项数 dim N 定义每个父项包含的子项数 For i=1 to M Call 添加父项( i ) 选中父项( i ) 问题就出在这里 For j=1 to bwfl step 1 Call 添加子项( j ) Next Next 现在问题出来了,思路应该没有问题(除非这方法真的行不通),循环也是顺着思想来的。 问题是,无法实现选中的父项(最多识别到一个)。 由于此循环可以在录制过程进行,如果不改变变量名称,循环可且只可以成功运行一次。问题 是这个名称都是从 DataTable
10、里获取的。 因为,在运行过程中生成的项目没有加到对象库中,无法被识别。 这个问题最后是从思想上解决的。答案是我做的是功能测试,为什么不先加父项,检查父项 的功能是否正常,然后再去测子项的功能。不去改变名字,因为那没有必要。核心答案“功能 测试、测试功能”。即对测试工具首先需要有正确的认识。 当然,这个问题可以用代码去实现,但那需要有一定的编程功底且耗时,可维护性不一定好。 有需要的朋友可以去试一下,然后把你的经验也共享一下。 问题五,是对 QTP 很大的一个扩充。 对于 QTP 调用外部 DLL 的功能,由于我的编程功底不够,没有相关人士配合我,我只能望 之垂涎了! 如果能调用外部 DLL 的
11、话,QTP 的功能就可以变得很强大。自己写的程序,自己编一些过 程用 QTP 进行测试,我想“后果很严重” 。真想有一次给我尝试的机会 问题六,解决办法有 4 个: 1、测试的时候,让程序员把这块限制去掉,免去验证这关。 2、让程序员提供一个万能验证码,测试可以绕过这一关。 3、请程序员提供识别的方法,从获取的图片读出验证数据,再传给 QTP。 4、进行位图检查,将验证码分段进行图像验证。 实际上,验证码的目的就是防止用程序灌水或机器录入信息。所以有点为难我们测试了。 方 法 1,如果程序已在发布并有客户使用,危险性是可想而知的。方法 2 虽然可以解决验证这 一关,但跳过了输入码与验证码一致性
12、问题。方法 3 就需要程序员配合 了,可能就需要调用 DLL 了。方法 4 却将图像分段,把获取的图像和已经的图像进行比对,比对通过取对应的值; 这个在数字验证会好做一点,因为最多就四个图 像的比对。 关于网上的汉字验证码,那块的测试我就不知道他们是怎么做的了。真想了解一下! 以上就是我对过去 QTP 学习过程的一个总结。供天下各界朋友参观、发言、讨论,也是对 我过去的一个写照,可能 N 年后,自己看到会很有感觉呢 。 现在又有项目来了,我学习的时间慢慢也少了。新项目里融合了 C+程序,QTP 对 C+的识 别似乎很不理想,也许是需要插件支持吧。过程中我尝试了 Rational 的 Robot,Robot 对 C+ 的识别很好,但 Rational 一套组件内容太多,对汉字的支持似乎也不是很好。用了一段时间我 就把它从硬盘中给清掉了 QTP 的学习就在此停住了,不能应用到项目中,单纯看着说明书的学习,我好像不太在行。 也许是真的需要活学活用,边学边用吧。或者我不够书呆子吧