我正在开发一个包含大量plsql代码的项目,并希望为我们的代码库添加更多特定的单元测试。我想测试的一些程序/功能不在包规范中,我无法改变它。
有没有办法访问这些'私有'plsql程序而不将它们添加到规范?
我到目前为止唯一的想法是在测试之前将特殊包规范编译到DB,它指定了测试中的过程。我认为这样可行,但我想知道是否有更简单的方法,可能是一些邪恶的秘密oracle hack; - )
我正在使用JUnit / DBUnit从Java进行测试。
BR 弗兰克
答案 0 :(得分:23)
有一种方法可以做到这一点,只要你在10克或更高。它被称为条件编译。这是一个非常巧妙的功能,它提供了特殊的语法,因此我们可以在编译时更改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>
我们可以通过条件编译做更多事情。它包含在文档中。 Find out more.
答案 1 :(得分:3)
答案 2 :(得分:2)
正如@Robert所说,不应该访问仅在该包外部的包体中声明的任何内容。此外,为运行单元测试而创建“特殊”规范可能也不起作用:如果正文包含前向声明(规范中的那些语句,通常在正文的开头找到),那么“特殊”规范将与这些声明冲突,并且包不会编译。
答案 3 :(得分:-1)
您可以使用pl / sql developer来测试pl / sql过程。
1)转到套餐 - >程序/功能
2)右键单击并选择“测试”
3)输入输入参数并单击执行/运行按钮并验证结果
4)您可以运行各种数据集并检查目标表
5)使用无效数据运行并检查预期的错误。
你可以在这里获得更多细节 http://www.handyinsight.com/2016/06/database-testing.html
temruzinn