51Testing软件测试论坛

标题: 请教一个QTP出错处理的问题(和yabest的框架有关) [打印本页]

作者: vaguely    时间: 2007-9-12 18:51
标题: 请教一个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 编辑 ]
作者: vaguely    时间: 2007-9-12 19:14
大家都下班回家了么sdlkfj6
作者: vaguely    时间: 2007-9-12 19:17
还发现另一个问题,
如果在运行中有错误发生,设置了遇错返回。
运行中的主窗口会被QTP关掉。但是其他窗口就无法关掉。
怎么办呢?谢谢
作者: winfood    时间: 2007-9-13 09:48
原帖由 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
作者: C060706    时间: 2007-9-13 10:04
标题: 回复 #3 vaguely 的帖子
我也遇到过楼主的第二个问题!
关注。。。
作者: C060706    时间: 2007-9-13 10:07
但是我在处理问题的时候,是打开QTP,发现自己的参数设置不对了!
从而导致了,窗口被关。也不晓的具体是什么原因引起的,不过问题是解决了。

也想请教大虾们,为什么参数能使窗口关闭呢?
作者: vaguely    时间: 2007-9-13 10:35
谢谢winfood!  

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

再次请教大家
作者: winfood    时间: 2007-9-13 10:53
原帖由 vaguely 于 2007-9-13 10:35 发表
谢谢winfood!  

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

再次请教大家

如果你在脚本中使用了On Error的错误控制方式,就不应该用QTP的"遇错退出"方式了。
QTP要为不同的处理方式选择一个优先执行的,发生错误的时候"遇错退出"被优先执行了On Error部分就没有意义了。
不知道我的理解对不对sdlkfj2
作者: vaguely    时间: 2007-9-13 11:03
谢谢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

这样做的好处就是如果其中一个函数发生错误,一点都不会影响下一个函数的调用
作者: winfood    时间: 2007-9-13 11:27
你在代码里面已经很好的控制了错误,再修改Test Setting里面设置就没有必要了吧?

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

你可以试一下,看看QTP到底是以什么顺序运行的。如果你了解一些程序开发的错误处理机制,对有助于理解和设计你的错误处理程序。
作者: vaguely    时间: 2007-9-13 11:37
谢谢Winfood,

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

我想yabest采用“遇错退出"这种方式应该有他的道理(有点盲目崇拜sdlkfj6 )
是不是能够从某些地方得到出错的信息呢。 我觉得好像很有玄机,hehe
作者: vaguely    时间: 2007-9-13 12:15
刚才又发现了这样做的一个好处。
我把Options->Run->
Save step screen captrue to results: On errors and warnings


这样如果某个地方出错了,可以在test result中得到出错地方的screen shot.
这样听方便的,不用自己写抓屏的语句了。
作者: vaguely    时间: 2007-9-13 14:52
sdlkfj1
作者: 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的局部错误处理模式。可以在局部范围内实现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 编辑 ]
作者: yabest    时间: 2007-9-13 15:32
原帖由 vaguely 于 2007-9-12 19:17 发表
还发现另一个问题,
如果在运行中有错误发生,设置了遇错返回。
运行中的主窗口会被QTP关掉。但是其他窗口就无法关掉。
怎么办呢?谢谢


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

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

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

[ 本帖最后由 yabest 于 2007-9-13 15:34 编辑 ]
作者: vaguely    时间: 2007-9-13 16:31
非常谢谢yabest地回答!!!!!

[ 本帖最后由 vaguely 于 2007-9-13 16:33 编辑 ]
作者: winfood    时间: 2007-9-13 16:32
sdlkfj3 讲的太好了
作者: vaguely    时间: 2007-9-13 16:35
是的,每次听多yabest的讲解,都有胜读十年书的感觉。sdlkfj6
作者: yabest    时间: 2007-9-13 16:47
原帖由 vaguely 于 2007-9-13 16:35 发表
是的,每次听多yabest的讲解,都有胜读十年书的感觉。sdlkfj6


嘿嘿,觉得好,那还不赶快送花!写这些可是很花时间的哦!sdlkfj6
作者: jackymail    时间: 2007-9-13 16:51
说得很细致,学习了。

不过有一个问题。如果局部模式高于全局,那么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的局部错误处理模式。可以在局部范围 ...

作者: vaguely    时间: 2007-9-13 16:52
没找到“花“的图标sdlkfj6 ,不然的话,一定送!!
作者: yabest    时间: 2007-9-13 16:58
原帖由 jackymail 于 2007-9-13 16:51 发表
说得很细致,学习了。

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


不是说了嘛,局部高于全局,但是局部只在当前函数的局部范围内有效。
而Case函数及其子函数是受全局控制的,这就不一样了!

比如说这个主控Test,如果全局的设置成On error continue next step,那么Case函数里某个步骤发生错误了,Case函数还是会继续执行下一步骤,就会错上加错了!

所以全局的还是要设置成Stop Run模式!

[ 本帖最后由 yabest 于 2007-9-13 17:00 编辑 ]
作者: vaguely    时间: 2007-9-13 17:02
Yabest, 还想继续问你

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

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

请问您是怎么做的“杀掉被测试软件,并重新运行被测软件"
我测是web应用系统,出错后,主窗口自动被杀掉了。请问别的副窗口怎么杀掉呢?谢谢
作者: yabest    时间: 2007-9-13 17:02
原帖由 vaguely 于 2007-9-13 16:52 发表
没找到“花“的图标sdlkfj6 ,不然的话,一定送!!


不用啦,有人替你送了!sdlkfj7
呵呵,还是jackymail有良心啊,良心大大的!sdlkfj3
作者: yabest    时间: 2007-9-13 17:06
原帖由 vaguely 于 2007-9-13 17:02 发表
Yabest, 还想继续问你

请问您是怎么做的“杀掉被测试软件,并重新运行被测软件"
我测是web应用系统,出错后,主窗口自动被杀掉了。请问别的副窗口怎么杀掉呢?谢谢



这个时候一定要心狠手辣,斩草除根,绝不留情!!!

SystemUtil.CloseProcessByName("别怪我杀你,都是被逼的!没有人能够逃出去,我不做个坏蛋,就得滚蛋,我不杀了你,就会吃亏!被逼的!被逼的!被逼的!被逼的!.exe")

这么小气,问题却挺多的!sdlkfj8

[ 本帖最后由 yabest 于 2007-9-13 17:12 编辑 ]
作者: vaguely    时间: 2007-9-13 17:09
sdlkfj3 sdlkfj3 sdlkfj3

送给yabest老师的礼物

Report Manager
http://www.advancedqtp.com/knowl ... s/reporter-manager/

我现在把它应用在我的框架中(从您那偷学来的)非常好
作者: jackymail    时间: 2007-9-13 17:34
On error resume next
call testcase
msgbox err.number
err.clear
On error goto 0

Function testcase
   msgbo "Test case"
End Function
不知道我这段话是不是文中讨论的问题
我在function里面故意加了一个错误,选择4中全局模式,产生效果一样,因为两个on error把需要处理的局部已经包住。

原帖由 yabest 于 2007-9-13 16:58 发表

不是说了嘛,局部高于全局,但是局部只在当前函数的局部范围内有效。
而Case函数及其子函数是受全局控制的,这就不一样了!

比如说这个主控Test,如果全局的设置成On error continue next step,那么Case ...

作者: yabest    时间: 2007-9-13 17:39
原帖由 jackymail 于 2007-9-13 17:34 发表
On error resume next
call testcase
msgbox err.number
err.clear
On error goto 0

Function testcase
   msgbo "Test case"
End Function
不知道我这段话是不是文中讨论的问题
我在function里面故 ...


你试试这个!对象库里不用建任何对象!


  1. On error resume next
  2. call testcase
  3. msgbox "Error Number=" & Err.Number & ", Error Desc=" & Err.Description
  4. err.clear
  5. On error goto 0

  6. Function testcase
  7.   msgbox "test 111"
  8.   JavaWindow("111").Close
  9.   msgbox "test 222"
  10.   JavaWindow("222").Close
  11.   msgbox "test 333"
  12.   JavaWindow("333").Close
  13. End Function

复制代码

作者: vaguely    时间: 2007-9-13 17:42
好像只有我们几个在讨论这个帖子。似乎大多数人不太感兴趣。
不过yabest的方法,可以抛弃在程序中不厌其烦的写出错判断,这么好的方法没人顶,
我也只好自己偷着乐了
作者: jackymail    时间: 2007-9-13 17:44
单纯运行这段代码,设置成几种全局模式得到的效果是一样的。
做法:我把代码拷贝到action里面,然后修改test option里面run的设置。

原帖由 yabest 于 2007-9-13 17:39 发表


你试试这个!对象库里不用建任何对象!


On error resume next
call testcase
msgbox "Error Number=" & Err.Number & ", Error Desc=" & Err.Description
err.clear
On error goto 0

Function  ...

作者: jackymail    时间: 2007-9-13 17:46
我觉得这种抛弃也无非是一种取舍,没有替代作用,如果自己编写容错和错误收集,这种方法是不能替代的。
这只是给了一种全局/局部范围内 决定 取舍的方法。
两个on error 决定了被其包围的部分使用on error resume next方法,外部代码的该怎样处理还怎样处理
原帖由 vaguely 于 2007-9-13 17:42 发表
好像只有我们几个在讨论这个帖子。似乎大多数人不太感兴趣。
不过yabest的方法,可以抛弃在程序中不厌其烦的写出错判断,这么好的方法没人顶,
我也只好自己偷着乐了

作者: vaguely    时间: 2007-9-13 17:52
"如果自己编写容错和错误收集"

那样的话,要写多少呢?严格的话,每一个步骤都要写。
我反正觉得太累了。

Yabest的方法,不用提前写任何的错误预判。
却可以捕捉到任何的错误,以及信息。还有错误发生的地点,图片。
这样做不是很简单有效么
作者: jackymail    时间: 2007-9-13 17:57
。。。。。。

具个例子吧。
当发生某种错误的时候。就将被测试软件返回到某一个步骤,而不是直接杀掉进程。因为毕竟有些软件那样做代价太大。也可能损失之前的操作步骤,anyway.现在就是说如果要在错误发生的时候去对被测软件执行一些操作
在这种情况下,光收集错误是没有用的。必须要有接下来的步骤去处理想关操作,而不是vbscript得on error.
还有一些情况比如用某个对象的属性存在与否,是否等于某个值。这种情况下很可能vbscript是收集不到错误的。

总之on error只是一种接收和容纳错误的方法,其中一种而已,yabest给他总结出来了。。


原帖由 vaguely 于 2007-9-13 17:52 发表
"如果自己编写容错和错误收集"

那样的话,要写多少呢?严格的话,每一个步骤都要写。
我反正觉得太累了。

Yabest的方法,不用提前写任何的错误预判。
却可以捕捉到任何的错误,以及信息。还有错误发生的 ...

[ 本帖最后由 jackymail 于 2007-9-13 18:07 编辑 ]
作者: jackymail    时间: 2007-9-13 18:01
咸鱼不在线,估计下班了。。。
作者: yabest    时间: 2007-9-13 18:11
刚实验了一下,都晕了,好像还更复杂!好像多了一条规律!

On Error Resume Next/On Error goto 0范围内调用的子孙函数,都自动变成Stop Run模式了!!!

我们主控Test本来就是Stop Run模式,所以没受影响,没发现这个规律!

[ 本帖最后由 yabest 于 2007-9-13 18:12 编辑 ]
作者: vaguely    时间: 2007-9-13 18:24
yabest ,能把我加到你的msn么?谢谢
我刚给你发了邀请. 我保证,平时不汇总打扰你的
作者: jackymail    时间: 2007-9-13 18:39
on error只控制紧邻他的那个语句或者函数,不管其它的
如果控制2个function就要2个on error

原帖由 yabest 于 2007-9-13 18:11 发表
刚实验了一下,都晕了,好像还更复杂!好像多了一条规律!

On Error Resume Next/On Error goto 0范围内调用的子孙函数,都自动变成Stop Run模式了!!!

我们主控Test本来就是Stop Run模式,所以没受影响 ...

作者: walker1020    时间: 2007-9-13 23:26
好久没有见到这么深入的讨论了,非常感谢楼主 vaguely 的不断提问,更要感谢yabest 和jackymail 的细致、专业、负责的回复。
作者: vaguely    时间: 2007-9-14 09:50
谢谢斑竹对我的表扬,有点小骄傲现在sdlkfj6
作者: ppent    时间: 2007-9-14 12:02
这帖子非顶不可,学习到不少东西,特别是错误处理策略。送朵花表示感谢。
yabest研究的很深入,是我的偶像。
作者: yabest    时间: 2007-9-14 13:49
原帖由 ppent 于 2007-9-14 12:02 发表
这帖子非顶不可,学习到不少东西,特别是错误处理策略。送朵花表示感谢。
yabest研究的很深入,是我的偶像。



怎么才送一朵啊sdlkfj5

[ 本帖最后由 yabest 于 2007-9-14 13:51 编辑 ]
作者: jackymail    时间: 2007-9-14 15:25
我自来这论坛以后,除了3个鸡蛋,什么都没得到过。被人用光200多积分。从高级战友一夜变成新手上路。

3个鸡蛋,3个人送的。。。。。

原帖由 yabest 于 2007-9-14 13:49 发表



怎么才送一朵啊sdlkfj5

作者: yabest    时间: 2007-9-14 15:41
原帖由 jackymail 于 2007-9-14 15:25 发表
我自来这论坛以后,除了3个鸡蛋,什么都没得到过。被人用光200多积分。从高级战友一夜变成新手上路。

3个鸡蛋,3个人送的。。。。。



天降大任,必先苦其心志。。。

看来你前途大大的!要坚持!我是很看好你的!!!sdlkfj3
作者: vaguely    时间: 2007-9-14 15:51
我到现在在才明白花是要买的。可是我一分钱都没有sdlkfj9
不知道在这里前要怎么赚,除了卖帖子(我不喜欢)
作者: yabest    时间: 2007-9-14 15:56
原帖由 vaguely 于 2007-9-14 15:51 发表
我到现在在才明白花是要买的。可是我一分钱都没有sdlkfj9
不知道在这里前要怎么赚,除了卖帖子(我不喜欢)


“鲜花每束的价格为每朵:0金钱” !!!

小气就认了呗! 不要找借口嘛!sdlkfj8

[ 本帖最后由 yabest 于 2007-9-14 15:58 编辑 ]
作者: ppent    时间: 2007-10-11 11:59
最近在做一些产品自动化测试的尝试,在研究yabest的这个处理模式时,遇到一些问题。由于对QTP还不能很深入的掌握,因此提出来请教大家,看如何解决。
yabest的这种方式应用于顶层的主控脚本中,在此脚本中通过call function的方式调用"本脚本中"的其他函数。因此,测试用例必须以function的形式出现在主控Test中,才能达到这种局部和全局的错误处理控制效果。
问题1:如果将function统一放到vbs中,则错误控制处理无效(出错时直接stoprun了,不能返回到主控Test)。但将所有的用例以function的形式放到主控Test中不便于维护。
问题2:如果将function换成Action,将用例放到各个usable的Action中,在主控Test调用,该错误处理控制也无效。

那么,怎样的脚本组织方式,才能更好的做到错误处理呢?
作者: 木卫十二    时间: 2007-10-11 14:31
嗯,跟楼上有相似的问题。。
我的错误处理是用Recovery Scenario调用处理错误的Function来进行的,也有一些缺陷。
正琢磨着更好的办法。。。
作者: yabest    时间: 2007-10-11 15:39
原帖由 ppent 于 2007-10-11 11:59 发表
...
yabest的这种方式应用于顶层的主控脚本中,在此脚本中通过call function的方式调用"本脚本中"的其他函数。因此,测试用例必须以function的形式出现在主控Test中,才能达到这种局部和全局的错误处理控制效果。
问题1:如果将function统一放到vbs中,则错误控制处理无效(出错时直接stoprun了,不能返回到主控Test)。但将所有的用例以function的形式放到主控Test中不便于维护。
问题2:如果将function换成Action,将用例放到各个usable的Action中,在主控Test调用,该错误处理控制也无效。


怎么叫错误控制处理无效呢?函数不管是放在vbs文件里,还是放在action里,通过On Error Resume Next/On Error goto 0方式调用函数,主控Test都可以捕获函数里发生的错误的!
作者: yabest    时间: 2007-10-11 15:42
原帖由 木卫十二 于 2007-10-11 14:31 发表
嗯,跟楼上有相似的问题。。
我的错误处理是用Recovery Scenario调用处理错误的Function来进行的,也有一些缺陷。
正琢磨着更好的办法。。。


其实出错后首要的是报告错误原因,恢复处理可以在外层处理。
没有用过Recovery Scenario,但是不知道Recovery Scenario方式能报告发生错误的错误原因吗?
作者: 木卫十二    时间: 2007-10-11 16:21
恢复场景有很大的局限性,只能对特定对象的错误操作,如我的项目一般错误会弹出对话框,就是用它处理的。。

用所讨论的On error resume next的办法我把函数放在vbs里调用时就不管用了,只能在同一个test 里可用。不知道是不是我的某些设置的问题。
我把一般的出错设置是pop up message box。。。调用时就直接弹出了出错框
作者: ppent    时间: 2007-10-11 16:25
原帖由 yabest 于 2007-10-11 15:39 发表


怎么叫错误控制处理无效呢?函数不管是放在vbs文件里,还是放在action里,通过On Error Resume Next/On Error goto 0方式调用函数,主控Test都可以捕获函数里发生的错误的!

奇怪了,在我的脚本中,只有当前Test的function call才能正确的处理错误,如果放到VBS中就直接停止了。Test Settings的错误处理是stop run。
yabest,是否还有其他地方需要设置?
作者: ppent    时间: 2007-10-11 16:31
我的脚本
'Test
Err.Clear
On Error Resume Next
call aa()

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

'my.vbs
Function aa()
   Browser("FreeQuery").Close                '访问不存在的页面,制造错误
         msgbox "aaa"
End Function
作者: danmy    时间: 2007-10-11 17:22
QTP自带的Recovery Scenario其实就是很好的错误处理的方式,可以自己写一个错误处理函数,出错由场景判断.

我现在的函数是出错则重复当前操作,连续出错5次stop Test.(因为会有些希望忽略的错误,由别的场景来进行处理,此时这个地方会记录一个错误,处理不及时或许2到3个错误)
日志里记录出错的对象,出错描述,出错对象的参数.
作者: hsjzfling    时间: 2007-10-11 17:22
这两周一直在找这篇帖子没找到,现在总算发现了,这么好的帖子不可不顶,收藏+学习~
作者: yabest    时间: 2007-10-12 16:53
原帖由 ppent 于 2007-10-11 16:25 发表

奇怪了,在我的脚本中,只有当前Test的function call才能正确的处理错误,如果放到VBS中就直接停止了。Test Settings的错误处理是stop run。
yabest,是否还有其他地方需要设置?


呵呵,我试了一下,用Resource->Libraries来加载vbs文件,好像有这个问题!

不过我的框架是通用的,所以是用Executefile方法来动态加载vbs文件的,可以正常捕获错误信息,没有问题。
你也可以试试用Executefile方法来加载!
作者: jifeng    时间: 2008-8-29 13:38
好贴,顶起
作者: zte_boy    时间: 2008-8-29 14:22
Resource->Libraries加载的vbs执行时的错误是无法返回主控的action,只要executefile的才可以
通常的做法是动态加载
executefile filename
execute "call "& functionname
作者: lin85210    时间: 2008-10-30 15:04
看了看,绝对经典。楼主,谢谢你
作者: daren_liu    时间: 2008-10-31 17:51

作者: walker1020    时间: 2009-4-19 20:36
此帖对QTP出错处理讨论地非常深入,值得仔细研究和学习。
作者: freedom_me    时间: 2010-2-20 11:49
::2ku:::
作者: luxiuxiu1987    时间: 2010-9-20 14:36
学习
作者: mowandao1985    时间: 2010-11-2 14:28
好贴,学习啦!
作者: Gasgoo    时间: 2010-11-10 15:41
开始有这种思想了。。
作者: sophiashan07    时间: 2010-12-17 11:41
回复 20# jackymail


    我公司2010年6月份刚在纳斯达克上市,现在要找一名自动化测试组长,薪资福利良好:

我们项目组需要招聘自动化测试组组长,职位信息如下:
1.计算机相关专业本科以上学历,熟悉软件工程师学原理;
2.软件测试相关经验3年以上,其中至少包括2年功能自动化测试经验;
3.熟悉QTP工具的使用,了解QTP原理和对象识别机制;
4.熟悉VBScript脚本语言,能进行相关自动化脚本函数的编写;
5.较强的语言表达和文档编写能力及良好的沟通技巧;
6.有金融银行基础业务知识经验、有网银业务经验为佳;
7.有自动化框架编写、设计经验和软件开发经验有团队管理经验为佳;
8.熟悉Java、J2EE 、WebSphere 、Application Serve、DB2、Oracle等为佳
9.有Unix平台的使用经验(AIX/Solaris/HPUX/Linux)为佳;
欢迎各专业人士来信探讨,谢谢:
shanjing1983@163.com
sophiashan07@hotmail.com




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