SilkTest入门快打7-异常处理

今天是本教程的最后一讲,本来我是想多写几个主题的,比如数据库操作,测试计划和测试用例,调用dll,tag和multitag的应用,web应用测试还有编程规范等等。可是,越到后面,我越觉得很多实例很难用文字描述清楚。抓图是一个可行的办法,可我又嫌麻烦,投入产出不成正比。最后决定只再介绍一下SilkTest的异常处理,希望能给初学者留下一个关于异常处理机制的印象,更多的内容,可能还是要靠大家自己在实践中学习和摸索。

一般来说,异常处理是高级语言语法必备的一部分。你不必把它想的很神秘,它只是提供了一种机制让程序员有能力应对预期以外的状况发生。SilkTest作为一种高级的面向对象的脚本语言,当然也提供了异常处理的方法。我在本讲只讲如何使用最常见的do…except结构来处理异常。
上一讲中的testcase,一共做了两步,第一步点击数字键1然后打印结果框的值,第二步点击C键清零再打印结果框的值。如果你不小心少敲了第14行代码的话,你Cal.t代码应该如下:
[-] winclass Calculator   //1
[ ] String sResult    //2
[-] Void ClearResult() //3
[ ] 计算器.C.Click() //4
[-] void GetResult()    //5
[ ] sResult = 计算器.CalResult.GetText() //6
[-] Void ClickNum1() //7
[ ] 计算器.N1.Click() //8

[ ] window Calculator Cal //10

[-] testcase CalSetAndClear() //11
[ ] 计算器.SetActive() //12
[ ] Cal.ClickNum1()   //13
[ ] //Cal.GetResult()   //14,假设你注释了这行
[ ] Print(Cal.sResult) //15
[ ] Cal.ClearResult() //16
[ ] Cal.GetResult() //17
[ ] Print(Cal.sResult) //18

你在运行时会报错如下:
[ ] *** Error: Variable (sResult) has not been set
[ ] Occurred in CalSetAndClear at Cal.t(15)

报错的原因是,由于你没有调用Cal.GetResult(),所以导致Cal.sResult没有初始化,当SilkTest运行到第15行会认为这是一个严重的问题,就会抛出一个异常。而你的代码中没有异常处理结构,这个异常不会被捕获处理,系统默认行为就是终止case运行,然后打印相关的信息提醒用户。
我们在入门快打2中也使用了抛出异常的函数raise,那是用户主动抛出通知系统的,而本讲中是系统抛出的。但是他们的结果都一样,如果没有被处理的话,该异常会导致SilkTest的退出。
未被处理的异常有时候会是一个问题,想象一下,假设你的测试有100步,当测试运行到第10步时,突然测试脚本报一个异常(可能是待测软件的问题,可能是环境的问题,也可能是你编写的脚本的问题),你如果不处理,测试即时终止,那么其后的90步都无法运行。这很可能不是我们期望的结果。

不要急,在这种情况下,你可以用do…except将可能出现异常的代码段封起来(具体哪些代码段可能出现异常,只能根据你靠经验来判断了),例如:

 

 

Do    OneObject.Click()except    LogError (”can’t click OneObject”)DoSomeOtherThings()

假如我们执行上面得代码时,OneObject这个对象并没有出现,那么OneObject.Click()这句就会抛出一个异常,没关系,紧接其后的except结构会发现这个异常,并且记录一个Error的log,当except结构中的语句都执行完后,SilkTest将继续正常执行,也就是执行do…except结构之后的DoSomeOtherThings()语句。

说了这么多,让我们在Cal.t这个会抛出异常的case中引入异常处理机制吧。
我们改写代码成如下形式:
[-] winclass Calculator
[ ] String sResult
[-] Void ClearResult()
[ ] 计算器.C.Click()
[-] void GetResult()
[ ] sResult = 计算器.CalResult.GetText()
[-] Void ClickNum1()
[ ] 计算器.N1.Click()
[ ] window Calculator Cal

[-] testcase CalSetAndClear()
[ ] 计算器.SetActive()
[-] do                        //1
[ ] Cal.ClickNum1()        //2
[ ] //Cal.GetResult()      //3
[ ] Print(Cal.sResult)     //4
[-] except                     //5
[ ] Print(“Catch an exception”) //6

    [ ] Cal.ClearResult()
[ ] Cal.GetResult()
[ ] Print(Cal.sResult)

现在当SilkTest执行到行4时,会抛出一个异常,接着就被其后的except捕获这个异常,打印一句提示后,程序继续运行剩余的三行代码。最终的结果将打印:
[ ] Catch an exception
[ ] 0.
如果你没有注释行3的话,那么当然不会有异常被抛出,那么程序将会正常执行,也就是说except中的语句不会起作用。怎么样,你现在是不是又多了一种操纵silktest脚本的武器?

(SilkTest入门快打系列共7讲,全文完)

Comments 4

  1. Reply

    博主你好,很荣幸在这里能找到一些资料,但我刚接触silktest不久,现在公司遇上这样一个场景,公司需要自动检测从公网通过vpn连接是否能访问内网的应用,过程如下:
    1、首先打开一个基于C/S的SSL VPN工具
    2、输入连接地址、用户名和口令后连接
    3、如果输入正确的话,会输入动态令牌密码(已针对测试账号设置了了一个固定的密码)
    4、验证通过后会自动弹出IE窗口打开一个固定的地址,然后基于这个网页进行后续的检查操作。

    我使用了很多对象来录制这个脚本,但总是出现问题,现在想请问下博主像这种先从C/S登录后自动转到B/S的场景用silktest是否能实现,谢谢了。

    1. Reply

      你好,根据你的描述,我觉得silktest是可以完成你说的这个任务的。
      我想说的是,光靠录制,脚本是不稳定的,因为录制里面的代码可能是基于坐标和动作的,重放的时候很可能无法完成你期望的工作。
      建议你编写代码驱动GUI对象来做你想要实现的动作。

      1. Reply

        谢谢回复。由于刚接触这个软件,还没有太多的感觉,我先学习下代码,另如果博主有相关类似例子并且不涉及涉密的情况下,也希望能发给我参考下,谢谢。
        另像这种C/S混合B/S的应用,在建立project的时候一般是选择open agent还是classic agent还是其它的?

        1. Reply

          不好意思,我手头倒是没有类似的代码供你参考。
          建议你建立web的项目,这样web端你可以录制。silktest 2008以后的web项目默认是open agent的。

zengyuetian进行回复 取消回复

请输入正确的验证码