utPLSQL示例一

1、测试一个存储过程

考虑以下情况:存储过程运行一些代码,然后通过参数列表返回结果。此时,可以编写一个测试单元,分析OUT和IN OUT参数的值;存储过程运行一些代码,修改了应用中的其他部分(例如表或者文件),参数列表不包含用于分析是否成功执行的参数。因此为了测试是否成功,需要分析/比较被修改的数据结构。

1.1、通过参数进行测试

以下过程接受两个日期参数并返回它们之间的秒数。

 
 

编译成功之后,创建测试包:

SQL> SET SERVEROUTPUT ON FORMAT WRAPPED
SQL> exec utGen.testpkg ('calc_secs_between')

以上语句会在屏幕上产生下面的输出:

CREATE OR REPLACE PACKAGE ut_calc_secs_between
IS
   PROCEDURE ut_setup;
   PROCEDURE ut_teardown;

   -- For each program to test...
   PROCEDURE ut_CALC_SECS_BETWEEN;
END ut_calc_secs_between;
/
CREATE OR REPLACE PACKAGE BODY ut_calc_secs_between
IS
   PROCEDURE ut_setup
   IS
   BEGIN
      NULL;
   END;

   PROCEDURE ut_teardown
   IS
   BEGIN
      NULL;
   END;

   -- For each program to test...
   PROCEDURE ut_CALC_SECS_BETWEEN IS
   BEGIN
      CALC_SECS_BETWEEN (
            DATE1 => ''
            ,
            DATE2 => ''
            ,
            SECS => ''
       );

      utAssert.this (
         'Test of CALC_SECS_BETWEEN',
         ''
         );
   END ut_CALC_SECS_BETWEEN;

END ut_calc_secs_between;
/

也可以直接生成两个单独的文件存储包规范与包体,ut_calc_secs_between.pks与ut_calc_secs_between.pkb,方法如下:

 
 

通过以上方式,utPLSQL能够在每次测试之前自动编译代码。编辑文件,添加各种用例,内容如下:

PROCEDURE ut_CALC_SECS_BETWEEN
IS
   secs PLS_INTEGER;
BEGIN
   CALC_SECS_BETWEEN (
         DATE1 => SYSDATE
         ,
         DATE2 => SYSDATE
         ,
         SECS => secs
    );

   utAssert.eq (
      'Same dates',
      secs,
      0
      );
      
   CALC_SECS_BETWEEN (
         DATE1 => SYSDATE
         ,
         DATE2 => SYSDATE+1
         ,
         SECS => secs
    );

   utAssert.eq (
      'Exactly one day',
      secs,
      24 * 60 * 60
      );
      
END ut_CALC_SECS_BETWEEN;

然后运行测试:

 
 

当然,还可以继续测试其他参数条件。

1.2、通过效果进行测试

以下是一个更复杂的情况。存储过程截断了指定表的所有数据行,定义如下:

 
 

这个过程的测试不能简单地通过检查返回值决定是否成功,而是应该检查表中还存在多少行数据。以下函数能够返回表中的数据行(也可以使用utAssert.eqqueryvalue):

 
 

然后生成测试包,并修改包体:

 
 

为了进行测试,需要截断一个表。这是一个不可逆的操作,因此可以在设置程序中创建一个“临时”表,并在清除程序中删除它。然后运行测试并使用tabCount验证结果:

 
 

2、测试一个存储函数

与存储过程一样,考虑一下情况:函数返回标量值(数字、日期、字符串、布尔值)。此时,可以直接将函数调用嵌套在utAssert断言程序的调用中;函数返回非标量值,例如对象或者集合。此时,需要调用该函数,并验证返回结构的内容;函数返回一个值,同时执行了其他操作,这些操作的成功与否没有通过返回值体现。要想充分测试这种函数(存在“副作用”)可能会非常困难,因为必须考虑各种情况。

2.1、测试一个标量函数

以下定义了一个包中的函数:

 
 

函数str.betwn返回字符串string_in的一个字串,起始位置和结束位置分别为start_in和end_in。

然后生成了一个测试包并修改单元测试程序的内容,如下所示:

 
 

示例二

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24945919/viewspace-743236/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24945919/viewspace-743236/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值