斐力庇第斯从马拉松回雅典报信,虽然已是满身血迹,筋疲力尽,但他知道:没有出现在雅典人民面前,前面的路程都是白费。 最艰苦、最关键的时刻,把好最后一道关。

让你的QTP永不停歇

上一篇 / 下一篇  2008-09-01 15:32:15 / 个人分类:QTP

查看( 3682 ) / 评论( 30 )

很多人都感觉qtp脚本运行中各种意外的错误打断,导致执行失败让人头疼

其实要解决很简单,设置一下脚本就可以了:

打开脚本

File->Settings
run选项卡

 

如图所示

出错的处理可以自己选择
可以错误弹出框、停止运行、继续下一步语句、继续下一次action循环

这样我们就可以控制错误发生时qtp的操作了


TAG: qtp 错误 settings error OnError QTP

符华聪的测试空间 小孩 发布于2008-09-01 22:12:02

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

QUOTE:

原帖由 rcpp 于 2008-9-2 11:46 发表
面向无人值守,还是可以的
关键是有测试人员跟我提出过这样的需求,希望等运行结束了再去看;而不是每隔一段时间去看看脚本是不是一个对话框在那里卡住了,这样就得是不是去盯着
另外QTP提供了完整的错误报告,想要 ...
假设一个case要执行的UI操作的代码有1000行,如果在前面几行就有一个控件没点到,就意味着后面所有的操作都无法进行下去了。按照默认的全局等待时间20秒来计算,单个脚本就要20000秒,如果还要这样跑多个Case,原计划半夜3个小时就能执行完的测试,结果第二天早上来一看还在前几个case中吭哧吭哧20秒跑一步,这种无人值守有啥意义。。。

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

QUOTE:

原帖由 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-09-02 13:52:14
实践出真知,实际尝试一下就知道了
我们以前一个action是一个功能点,现在一个function是一个功能点
都是可以这样应用来直接搞定
On error虽好,但抛出错误很不方便,除非你每一行代码都取一下error对象,那样代码冗余太多了
现在我们的做法就是让qtp去做错误时的操作,然后我们再解析qtp的日志,这样不需要在每一行去获取error对象而每一行的错误都可以很容易取到
假装不在 假装不在 发布于2008-09-02 13:56:51

我很愿意用,但其实楼主你还是没参与现实项目才这么说。
哎...我头痛死了...
Kevin藏宝库 hsjzfling 发布于2008-09-02 14:01:00

QUOTE:

原帖由 rcpp 于 2008-9-2 13:45 发表


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

这个跟组织脚本的方式有关系,我们目前是每一行代码就是一个调用function,每一个功能点是一个function
这个失败了走下一个,怎么会一直等待
事 ...
那你得一开始就说清楚啊,按照你们的做法,Function 封装代码的结构才是最关键的,还有就是On Error语句的局部错误控制处理,设置反而次要了。没头没尾就说那么设置一下,会误导新人的。

10000行代码都依赖也是很正常的~举个最简单的例子,以一个购物网站为例,如果登录就失败了,那后面的所有操作还有意义么,后面哪个Action, Function不依赖登录?
最后一公里 rcpp 发布于2008-09-02 14:02:45

QUOTE:

原帖由 假装不在 于 2008-9-2 13:56 发表

我很愿意用,但其实楼主你还是没参与现实项目才这么说。
哎...我头痛死了...
大哥,现在我们用的就是这么做的
由于测试人员的需求,我已经把自动化框架第二次重写了
利用qtp的日志解析,又做了email提醒,现在还要自动发报告功能,我还没做
你试试再说,我这里只有一个action作为main(),功能点全部都是function
最后一公里 rcpp 发布于2008-09-02 14:04:37

QUOTE:

原帖由 hsjzfling 于 2008-9-2 14:01 发表


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

10000行代码都依赖也 ...
不一定要function啊
我不是说了吗,action也可以的啊
难道用qtp做自动化的人会把自己所有功能的测试代码都写在一个action里吗?
那不是有毛病么,一个action几千行代码,疯掉了
Kevin藏宝库 hsjzfling 发布于2008-09-02 14:05:56

QUOTE:

原帖由 rcpp 于 2008-9-2 13:52 发表
实践出真知,实际尝试一下就知道了
我们以前一个action是一个功能点,现在一个function是一个功能点
都是可以这样应用来直接搞定
On error虽好,但抛出错误很不方便,除非你每一行代码都取一下error对象,那样代码 ...
唉,你都说了一个Function为一个功能,有错就结束Function,这时不就返回了一个Err对象么,Err对象是可以随着Function的一层层调用自最底层返回给最顶层调用的,截获Err只需要在你想要的Function层次中捕获就行了
最后一公里 rcpp 发布于2008-09-02 14:09:18
……
你不会是只登录一下,然后把所有操作做完吧?
我们以前也是这么设计,后来抛弃了,改成每一个点都独立登录登出
一次登录然后所有操作全做完,这样脚本耦合太高了
又不是所有功能点都有执行顺序的,大部分功能点先执行后执行都是无所谓的,没有顺序关系
每一个功能点都有自己的登录登出
最后一公里 rcpp 发布于2008-09-02 14:11:47

QUOTE:

原帖由 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-09-02 14:13:58
还有就是vbs没有java那么方便可以try catch的,不能这样抛出的,你还要自己定义才行
假装不在 假装不在 发布于2008-09-02 14:36:19
兄弟,大哥没说你错。这个方法大哥一直在用。
但其实有些错误出现了,QTP也会自动停止的。这个功能不能以偏概全.
最后一公里 rcpp 发布于2008-09-02 15:01:52

QUOTE:

原帖由 假装不在 于 2008-9-2 14:36 发表
兄弟,大哥没说你错。这个方法大哥一直在用。
但其实有些错误出现了,QTP也会自动停止的。这个功能不能以偏概全.
啊?还有错误会停止?
有没有实例?或者截个图
我现在还没遇到过;测试人员问我单个用例错误不会整个停下来吧?我说没问题……
要是还有问题,我得收回说过的话了~
Kevin藏宝库 hsjzfling 发布于2008-09-02 15:12:32

QUOTE:

原帖由 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-09-02 15:42:06

QUOTE:

原帖由 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,再用场景恢复;绝大部分这样都可以搞定了
Kevin藏宝库 hsjzfling 发布于2008-09-02 16:08:48
回复 20# 的帖子
"每一次调用function是一次action的循环",这句能再详细解释下么?
脚本的结构到底是怎样?
是将每个功能放在各个Action中,然后通过一个Function来RunAction;还是直接把脚本都封装在Function中?
我来说两句

(可选)

我的栏目

日历

« 2024-04-14  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 14762
  • 日志数: 8
  • 建立时间: 2008-01-25
  • 更新时间: 2008-09-22

RSS订阅

Open Toolbar