我正在开发一个包含大量 plsql 代码的项目,并希望向我们的代码库添加更具体的单元测试。我喜欢测试的一些过程/函数不在包规范中,我无法更改它。
有没有办法访问这些“私有”plsql 过程而不将它们添加到规范中?
到目前为止,我唯一的想法是在测试之前将一个特殊的包规范编译到数据库,该规范指定了被测试的过程。我想这会起作用,但我想知道是否有更简单的方法,也许是一些邪恶的秘密预言机黑客;-)
我正在使用 JUnit/DBUnit 从 Java 进行测试。
BR
Frank
有一种方法可以做到这一点,前提是您使用的是 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;
/
带有双美元符号的变量是条件编译标志。
如果我描述包,我们只能看到公共包:
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>
我们可以通过条件编译做更多的事情。它包含在文档中。了解更多。 http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/fundamentals.htm#BABIHIHF
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)