请教一个QTP出错处理的问题(和yabest的框架有关)
下面这段话是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 编辑 ] 大家都下班回家了么sdlkfj6 还发现另一个问题,
如果在运行中有错误发生,设置了遇错返回。
运行中的主窗口会被QTP关掉。但是其他窗口就无法关掉。
怎么办呢?谢谢 原帖由 vaguely 于 2007-9-12 18:51 发表 http://bbs.51testing.com/images/common/back.gif
下面这段话是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
回复 #3 vaguely 的帖子
我也遇到过楼主的第二个问题!关注。。。 但是我在处理问题的时候,是打开QTP,发现自己的参数设置不对了!
从而导致了,窗口被关。也不晓的具体是什么原因引起的,不过问题是解决了。
也想请教大虾们,为什么参数能使窗口关闭呢? 谢谢winfood!
可是我在设置种选择“遇错退出”
发生错误好无法执行到函数内发生错误的下一句,所以无法得到返回值的。
再次请教大家 原帖由 vaguely 于 2007-9-13 10:35 发表 http://bbs.51testing.com/images/common/back.gif
谢谢winfood!
可是我在设置种选择“遇错退出”
发生错误好无法执行到函数内发生错误的下一句,所以无法得到返回值的。
再次请教大家
如果你在脚本中使用了On Error的错误控制方式,就不应该用QTP的"遇错退出"方式了。
QTP要为不同的处理方式选择一个优先执行的,发生错误的时候"遇错退出"被优先执行了On Error部分就没有意义了。
不知道我的理解对不对sdlkfj2 谢谢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
这样做的好处就是如果其中一个函数发生错误,一点都不会影响下一个函数的调用 你在代码里面已经很好的控制了错误,再修改Test Setting里面设置就没有必要了吧?
这两种做法等于告诉QTP在同一个错误发生的时候采取不同的措施,一个继续另外一个是退出。说白了,QTP总要用一个固定的顺序执行的。
QTP运行的时候,只可能固定的采用其中一种:
如果是代码优先,错误就先被代码中的On Error捕捉到了,就可以继续下去;
如果是Setting优先,错误就直接被QTP的Test Setting方式处理了。代码中的On Error不会被执行。
你可以试一下,看看QTP到底是以什么顺序运行的。如果你了解一些程序开发的错误处理机制,对有助于理解和设计你的错误处理程序。 谢谢Winfood,
可是我在我的函数代码里没有写错误的控制。
我想yabest采用“遇错退出"这种方式应该有他的道理(有点盲目崇拜sdlkfj6 )
是不是能够从某些地方得到出错的信息呢。 我觉得好像很有玄机,hehe 刚才又发现了这样做的一个好处。
我把Options->Run->
Save step screen captrue to results: On errors and warnings
这样如果某个地方出错了,可以在test result中得到出错地方的screen shot.
这样听方便的,不用自己写抓屏的语句了。 sdlkfj1 QTP提供全局错误处理模式,有Popupmessage 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、Popupmessage 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 编辑 ] 原帖由 vaguely 于 2007-9-12 19:17 发表 http://bbs.51testing.com/images/common/back.gif
还发现另一个问题,
如果在运行中有错误发生,设置了遇错返回。
运行中的主窗口会被QTP关掉。但是其他窗口就无法关掉。
怎么办呢?谢谢
每个Case出错时,出错位置都是难于预料的,比如弹出某个对话框时出错了。如果没有把这对话框消除掉,整个被测软件都无法操作了。
反正类似问题会很多,是无法预料的。要对每种可能出现的问题进行处理,很麻烦,也不大可能。
所以我们在某个Case失败后,都会初始化环境,杀掉被测试软件,并重新运行被测软件,重新登录系统。
这样才可以保证初始环境的正常,以避免影响下一个Case的执行。
如果Case执行成功,那就不用这样做了,避免浪费时间。
反正初始环境有问题,最多就牺牲掉下一个Case。下一个Case失败后,又会重新初始化环境了,后面的N多Case就不会受影响了。
[ 本帖最后由 yabest 于 2007-9-13 15:34 编辑 ] 非常谢谢yabest地回答!!!!!
[ 本帖最后由 vaguely 于 2007-9-13 16:33 编辑 ] sdlkfj3 讲的太好了 是的,每次听多yabest的讲解,都有胜读十年书的感觉。sdlkfj6 原帖由 vaguely 于 2007-9-13 16:35 发表 http://bbs.51testing.com/images/common/back.gif
是的,每次听多yabest的讲解,都有胜读十年书的感觉。sdlkfj6
嘿嘿,觉得好,那还不赶快送花!写这些可是很花时间的哦!sdlkfj6 说得很细致,学习了。
不过有一个问题。如果局部模式高于全局,那么On Error Resumt Next/On Error goto 0对任何一种全局模式都是有效的。
也就是说它们产生的效果是一样的。
原帖由 yabest 于 2007-9-13 15:11 发表 http://bbs.51testing.com/images/common/back.gif
QTP提供全局错误处理模式,有Popupmessage box,Process next action iteration,Stop run,Process next step这四种。
QTP也提供On Error Resumt Next/On Error goto 0的局部错误处理模式。可以在局部范围 ...