我正在做一个有很多plsql代码的项目,我想在我们的代码库中添加更多具体的单元测试。我喜欢测试的一些过程/函数不在包规范中,我没有办法改变它。
有没有办法访问这些“私有”plsql过程而不将它们添加到规范中?
到目前为止,我唯一的想法是在测试之前为DB编译一个特殊的包规范,它指定了测试中的过程。我猜这会起作用,但我想知道是否有更简单的方法,也许是一些邪恶的秘密神谕黑客;-)
我在Java中使用JUnit/DBUnit进行测试。
BR Frank
发布于 2011-07-20 22:33:07
有一种方法可以做到这一点,前提是你使用的是10g或更高版本。它被称为条件编译。这是一个非常整洁的特性,它提供了特殊的语法,因此我们可以在编译时更改我们的PL/SQL代码。
碰巧的是,我一直在使用这个特性在规范中公开私有包,这样我就可以对它们运行UTPLSQL测试。
下面是特殊的语法:
create or replace package my_pkg
as
$IF $$dev_env_test $THEN
PROCEDURE private_proc;
$END
FUNCTION public_function return date;
end my_pkg;
/
带有双美元符号的变量是条件编译标志。
如果我描述这个包,我们只能看到public包:
SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE
SQL>
现在我设置了条件标志并重新编译了包,就像变魔术一样……
SQL> alter session set plsql_ccflags='dev_env_test:true'
2 /
Session altered.
SQL> alter package my_pkg compile
2 /
Package altered.
SQL> desc my_pkg
PROCEDURE PRIVATE_PROC
FUNCTION PUBLIC_FUNCTION RETURNS DATE
SQL>
函数的私营化就像您想象的那样简单:
SQL> alter session set plsql_ccflags='dev_env_test:false'
2 /
Session altered.
SQL> alter package my_pkg compile
2 /
Package altered.
SQL> desc my_pkg
FUNCTION PUBLIC_FUNCTION RETURNS DATE
SQL>
我们可以用条件编译做更多的事情。文件里都写了。Find out more.
发布于 2011-07-20 20:44:20
如果存在这样的东西,我会感到惊讶。私有过程、函数和变量的全部目的是使它们对包之外的应用程序不可见。
发布于 2011-07-20 21:04:02
正如@Robert所说,应该不可能访问任何仅在该包之外的包体中声明的内容。此外,创建一个用于运行单元测试的“特殊”规范也可能行不通:如果主体包含正向声明(类似于规范中的语句,通常可以在主体的开头找到),那么“特殊”规范将与这些声明冲突,包将无法编译。
https://stackoverflow.com/questions/6761782
复制相似问题