51Testing软件测试论坛

标题: 让你的QTP永不停歇 [打印本页]

作者: rcpp    时间: 2008-9-1 15:32
标题: 让你的QTP永不停歇
很多人都感觉qtp脚本运行中各种意外的错误打断,导致执行失败让人头疼
其实要解决很简单,设置一下脚本就可以了:
打开脚本
File->Settings
run选项卡


如图所示
出错的处理可以自己选择
可以错误弹出框、停止运行、继续下一步语句、继续下一次action循环
这样我们就可以控制错误发生时qtp的操作了
附件:

作者: 小孩    时间: 2008-9-1 22:12

不建议这样搞。。。 意义不大
作者: 郝宁    时间: 2008-9-1 22:34
设置Recovery Scenario。。。然后用Test Batch Runner批量运行
作者: rcpp    时间: 2008-9-2 11:46
面向无人值守,还是可以的
关键是有测试人员跟我提出过这样的需求,希望等运行结束了再去看;而不是每隔一段时间去看看脚本是不是一个对话框在那里卡住了,这样就得是不是去盯着
另外QTP提供了完整的错误报告,想要做错误分析也是很方便的;有xml的结果可以分析;当然了,在测试没有结束前,xml是不完整的,无法用xml解析器去分析;但是可以自行写解析的,作为文本流去分析就可以了。利用解析也可以实现各种提醒比如email提醒等
无人值守是要向每日构建发展的不得不考虑的一环,特别是跨地域开发项目、分模块开发集成测试等等
作者: hsjzfling    时间: 2008-9-2 13:12
原帖由 rcpp 于 2008-9-2 11:46 发表
面向无人值守,还是可以的
关键是有测试人员跟我提出过这样的需求,希望等运行结束了再去看;而不是每隔一段时间去看看脚本是不是一个对话框在那里卡住了,这样就得是不是去盯着
另外QTP提供了完整的错误报告,想要 ...


假设一个case要执行的UI操作的代码有1000行,如果在前面几行就有一个控件没点到,就意味着后面所有的操作都无法进行下去了。按照默认的全局等待时间20秒来计算,单个脚本就要20000秒,如果还要这样跑多个Case,原计划半夜3个小时就能执行完的测试,结果第二天早上来一看还在前几个case中吭哧吭哧20秒跑一步,这种无人值守有啥意义。。。

目前的无人值守主要还是由良好的 Recovery Scenario,或者是由Function组织脚本通过On Error来暴力控制错误。这样的自动化测试才能有点效率
作者: 没有蛀牙    时间: 2008-9-2 13:17
事实上,你一步出错,后面的都会fail
作者: rcpp    时间: 2008-9-2 13:45
原帖由 hsjzfling 于 2008-9-2 13:12 发表


假设一个case要执行的UI操作的代码有1000行,如果在前面几行就有一个控件没点到,就意味着后面所有的操作都无法进行下去了。按照默认的全局等待时间20秒来计算,单个脚本就要20000秒,如果还要这样跑多个Case,原 ...


为什么你的脚本都没有组织,1000行代码全部都是依赖关系的?

这个跟组织脚本的方式有关系,我们目前是每一行代码就是一个调用function,每一个功能点是一个function
这个失败了走下一个,怎么会一直等待
事实上你说的情况我们根本不会出现。每一个function内如果有错了function就over了。
另外你说的全局等待是指settings吧,那是可以改的。

你说的情况应该是没有脚本组织,所有用例的全部代码都写在一个action里面吧

另外出错不一定要设置跳到下一行的
setting里遇到错误的处理设置又不是只有一项
只是我们组织脚本用的是function而不是action
如果用action组织,可以让它跳入下一个action就可以了,我们之前的做法是这样的
作者: rcpp    时间: 2008-9-2 13:52
实践出真知,实际尝试一下就知道了
我们以前一个action是一个功能点,现在一个function是一个功能点
都是可以这样应用来直接搞定
On error虽好,但抛出错误很不方便,除非你每一行代码都取一下error对象,那样代码冗余太多了
现在我们的做法就是让qtp去做错误时的操作,然后我们再解析qtp的日志,这样不需要在每一行去获取error对象而每一行的错误都可以很容易取到
作者: 假装不在    时间: 2008-9-2 13:56

我很愿意用,但其实楼主你还是没参与现实项目才这么说。
哎...我头痛死了...
作者: hsjzfling    时间: 2008-9-2 14:01
原帖由 rcpp 于 2008-9-2 13:45 发表


为什么你的脚本都没有组织,1000行代码全部都是依赖关系的?

这个跟组织脚本的方式有关系,我们目前是每一行代码就是一个调用function,每一个功能点是一个function
这个失败了走下一个,怎么会一直等待
事 ...


那你得一开始就说清楚啊,按照你们的做法,Function 封装代码的结构才是最关键的,还有就是On Error语句的局部错误控制处理,设置反而次要了。没头没尾就说那么设置一下,会误导新人的。

10000行代码都依赖也是很正常的~举个最简单的例子,以一个购物网站为例,如果登录就失败了,那后面的所有操作还有意义么,后面哪个Action, Function不依赖登录?
作者: rcpp    时间: 2008-9-2 14:02
原帖由 假装不在 于 2008-9-2 13:56 发表

我很愿意用,但其实楼主你还是没参与现实项目才这么说。
哎...我头痛死了...


大哥,现在我们用的就是这么做的
由于测试人员的需求,我已经把自动化框架第二次重写了
利用qtp的日志解析,又做了email提醒,现在还要自动发报告功能,我还没做
你试试再说,我这里只有一个action作为main(),功能点全部都是function
作者: rcpp    时间: 2008-9-2 14:04
原帖由 hsjzfling 于 2008-9-2 14:01 发表


那你得一开始就说清楚啊,按照你们的做法,Function 封装代码的结构才是最关键的,还有就是On Error语句的局部错误控制处理,设置反而次要了。没头没尾就说那么设置一下,会误导新人的。

10000行代码都依赖也 ...


不一定要function啊
我不是说了吗,action也可以的啊
难道用qtp做自动化的人会把自己所有功能的测试代码都写在一个action里吗?
那不是有毛病么,一个action几千行代码,疯掉了
作者: hsjzfling    时间: 2008-9-2 14:05
原帖由 rcpp 于 2008-9-2 13:52 发表
实践出真知,实际尝试一下就知道了
我们以前一个action是一个功能点,现在一个function是一个功能点
都是可以这样应用来直接搞定
On error虽好,但抛出错误很不方便,除非你每一行代码都取一下error对象,那样代码 ...


唉,你都说了一个Function为一个功能,有错就结束Function,这时不就返回了一个Err对象么,Err对象是可以随着Function的一层层调用自最底层返回给最顶层调用的,截获Err只需要在你想要的Function层次中捕获就行了
作者: rcpp    时间: 2008-9-2 14:09
……
你不会是只登录一下,然后把所有操作做完吧?
我们以前也是这么设计,后来抛弃了,改成每一个点都独立登录登出
一次登录然后所有操作全做完,这样脚本耦合太高了
又不是所有功能点都有执行顺序的,大部分功能点先执行后执行都是无所谓的,没有顺序关系
每一个功能点都有自己的登录登出
作者: rcpp    时间: 2008-9-2 14:11
原帖由 hsjzfling 于 2008-9-2 14:05 发表


唉,你都说了一个Function为一个功能,有错就结束Function,这时不就返回了一个Err对象么,Err对象是可以随着Function的一层层调用自最底层返回给最顶层调用的,截获Err只需要在你想要的Function层次中捕获就行了 ...


不对的
在一个function中,如果你返回最后一个err,这个错误无法用于诊断
比如一个function有12行代码,在第2行出错了,而你用on error resume next了,之后3到12行都错
但是抛回的是第12行的错误,你怎么知道最初的错误在哪里?
我们经过多次的试验证实了这一点,所以才没有这样做
作者: rcpp    时间: 2008-9-2 14:13
还有就是vbs没有java那么方便可以try catch的,不能这样抛出的,你还要自己定义才行
作者: 假装不在    时间: 2008-9-2 14:36
兄弟,大哥没说你错。这个方法大哥一直在用。
但其实有些错误出现了,QTP也会自动停止的。这个功能不能以偏概全.
作者: rcpp    时间: 2008-9-2 15:01
原帖由 假装不在 于 2008-9-2 14:36 发表
兄弟,大哥没说你错。这个方法大哥一直在用。
但其实有些错误出现了,QTP也会自动停止的。这个功能不能以偏概全.


啊?还有错误会停止?
有没有实例?或者截个图
我现在还没遇到过;测试人员问我单个用例错误不会整个停下来吧?我说没问题……
要是还有问题,我得收回说过的话了~
作者: hsjzfling    时间: 2008-9-2 15:12
原帖由 rcpp 于 2008-9-2 14:11 发表


不对的
在一个function中,如果你返回最后一个err,这个错误无法用于诊断
比如一个function有12行代码,在第2行出错了,而你用on error resume next了,之后3到12行都错
但是抛回的是第12行的错误,你怎么知道 ...


Function外局部使用On Error Resume Next,这样在Function内部有Error产生就会先因为暂停,将错误一层层返回到有On Error Resume Next那层,然后从这里开始继续执行下一步,可以是调用下一个Function,也可以是循环到下一个Test.
这样只会将产生的第一个错误返回。

而按照你所说,假设第2行和12都有错,返回的是12行的错的话,想要取到12行的错,那么你的脚本不是要从第2行报错后就一直吭哧吭哧执行到12行才能取到这个错?既然要执行到12行,那是不是可以认为即使有错了那你的脚本还是会执行完整个Function的所有语句?那么你所说的Function有错就会终止不就不成立了?
作者: rcpp    时间: 2008-9-2 15:42
原帖由 hsjzfling 于 2008-9-2 15:12 发表


Function外局部使用On Error Resume Next,这样在Function内部有Error产生就会先因为暂停,将错误一层层返回到有On Error Resume Next那层,然后从这里开始继续执行下一步,可以是调用下一个Function,也可以是循环到下一个Test.
这样只会将产生的第一个错误返回。

而按照你所说,假设第2行和12都有错,返回的是12行的错的话,想要取到12行的错,那么你的脚本不是要从第2行报错后就一直吭哧吭哧执行到12行才能取到这个错?既然要执行到12行,那是不是可以认为即使有错了那你的脚本还是会执行完整个Function的所有语句?那么你所说的Function有错就会终止不就不成立了?


嗯,是的
如果按你说的做,是这样没错
但我们不是这样做的,我们的做法是:每一次调用function是一次action的循环,所以只要settings设置为出错时运行下一个action循环,就ok了
为什么可以这样呢?很简单,把function name放到脚本的参数table里就可以了
呵呵,简单吧。我们的错误处理现在都是让qtp去做的,需要特殊对待的某些极个别用例给它们单独的action,再用场景恢复;绝大部分这样都可以搞定了
作者: hsjzfling    时间: 2008-9-2 16:08
标题: 回复 20# 的帖子
"每一次调用function是一次action的循环",这句能再详细解释下么?
脚本的结构到底是怎样?
是将每个功能放在各个Action中,然后通过一个Function来RunAction;还是直接把脚本都封装在Function中?
作者: rcpp    时间: 2008-9-2 16:58
这样吧,你可以按我说的尝试一下
下面这段代码
Sub test1()
   msgbox "test1"
End Sub

Sub test2()
   msgbox "test2"
End Sub
你保存为一个.vbs
然后新建一个脚本,引入刚才的.vbs库
脚本代码写入
Execute datatable(1,dtGlobalSheet)
然后在datatable里面的global sheet里的第一列,填写两行,分别是test1,test2

其实这就是我们的组织方式,具体测试代码都是function或者sub,每一个是一个功能点颗粒,以vbs库的形式import到用于组织的脚本main中
这个脚本main其实真正有意义的就是datatable里填写的东西
每一行就是一个调用,qtp自己就会把函数名作为参数循环去取这执行
settings里面的错误处理设置为遇到错误进入下一个action循环就好了
你可以自己故意加一个错误代码到test1里面,比如被零除之类的,再试试看,是不是直接跳出test1而运行test2

从一开始没有错误处理,到后来用脚本中加入on error处理,再到封装函数,每个函数中on error处理,并加入err对象捕捉等等;发展到现在,原来这些都摒弃不用了,只用一个设置,再加我写的解析qtp日志的方法。既可以捕捉到所有的错误,也可以实现测试人员希望的无人值守。
最开始用action,发现action的添加非常麻烦,又没有api可以用;于是想到vbs,以lib形式import进来,有api可以调用,添加起来非常方便。于是脚本都进了vbs变成了function

目前还有一个最大的麻烦,始终解决不了,就是对象库的维护,一直是一件很头疼的事情。

[ 本帖最后由 rcpp 于 2008-9-2 16:59 编辑 ]
作者: lingxin5013    时间: 2008-9-2 17:07
的确不好用  很不爽 本人用的不好 学习了
作者: xjcool    时间: 2008-9-3 14:44
听得晕晕呼呼的!能在说详细点吗?
需要有中间设置的细节呀 要不大家都很难理解的
至少我没听明白
作者: karenkun    时间: 2008-9-5 10:08
请问楼主,如果你的一个function里的功能点,出现了必录项校验的错误,弹出一个对话框提示某文本框的内容不对,(比如身份证有效性检验),如果不正确录入,当光标移动到其他位置时,就会反复弹出校验的对话框,请问你的脚本会怎么处理?跳出了当前的function,后续的function似乎也无法执行,因为那个提示框如果不做处理,其他操作也无法执行。
作者: dudufans1983    时间: 2008-9-5 10:14
标题: 回复
原帖由 rcpp 于 2008-9-2 14:09 发表
……
你不会是只登录一下,然后把所有操作做完吧?
我们以前也是这么设计,后来抛弃了,改成每一个点都独立登录登出
一次登录然后所有操作全做完,这样脚本耦合太高了
又不是所有功能点都有执行顺序的,大部分功 ...


你这样每一次都独立做一次登入与等出,不觉得代码冗余了吗?
作者: rcpp    时间: 2008-9-5 11:18
呵呵,25楼和26楼的问题就是互相的答案
补充一句就是,登出点无论成功失败,窗口都会关闭,而登入点总是新开窗口的
作者: heqingbluesky    时间: 2008-9-5 16:18
我Globalsheet来控制这个脚本的运行。一个Action就是一个Function;然后用Main这个Action来调用需要运行的Function,好像还不错,不知道能否扑捉到出错的详细信息,例如:截图,消息框等等。
我们目前还是用Recovery Scenario来控制出错后的处理。
作者: RayTM    时间: 2008-10-28 15:43
每一次调用function是一次action的循环,每一个function是一个校验点,这样不错。
但是如果一些校验的case是需要在执行多步后才能达到需要校验的位置,并且在你的粒度比较小的情况下,是否会花费很多时间在反复创建校验点的准备工作上?

另外,采用你的出错便退出并进行下一个校验点的的策略的话,用action封装功能校验点是一样的。并且也不是在每一行都尝试要获取Err对象吧,Recovery Scenario可以让出错在捕捉并处理异常。
作者: LittleDuck    时间: 2008-10-28 15:52
原帖由 没有蛀牙 于 2008-9-2 13:17 发表
事实上,你一步出错,后面的都会fail


所以应该考虑做出错后的恢复
作者: LittleDuck    时间: 2008-10-28 16:51
原帖由 rcpp 于 2008-9-2 16:58 发表
这样吧,你可以按我说的尝试一下
下面这段代码
Sub test1()
   msgbox "test1"
End Sub

Sub test2()
   msgbox "test2"
End Sub
你保存为一个.vbs
然后新建一个脚本,引入刚才的.vbs库
脚本代码写入
Ex ...


为什么对象库管理会成问题呢?使用一个大的整合好的基础对象库不就可以了吗。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2