Подтвердить что ты не робот

Есть ли способ доступа к частным процедурам plsql для целей тестирования?

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

Есть ли способ получить доступ к этим 'private' процедурам plsql без добавления их в спецификацию?

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

Я тестирую Java с помощью JUnit/DBUnit.

BR Франк

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

temruzinn