ITPub博客

首页 > Linux操作系统 > Linux操作系统 > utPLSQL构建测试包

utPLSQL构建测试包

原创 Linux操作系统 作者:BUAA_dxy 时间:2012-09-12 13:54:15 0 删除 编辑

1、如何构建测试包

要使用utPLSQL,必须构建一个包含单元测试的测试包。测试包必须符合utPLSQL的API规则,以便utPLSQL能够自动运行测试。

每一个测试包都必须包含:

  • 一个设置程序。注册单元测试并设置测试所需的数据结构。
  • 一个清除程序。删除测试创建的数据结构。
  • 一个或多个单元测试程序。执行单元测试。

测试包、设置程序、清除程序以及单元测试程序都必须遵守utPLSQL的命名约定,参见下文。

1.1、设置程序

utPLSQL.test与utPLSQL.testsuite在运行任何单元测试之前都会调用测试包的设置程序。该程序的包规范形式如下:

CREATE OR REPLACE PACKAGE 
IS
   PROCEDURE setup;

其中是单元测试的前缀,是被测试包(或者独立程序)的名称。默认的命名规则是测试包与所有的utPLSQL程序,包括设置程序,拥有一个前缀“ut_”,如下所示:

CREATE OR REPLACE PACKAGE ut_
IS
   PROCEDURE ut_setup;

注释:如果使用手动方式注册单元测试(非默认设置并且不推荐使用),参见下文命名约定查看何时及如何应用前缀。

定义测试数据结构

使用设置程序定义测试需要的数据结构。例如,创建一个存储比较信息的临时表,一个集合、记录或者全局标量变量。

以下是一个设置程序的例子,参见ut_te_employee.pkb文件。

PROCEDURE ut_setup
IS
BEGIN
   ut_teardown;
   EXECUTE IMMEDIATE 'CREATE TABLE ut_employee AS
         SELECT * FROM employee';

   EXECUTE IMMEDIATE 'CREATE TABLE ut_DEL1 AS
         SELECT * FROM employee';

   EXECUTE IMMEDIATE 'CREATE TABLE ut_DELBY_EMP_DEPT_LOOKUP AS
         SELECT * FROM employee';
END;

也可以将以上语句写入每个单独的测试程序。在设置程序中存储这些语句的好处是更容易管理,并且更容易清除。

手动注册单元测试

如果选择手动注册单元测试程序,必须调用utPLSQL.registertest注册每个程序。不推荐这种方式。以下是一个用于PLVdate包的设置程序示例:

CREATE OR REPLACE PACKAGE BODY ut_plvdate
IS
   PROCEDURE ut_setup
   IS
   BEGIN
      utplsql.addtest ('ut_to_date');
      utplsql.addtest ('ut_to_char');
   END;

传入utPLSQL过程的名字必须匹配单元测试程序的接口名称。因此以上两个调用告诉utPLSQL查找两个单元测试程序,ut_to_date与ut_to_char。

1.2、清除程序

utPLSQL.test与utPLSQL.testsuite在运行完单元测试之后会调用测试包的清除程序。使用该程序删除测试使用的任何数据结构。通常,该程序的内容逻辑上与设置程序相反。该程序的包规范形式如下:

CREATE OR REPLACE PACKAGE 
IS
   PROCEDURE teardown;

其中是单元测试的前缀,是被测试包(或者独立程序)的名称。默认的命名规则是测试包与所有的utPLSQL程序,包括设置程序,拥有一个前缀“ut_”,如下所示:

CREATE OR REPLACE PACKAGE ut_
IS
   PROCEDURE ut_teardown;

以下是一个常用清除程序的示例,它什么也不做:

CREATE OR REPLACE PACKAGE ut_sales_pkg
IS
   PROCEDURE teardown
   IS
   BEGIN
      NULL;
   END;

即使清除程序什么也不做,它仍然必须出现在包规范与包体中。utPLSQL将会作为标准操作流程查找并尝试执行该程序。在设置程序中创建的东西,很可能需要在清除程序中清除。可能是删除或截断表、执行ROLLBACK或者仅仅是确保文件与游标已经关闭。以下是一个示例:

PROCEDURE teardown
IS
BEGIN
   mycollection.DELETE;
   EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || workspace_tab;
   DBMS_SESSION.FREE_UNUSED_USER_MEMORY;
END;

1.3、单元测试程序

单元测试程序的通用格式如下:

CREATE OR REPLACE PACKAGE 
IS
   PROCEDURE ;

其中是单元测试的前缀,是被测试包(或者独立程序)的名称。默认的命名规则是测试包与所有的utPLSQL程序拥有一个前缀“ut_”。可以在调用utPLSQL.test或者upPLSQL.testsuite时使用自定义的前缀覆盖默认值。在某些情况下,可以删除单元测试程序的前缀,但是不推荐。以下是一个非常典型的包规范,包含一个单元测试过程:

-- Test package for stand alone program
CREATE OR REPLACE PACKAGE ut_
IS
   PROCEDURE ut_setup;
   PROCEDURE ut_teardown;
   PROCEDURE ut_;
END;

单元测试程序的包体需要根据测试测内容编写,基本的格式如下:

PROCEDURE 
IS
BEGIN
   

   -- call a utAssert assertion to check results:
   utAssert. (...);

   
EXCEPTION
   WHEN OTHERS
   THEN
      utAssert.this (
         'Unknown failure of : ' || SQLERRM,
         FALSE);
END;

在异常模块使用一个utAssert断言程序捕获意外错误并注册一个测试失败(第二个参数设置为FALSE)。也可以添加捕获其他特定异常的处理程序,如NO_DATA_FOUND,并且注册一个失败或者忽略该异常,因为它可能不是一个真实的测试失败。

以下是一个包含多个用于不同测试用例的断言程序调用的单元测试程序。

PROCEDURE ut_BETWNSTR IS
BEGIN
   utAssert.eq (
      'Typical valid usage',
      BETWNSTR(
         STRING_IN => 'abcdefg'
         ,
         START_IN => 3
         ,
         END_IN => 5
         ),
      'cde'
      );
      
   utAssert.isnull (
      'NULL start',
      BETWNSTR(
         STRING_IN => 'abcdefg'
         ,
         START_IN => NULL
         ,
         END_IN => 5
         )
      );

   utAssert.isnull (
      'NULL end',
      BETWNSTR(
         STRING_IN => 'abcdefg'
         ,
         START_IN => 2
         ,
         END_IN => NULL
         )
      );
      
   utAssert.isnull (
      'End smaller than start',
      BETWNSTR(
         STRING_IN => 'abcdefg'
         ,
         START_IN => 5
         ,
         END_IN => 2
         )
      );
      
   utAssert.eq (
      'End larger than string length',
      BETWNSTR(
         STRING_IN => 'abcdefg'
         ,
         START_IN => 3
         ,
         END_IN => 200
         ),
      'cdefg'
      );
      
END ut_BETWNSTR;

测试一个程序时,首先调用该程序,然后调用适当的断言程序测试它的输出。

查看示例了解编写单元测试程序的不同方式。

1.4、命名约定

执行测试或者测试套件时,utPLSQL基于被测试程序的名称查找测试包。然后执行该包中的程序。utPLSQL可以测试独立的程序(过程或者函数)或者包中的程序。测试包中的内容时,可将单元测试程序放入与被测试代码相同的包中,或者单独的包中。

为了简化问题,utPLSQL默认模式遵从以下简单规则:

单元测试包与每个utPLSQL相关程序(设置、清除以及单元测试)必须使用相同的前缀。

默认的前缀是“ut_”,但是可以改写。

如果使用utPLSQL默认值并且自动检测与执行单元测试,忽略下文内容!

如果选择手动执行单元测试的注册,仔细阅读以下部分,因为某个情况下不应该应用utPLSQL前缀。

本节描述utPLSQL查找并执行单元测试的约定和规则,包括以下3种情况。

使用单独的测试包测试基于包的程序

如果将单元测试代码放入一个与被测试代码分离的包中(默认设置),测试包的名称必须采用以下格式:

其中,<prefix>是utPLSQL前缀,是包含被测试代码的包的名称。

可以采用以下方式之一指定前缀:调用utPLSQL.test或utPLSQL.testsuite时传递一个值给参数prefix_in(默认为“ut_”);调用utPackage.add添加一个包到测试套件时传递一个值给参数prefix_in(默认为“ut_”)。前缀存储在表ut_package中。

另一方面,测试包程序的名称不应该使用前缀。不需要用前缀区分测试程序与被测试程序,因为它们位于不同的包中。

使用单独的测试包测试独立的程序

如果将单元测试代码放入一个与被测试代码分离的包中(默认设置),测试包的名称必须采用以下格式:

<program>

其中,<prefix>是utPLSQL前缀,<program>是被测试的独立程序的名称。

可以采用以下方式之一指定前缀:调用utPLSQL.test或utPLSQL.testsuite时传递一个值给参数prefix_in(默认为“ut_”);调用utPackage.add添加一个包到测试套件时传递一个值给参数prefix_in(默认为“ut_”)。前缀存储在表ut_package中。

另一方面,测试包程序的名称也必须具有相同的前缀。这是为了避免被测试程序与对应的单元测试程序之间的命名冲突,如以下用于betwnstr函数的测试包:

CREATE OR REPLACE PACKAGE ut_betwnstr
IS
   PROCEDURE ut_setup;
   PROCEDURE ut_teardown;
   PROCEDURE ut_betwnstr;
END ut_betwnstr;
/

现在拥有了一个函数ut_betwnstr.ut_betwnstr,这看起来很奇怪。但是utPLSQL不需要在代码中使用这个名称,仅仅需要按照以下方式运行测试:

SQL> exec utPLSQL.test ('betwnstr')

单元测试程序与被测试代码位于同一个包内

2此时,所有的测试程序都必须使用utPLSQL前缀,如下所示:

CREATE OR REPLACE PACKAGE str
IS
   FUNCTION betwn (
      string_in IN VARCHAR2,
      start_in IN PLS_INTEGER,
      end_in IN PLS_INTEGER
   )
      RETURN VARCHAR2;
      
   PROCEDURE ut_setup;
   PROCEDURE ut_teardown;
   PROCEDURE ut_betwn;
      
END str;
/

可以采用以下方式之一指定前缀:调用utPLSQL.test或utPLSQL.testsuite时传递一个值给参数prefix_in(默认为“ut_”);调用utPackage.add添加一个包到测试套件时传递一个值给参数prefix_in(默认为“ut_”)。前缀存储在表ut_package中。

2

2

2

2

2

2

9

5

6

7

8

9

0

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

上一篇: 敏捷数据方法
下一篇: utPLSQL示例一
请登录后发表评论 登录
全部评论
《SQL编程思想》作者,专注于数据库领域知识的分享。

注册时间:2021-08-26

  • 博文量
    443
  • 访问量
    546900