Есть ли способ получить доступ к закрытым процедурам plsql для тестирования? - PullRequest
16 голосов
/ 20 июля 2011

Я работаю над проектом с большим количеством кода plsql и хотел бы добавить более конкретные юнит-тесты в нашу кодовую базу.Некоторые из процедур / функций, которые я хотел бы протестировать, не включены в спецификацию пакета, и у меня нет средств изменить это.

Есть ли способ получить доступ к этим «частным» процедурам plsql, не добавляя их в спецификацию?

Единственная идея, которая у меня была до сих пор, заключалась в том, чтобы скомпилировать специальную спецификацию пакета в БД перед тестированием, которая определяет тестируемые процедуры.Я догадываюсь, что это сработает, но мне интересно, если есть более простой способ, может быть, какой-то злой секретный оракул взломать; -)

Я тестирую из Java с JUnit / DBUnit.

BR Frank

Ответы [ 4 ]

23 голосов
/ 20 июля 2011

Есть способ сделать это, если вы на 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>

Мы можем сделать гораздо больше с условной компиляцией.Это покрыто в документах. Узнайте больше.

3 голосов
/ 20 июля 2011

Я был бы удивлен, если бы такая вещь существовала. Цель частных процедур, функций и переменных в том, что они не видны приложениям вне пакета.

2 голосов
/ 20 июля 2011

Как сказал @Robert, не должно быть доступа к чему-либо, что объявлено только в теле пакета вне этого пакета.Кроме того, создание «специальной» спецификации для запуска модульных тестов также может не сработать: если тело содержит предварительные объявления (операторы, подобные тем, что в спецификации, обычно находятся в начале тела), то «специальная» спецификациябудет конфликтовать с этими объявлениями, и пакет не будет скомпилирован.

0 голосов
/ 30 мая 2016

Вы можете использовать pl / sql developer для тестирования процедур pl / sql.

1) Перейти к пакетам -> процедуры / функции
2) Щелкните правой кнопкой мыши и выберите «тест»
3) Введите входные параметры, нажмите кнопку «Выполнить / запустить» и проверьте результаты.
4) вы можете работать с различными наборами данных и проверять целевые таблицы.
5) Запустить с неверными данными и проверить наличие ожидаемых ошибок.

Вы можете получить более подробную информацию на http://www.handyinsight.com/2016/06/database-testing.html

temruzinn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...