51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 17402|回复: 64
打印 上一主题 下一主题

[求助] 请教一个QTP出错处理的问题(和yabest的框架有关)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2007-9-12 18:51:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面这段话是Yabest曾经说过的
我们的框架,因为要捕捉错误和控制错误,所以错误模式设置成了遇错返回。
然后将Case脚本写在函数里,外层主控用如下方法来控制Case函数的运行。
这样某个Case执行失败了,不会影响下一个Case的运行。

On Error Resume Next
  CaseFunctionName
On Error goto 0


现在我也相应用这个方法到我的测试框架中(其实我一直在学习yabestsdlkfj6 )

现在我的问题是,如果遇到错误,就从调用的CaseFunctionName退出来返回到
主控函数,主控函数如何知道错误发生在被调用的CaseFunctionName中具体哪一步呢?
谢谢!

比如

Public Function CaseCreate()
*****
**出错在这步***  当然错误是随即发生的。也肯定在别的语句处
*****
******

Function End

[ 本帖最后由 vaguely 于 2007-9-13 10:36 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
 楼主| 发表于 2007-9-12 19:14:43 | 只看该作者
大家都下班回家了么sdlkfj6
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2007-9-12 19:17:22 | 只看该作者
还发现另一个问题,
如果在运行中有错误发生,设置了遇错返回。
运行中的主窗口会被QTP关掉。但是其他窗口就无法关掉。
怎么办呢?谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2007-9-13 09:48:39 | 只看该作者
原帖由 vaguely 于 2007-9-12 18:51 发表
下面这段话是Yabest曾经说过的
我们的框架,因为要捕捉错误和控制错误,所以错误模式设置成了遇错返回。
然后将Case脚本写在函数里,外层主控用如下方法来控制Case函数的运行。
这样某个Case执行失败了,不会 ...


既然出错的地方在你声明的函数内部,为什么不把On Error错误控制也放到函数内部?sdlkfj2
这样在函数内部就可以明确定义出错的位置,然后把这样的标志返回给调用的过程。比如:
'Main
Dim intRet
intRet = MyFunc1(...)
If intRet = 0 Then
...
Else If intRet = 1 Then
...
End If

Function MyFunc1(...)
On Error Resume Next
'返回值告诉调用的过程,函数执行中遇到错误了
'也可以设计一些其他的参数,来告诉外部调用的过程这个函数出错的位置
MyFunc1 = 0
On Error Goto 0

'如果函数顺利执行完,返回一个标志正确的值
MyFunc1 = 1
End MyFunc1
回复 支持 反对

使用道具 举报

该用户从未签到

5#
发表于 2007-9-13 10:04:42 | 只看该作者

回复 #3 vaguely 的帖子

我也遇到过楼主的第二个问题!
关注。。。
回复 支持 反对

使用道具 举报

该用户从未签到

6#
发表于 2007-9-13 10:07:54 | 只看该作者
但是我在处理问题的时候,是打开QTP,发现自己的参数设置不对了!
从而导致了,窗口被关。也不晓的具体是什么原因引起的,不过问题是解决了。

也想请教大虾们,为什么参数能使窗口关闭呢?
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2007-9-13 10:35:19 | 只看该作者
谢谢winfood!  

可是我在设置种选择“遇错退出”
发生错误好无法执行到函数内发生错误的下一句,所以无法得到返回值的。

再次请教大家
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2007-9-13 10:53:48 | 只看该作者
原帖由 vaguely 于 2007-9-13 10:35 发表
谢谢winfood!  

可是我在设置种选择“遇错退出”
发生错误好无法执行到函数内发生错误的下一句,所以无法得到返回值的。

再次请教大家

如果你在脚本中使用了On Error的错误控制方式,就不应该用QTP的"遇错退出"方式了。
QTP要为不同的处理方式选择一个优先执行的,发生错误的时候"遇错退出"被优先执行了On Error部分就没有意义了。
不知道我的理解对不对sdlkfj2
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2007-9-13 11:03:12 | 只看该作者
谢谢winwood的关注。

我的做法其实就是Yabest曾经说过的
******************************************
我们的框架,因为要捕捉错误和控制错误,所以错误模式设置成了遇错返回。
然后将Case脚本写在函数里,外层主控用如下方法来控制Case函数的运行。
这样某个Case执行失败了,不会影响下一个Case的运行。

On Error Resume Next
  CaseFunctionName
On Error goto 0
***********************************************

所以我照猫画虎。我用的是QTP9.1.在
Test Settting:
When Error Occures During session:"Stop Run"
--------------------------------------------------------------------------


假设我有三个子函数,每个代表一个TEST CASE
CreateTest()
ModifyTest()
DeleteTest()

那么我在主控函数Main中就是这样做的

Main()
For i=1 to 3
     On Error Resume Next
     CaseFunctionName '执行上述函数中的一个
     On Error goto 0
Next

这样做的好处就是如果其中一个函数发生错误,一点都不会影响下一个函数的调用
回复 支持 反对

使用道具 举报

该用户从未签到

10#
发表于 2007-9-13 11:27:32 | 只看该作者
你在代码里面已经很好的控制了错误,再修改Test Setting里面设置就没有必要了吧?

这两种做法等于告诉QTP在同一个错误发生的时候采取不同的措施,一个继续另外一个是退出。说白了,QTP总要用一个固定的顺序执行的。
QTP运行的时候,只可能固定的采用其中一种:
如果是代码优先,错误就先被代码中的On Error捕捉到了,就可以继续下去;
如果是Setting优先,错误就直接被QTP的Test Setting方式处理了。代码中的On Error不会被执行。

你可以试一下,看看QTP到底是以什么顺序运行的。如果你了解一些程序开发的错误处理机制,对有助于理解和设计你的错误处理程序。
回复 支持 反对

使用道具 举报

该用户从未签到

11#
 楼主| 发表于 2007-9-13 11:37:08 | 只看该作者
谢谢Winfood,

可是我在我的函数代码里没有写错误的控制。

我想yabest采用“遇错退出"这种方式应该有他的道理(有点盲目崇拜sdlkfj6 )
是不是能够从某些地方得到出错的信息呢。 我觉得好像很有玄机,hehe
回复 支持 反对

使用道具 举报

该用户从未签到

12#
 楼主| 发表于 2007-9-13 12:15:40 | 只看该作者
刚才又发现了这样做的一个好处。
我把Options->Run->
Save step screen captrue to results: On errors and warnings


这样如果某个地方出错了,可以在test result中得到出错地方的screen shot.
这样听方便的,不用自己写抓屏的语句了。
回复 支持 反对

使用道具 举报

该用户从未签到

13#
 楼主| 发表于 2007-9-13 14:52:10 | 只看该作者
sdlkfj1
回复 支持 反对

使用道具 举报

该用户从未签到

14#
发表于 2007-9-13 15:11:03 | 只看该作者
QTP提供全局错误处理模式,有Popup  message box,Process next action iteration,Stop run,Process next step这四种。

QTP也提供On Error Resumt Next/On Error goto 0的局部错误处理模式。可以在局部范围内实现Process next step的效果,忽略错误继续执行后续步骤。这个局部错误处理模式,象局部变量优先于全局变量并且只在本函数内有效一样,优先级高于全局错误处理模式,同时只在本函数局部范围(Action本身也可以看成是个函数)内生效。它不会影响外层函数的错误处理模式,但会改变局部范围内调用的子孙函数,将子孙函数的错误处理模式改为Stop Run!

四种全局错误处理模式的区别在于:

1、Process next step
  这种模式忽略错误继续往下执行,可以通过Err.Number来判断是否发生了错误。
  因为Case函数的每个步骤都是密切相关的,不可能忽略错误继续往下执行下一步骤
  也不可能在每个步骤每个语句后面都加错误检查,这样错误处理代码太多了
  在很多个步骤后再检查也是不严谨的,会错上加错,并因此失去第一个错误的信息
  所以,这种模式不可取
  
2、Stop run
  这种模式发生错误后,就抛出异常(可用Err对象得到异常里的错误信息),中止本函数,并一层一层的返回到上一层函数,最后到达Action函数后(Action本身也可以看成是个函数),就停止整个Test的执行。
  在一层一层的返回上层函数的过程中,如果某个中间函数有On Error Resumt Next/On Error goto 0,就会把错误拦截下来,这个中间函数会继续往下执行,不会中止函数并返回上一层函数。
  
3、Popup  message box
  这种模式在发生错误时,弹出对话框让用户选择Stop、Retry、Skip、Debug。
  主控Test要全自动执行,不能要求人工干预,所以这种模式不可取
  
4、Process next action iteration
  这种模式跟Stop run类似,但是它只是退出本次Action循环,还会继续下一个Action循环。
  主控Test没有继续下一个Action循环的需求,所以这种模式不可取。

经过上述分析,我们可以得到结果,我们的主控Test,全局错误处理模式使用Stop run模式,同时在主控函数里使用On Error Resumt Next/On Error goto 0的局部错误处理模式来调用Case函数。这样使得Case函数和其子函数里发生错误时,会停止执行,并层层返回到主控函数这里,并由主控函数来拦截错误,记录错误。然后主控函数就可以正常的继续执行下一个Case函数了,不用担心会导致整个Test停止执行。

主控函数调用Case函数的详细过程如下:

Err.Clear
On Error Resume Next
call CaseFunctionName
If Err.Number <> 0 Then
  WriteLog Err.Number  '错误码
  WriteLog Err.Description  '错误描述
  WriteLog Err.Source  '错误来源对象,不过好像没啥用
End
Err.Clear
On Error goto 0

[ 本帖最后由 yabest 于 2007-9-14 13:46 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2007-9-13 15:32:45 | 只看该作者
原帖由 vaguely 于 2007-9-12 19:17 发表
还发现另一个问题,
如果在运行中有错误发生,设置了遇错返回。
运行中的主窗口会被QTP关掉。但是其他窗口就无法关掉。
怎么办呢?谢谢


每个Case出错时,出错位置都是难于预料的,比如弹出某个对话框时出错了。如果没有把这对话框消除掉,整个被测软件都无法操作了。
反正类似问题会很多,是无法预料的。要对每种可能出现的问题进行处理,很麻烦,也不大可能。

所以我们在某个Case失败后,都会初始化环境,杀掉被测试软件,并重新运行被测软件,重新登录系统。
这样才可以保证初始环境的正常,以避免影响下一个Case的执行。

如果Case执行成功,那就不用这样做了,避免浪费时间。
反正初始环境有问题,最多就牺牲掉下一个Case。下一个Case失败后,又会重新初始化环境了,后面的N多Case就不会受影响了。

[ 本帖最后由 yabest 于 2007-9-13 15:34 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

16#
 楼主| 发表于 2007-9-13 16:31:38 | 只看该作者
非常谢谢yabest地回答!!!!!

[ 本帖最后由 vaguely 于 2007-9-13 16:33 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2007-9-13 16:32:12 | 只看该作者
sdlkfj3 讲的太好了
回复 支持 反对

使用道具 举报

该用户从未签到

18#
 楼主| 发表于 2007-9-13 16:35:59 | 只看该作者
是的,每次听多yabest的讲解,都有胜读十年书的感觉。sdlkfj6
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2007-9-13 16:47:43 | 只看该作者
原帖由 vaguely 于 2007-9-13 16:35 发表
是的,每次听多yabest的讲解,都有胜读十年书的感觉。sdlkfj6


嘿嘿,觉得好,那还不赶快送花!写这些可是很花时间的哦!sdlkfj6
回复 支持 反对

使用道具 举报

该用户从未签到

20#
发表于 2007-9-13 16:51:21 | 只看该作者
说得很细致,学习了。

不过有一个问题。如果局部模式高于全局,那么On Error Resumt Next/On Error goto 0对任何一种全局模式都是有效的。
也就是说它们产生的效果是一样的。

原帖由 yabest 于 2007-9-13 15:11 发表
QTP提供全局错误处理模式,有Popup  message box,Process next action iteration,Stop run,Process next step这四种。

QTP也提供On Error Resumt Next/On Error goto 0的局部错误处理模式。可以在局部范围 ...
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

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

GMT+8, 2024-11-14 17:50 , Processed in 0.084576 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

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