有没有办法访问私有plsql程序进行测试?

时间:2011-07-20 12:19:57

标签: oracle unit-testing plsql junit

我正在开发一个包含大量plsql代码的项目,并希望为我们的代码库添加更多特定的单元测试。我想测试的一些程序/功能不在包规范中,我无法改变它。

有没有办法访问这些'私有'plsql程序而不将它们添加到规范?

我到目前为止唯一的想法是在测试之前将特殊包规范编译到DB,它指定了测试中的过程。我认为这样可行,但我想知道是否有更简单的方法,可能是一些邪恶的秘密oracle hack; - )

我正在使用JUnit / DBUnit从Java进行测试。

BR 弗兰克

4 个答案:

答案 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