SilkTest点滴17 – 异常相关函数

开发任何软件都需要检测软件的运行情况,记录相应的日志,为以后的跟踪提供依据。作为测试软件,SilkTest提供了不少函数来方便测试工程师记录系统信息,尤其系统发生异常时的信息。这节就简单介绍一下silktest中常用的一些异常相关函数。

 

在这之前呢,让我们复习一下,silktest默认的异常处理机制:

 

如果一个testcase失败,例如期望值和你需要验证的表达式的值不匹配,silktest在默认情况下会调用内置的复原系统,该系统会做如下的一些事情:

 

结束该testcase,把错误记录到result文件中,并且将你的应用恢复到默认的基本状态,为执行下一个case做好准备。

 

如果我们需要处理异常的话,可以把觉得可能产生异常的语句用do…except…包起来,这样在do里面产生的异常就可以在except语句块中进行处理啦。

 

异常相关的函数都是以Except单词开头的,例如ExceptCall,ExceptData等等。

 

1.       ExceptData()

 

该函数返回值是最近一条异常的数据,它的类型是ANYTYPE。其实,这里面有两种情况,如果最近的这个异常是silktest自动产生的异常,那么该函数返回的是该错误的信息字符串,如果是用户自定义的异常,即用户使用raise或者reraise产生的异常,那么返回值是ANYTYPE类型。下面是silktest帮助里面提供的一个例子:

 

testcase ExceptDataExample ()

 

           do

 

              Verify (“xxx”, “yyy”)

 

           except

 

              Print (ExceptData ())

 

           do

 

              raise 1, “My error”

 

           except

 

              Print (ExceptData ())

 

           do

 

              Print (“This will cause an exception. {5/0}”)

 

           except

 

              Print (ExceptData ())

 

       该testcase输出的结果如下:

 

        *** Error: Verify Failed – expected yyy, got xxx    //这是自动产生的异常,所以是字符串

 

        My error                                   //这是用户自定义的

 

        *** Error: Divide by zero                      //这是自动产生的
2.       ExceptLog()

 

该函数将把异常信息记录进result文件。它通过调用内置的LogError函数把最接近的一条异常记录进result文件。它也可以把发生异常时的调用堆栈的相关信息写入result文件。
3.       ExceptNum()

 

该函数返回最近一个异常的异常号。该异常号是一个负整形数值,为了避免冲突,一般使用正数来表示你自己抛出的异常。下面是一个使用ExceptNum函数来判断异常号的testcase:

 

       testcase ExceptNumExample ()

 

           do

 

              Verify (“xxx”, “yyy”)

 

           except

 

              Print (ExceptNum () == E_VERIFY)

 

           do

 

              raise 1, “My error”

 

           except

 

              Print (ExceptNum ())

 

           do

 

              Print (“This will cause an exception. {5/0}”)

 

           except

 

              Print (ExceptNum () == E_DIVIDE_BY_ZERO)

 

       Testcase的执行结果如下:

 

        TRUE

 

        1

 

        TRUE
4.       ExceptCall()

 

该函数返回一系列导致异常发生的函数调用,也就是说它的返回值类型是LIST OF CALL。一个CALL记录有三个域,它们分别是:

 

描述
iLine
返回函数调用或者是异常发生的行号(Integer)
sFunction
异常发生所在的函数名(String)
sModule
包含sFunction的文件名(String)
下面是一个例子:

 

testcase ExceptCallsTest ()

 

           do

 

              MyFunction ()

 

           except

 

              PrintCallStack (ExceptCalls ())

 

        MyFunction ()

 

           Print (“In MyFunction”)

 

           raise 1, “raise an exception here”

 

        PrintCallStack (LIST OF CALL 1cCall)

 

           CALL Call

 

           for each Call in lcCall

 

              Print (“MODULE: {Call.sModule}”,

 

                     “FUNCTION: {Call.sFunction}”,

 

                     “LINE: {Call.iLine}”)

 

       该脚本的执行结果如下:

 

        In MyFunction
MODULE: test.t FUNCTION: MyFunction LINE: 12

 

MODULE: test.t FUNCTION: main LINE: 4
5.       ExceptPrint()

 

该函数打印所有关于异常的信息到result文件。该函数将调用ExceptCalls, ExceptData, ExceptNum等函数的结果集合起来,打印到result文件。如果ExceptData没有返回值,那么将使用ExceptNum的结果代替它。

 

下面是一个例子:

 

testcase ExceptPrintExample ()

 

           do

 

              Verify (“xxx”, “yyy”)

 

           except

 

              ExceptPrint ()

 

           do

 

              raise 1, “My error”

 

           except

 

              ExceptPrint ()

 

           do

 

              Print (“This will cause an exception. {5/0}”)

 

           except

 

              ExceptPrint ()

 

        该脚本的执行结果如下:

 

        *** Error: Verify failed – expected yyy, got xxx

 

        Occurred in Verify

 

        Called from main at test.t(3)

 

        My error

 

        Occurred in main at test.t(6)
*** Error: Divide by zero

 

        Occurred in main at test.t(9)
6.       ExceptClear()

 

该函数清除当前异常的信息,在调用它之后,其它的异常处理函数调用时就好像没有异常发生过一样:

 

a.       ExceptCall将会返回一个空的列表。

 

b.       ExceptData将会返回NULL

 

c.       ExceptLog不会打印任何东西(没有任何错误被记log)

 

d.       ExceptNum将会返回0

 

e.       ExceptPrint将不会打印任何东西

Leave a comment

请输入正确的验证码