首页 > Linux操作系统 > Linux操作系统 > utPLSQL构建测试包
要使用utPLSQL,必须构建一个包含单元测试的测试包。测试包必须符合utPLSQL的API规则,以便utPLSQL能够自动运行测试。
每一个测试包都必须包含:
测试包、设置程序、清除程序以及单元测试程序都必须遵守utPLSQL的命名约定,参见下文。
utPLSQL.test与utPLSQL.testsuite在运行任何单元测试之前都会调用测试包的设置程序。该程序的包规范形式如下:
CREATE OR REPLACE PACKAGEIS PROCEDURE setup;
其中
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。
utPLSQL.test与utPLSQL.testsuite在运行完单元测试之后会调用测试包的清除程序。使用该程序删除测试使用的任何数据结构。通常,该程序的内容逻辑上与设置程序相反。该程序的包规范形式如下:
CREATE OR REPLACE PACKAGEIS PROCEDURE teardown;
其中
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;
单元测试程序的通用格式如下:
CREATE OR REPLACE PACKAGEIS PROCEDURE ;
其中
-- Test package for stand alone program CREATE OR REPLACE PACKAGE ut_IS PROCEDURE ut_setup; PROCEDURE ut_teardown; PROCEDURE ut_ ; END;
单元测试程序的包体需要根据测试测内容编写,基本的格式如下:
PROCEDUREIS 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;测试一个程序时,首先调用该程序,然后调用适当的断言程序测试它的输出。
查看示例了解编写单元测试程序的不同方式。
执行测试或者测试套件时,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/ ,如需转载,请注明出处,否则将追究法律责任。