51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 10237|回复: 30
打印 上一主题 下一主题

[原创] 让你的QTP永不停歇

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-9-1 15:32:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
很多人都感觉qtp脚本运行中各种意外的错误打断,导致执行失败让人头疼
其实要解决很简单,设置一下脚本就可以了:
打开脚本
File->Settings
run选项卡


如图所示
出错的处理可以自己选择
可以错误弹出框、停止运行、继续下一步语句、继续下一次action循环
这样我们就可以控制错误发生时qtp的操作了
附件:
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2008-9-1 22:12:02 | 只看该作者

不建议这样搞。。。 意义不大
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2008-9-1 22:34:43 | 只看该作者
设置Recovery Scenario。。。然后用Test Batch Runner批量运行
回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2008-9-2 11:46:43 | 只看该作者
面向无人值守,还是可以的
关键是有测试人员跟我提出过这样的需求,希望等运行结束了再去看;而不是每隔一段时间去看看脚本是不是一个对话框在那里卡住了,这样就得是不是去盯着
另外QTP提供了完整的错误报告,想要做错误分析也是很方便的;有xml的结果可以分析;当然了,在测试没有结束前,xml是不完整的,无法用xml解析器去分析;但是可以自行写解析的,作为文本流去分析就可以了。利用解析也可以实现各种提醒比如email提醒等
无人值守是要向每日构建发展的不得不考虑的一环,特别是跨地域开发项目、分模块开发集成测试等等
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2008-9-2 13:12:18 | 只看该作者
原帖由 rcpp 于 2008-9-2 11:46 发表
面向无人值守,还是可以的
关键是有测试人员跟我提出过这样的需求,希望等运行结束了再去看;而不是每隔一段时间去看看脚本是不是一个对话框在那里卡住了,这样就得是不是去盯着
另外QTP提供了完整的错误报告,想要 ...


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

目前的无人值守主要还是由良好的 Recovery Scenario,或者是由Function组织脚本通过On Error来暴力控制错误。这样的自动化测试才能有点效率
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2008-9-2 13:17:50 | 只看该作者
事实上,你一步出错,后面的都会fail
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2008-9-2 13:45:32 | 只看该作者
原帖由 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就可以了,我们之前的做法是这样的
回复 支持 反对

使用道具 举报

该用户从未签到

8#
 楼主| 发表于 2008-9-2 13:52:14 | 只看该作者
实践出真知,实际尝试一下就知道了
我们以前一个action是一个功能点,现在一个function是一个功能点
都是可以这样应用来直接搞定
On error虽好,但抛出错误很不方便,除非你每一行代码都取一下error对象,那样代码冗余太多了
现在我们的做法就是让qtp去做错误时的操作,然后我们再解析qtp的日志,这样不需要在每一行去获取error对象而每一行的错误都可以很容易取到
回复 支持 反对

使用道具 举报

该用户从未签到

9#
发表于 2008-9-2 13:56:51 | 只看该作者

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

使用道具 举报

该用户从未签到

10#
发表于 2008-9-2 14:01:00 | 只看该作者
原帖由 rcpp 于 2008-9-2 13:45 发表


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

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


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

10000行代码都依赖也是很正常的~举个最简单的例子,以一个购物网站为例,如果登录就失败了,那后面的所有操作还有意义么,后面哪个Action, Function不依赖登录?
回复 支持 反对

使用道具 举报

该用户从未签到

11#
 楼主| 发表于 2008-9-2 14:02:45 | 只看该作者
原帖由 假装不在 于 2008-9-2 13:56 发表

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


大哥,现在我们用的就是这么做的
由于测试人员的需求,我已经把自动化框架第二次重写了
利用qtp的日志解析,又做了email提醒,现在还要自动发报告功能,我还没做
你试试再说,我这里只有一个action作为main(),功能点全部都是function
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2008-9-2 14:04:37 | 只看该作者
原帖由 hsjzfling 于 2008-9-2 14:01 发表


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

10000行代码都依赖也 ...


不一定要function啊
我不是说了吗,action也可以的啊
难道用qtp做自动化的人会把自己所有功能的测试代码都写在一个action里吗?
那不是有毛病么,一个action几千行代码,疯掉了
回复 支持 反对

使用道具 举报

该用户从未签到

13#
发表于 2008-9-2 14:05:56 | 只看该作者
原帖由 rcpp 于 2008-9-2 13:52 发表
实践出真知,实际尝试一下就知道了
我们以前一个action是一个功能点,现在一个function是一个功能点
都是可以这样应用来直接搞定
On error虽好,但抛出错误很不方便,除非你每一行代码都取一下error对象,那样代码 ...


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

使用道具 举报

该用户从未签到

14#
 楼主| 发表于 2008-9-2 14:09:18 | 只看该作者
……
你不会是只登录一下,然后把所有操作做完吧?
我们以前也是这么设计,后来抛弃了,改成每一个点都独立登录登出
一次登录然后所有操作全做完,这样脚本耦合太高了
又不是所有功能点都有执行顺序的,大部分功能点先执行后执行都是无所谓的,没有顺序关系
每一个功能点都有自己的登录登出
回复 支持 反对

使用道具 举报

该用户从未签到

15#
 楼主| 发表于 2008-9-2 14:11:47 | 只看该作者
原帖由 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行的错误,你怎么知道最初的错误在哪里?
我们经过多次的试验证实了这一点,所以才没有这样做
回复 支持 反对

使用道具 举报

该用户从未签到

16#
 楼主| 发表于 2008-9-2 14:13:58 | 只看该作者
还有就是vbs没有java那么方便可以try catch的,不能这样抛出的,你还要自己定义才行
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2008-9-2 14:36:19 | 只看该作者
兄弟,大哥没说你错。这个方法大哥一直在用。
但其实有些错误出现了,QTP也会自动停止的。这个功能不能以偏概全.
回复 支持 反对

使用道具 举报

该用户从未签到

18#
 楼主| 发表于 2008-9-2 15:01:52 | 只看该作者
原帖由 假装不在 于 2008-9-2 14:36 发表
兄弟,大哥没说你错。这个方法大哥一直在用。
但其实有些错误出现了,QTP也会自动停止的。这个功能不能以偏概全.


啊?还有错误会停止?
有没有实例?或者截个图
我现在还没遇到过;测试人员问我单个用例错误不会整个停下来吧?我说没问题……
要是还有问题,我得收回说过的话了~
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2008-9-2 15:12:32 | 只看该作者
原帖由 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有错就会终止不就不成立了?
回复 支持 反对

使用道具 举报

该用户从未签到

20#
 楼主| 发表于 2008-9-2 15:42:06 | 只看该作者
原帖由 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,再用场景恢复;绝大部分这样都可以搞定了
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-10-7 20:25 , Processed in 0.103067 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表