Как добиться тестовой изоляции тестирования Oracle PL / SQL? - PullRequest
20 голосов
/ 11 июня 2011

В проектах Java тесты JUnit выполняют настройку, тестирование, демонтаж.Даже при создании реального БД с использованием БД в памяти вы обычно откатываете транзакцию или удаляете БД из памяти и воссоздаете ее между каждым тестом.Это обеспечивает изоляцию теста, поскольку один тест не оставляет артефактов в среде, которая может повлиять на следующий тест.Каждый тест начинается в известном состоянии и не может перейти в другой.

Теперь у меня есть сборка Oracle db, которая создает 1100 таблиц и 400 КБ кода - много пакетов pl / sql.Я хотел бы не только проверить установку БД (полное - создание с нуля, частичное обновление с предыдущего БД и т. Д.) И убедиться, что все таблицы и другие объекты находятся в том состоянии, которое я ожидаю после установки, но также ТАКЖЕзапускать тесты на pl / sql (я не уверен, как бы я поступил первым - предложения?).

Я бы хотел, чтобы все это запускалось из Jenkins для CI, чтобы ошибки разработки определялись с помощью регрессионного тестирования.

Во-первых, я должен использовать корпоративную версию вместо XE, потому что XE не поддерживает java SP и зависимость от Oracle Web Flow.Даже если я устраню эти зависимости, сборка обычно загружается за 1,5 часа (полная сборка).

Так как же добиться изоляции тестов в этой среде?Использовать транзакции для каждого теста и откатывать их?Хорошо, а как насчет тех процедур pl / sql, которые содержат коммиты?

Я думал о резервном копировании и восстановлении, чтобы сбросить базу данных после каждого теста или воссоздать всю базу данных между тестами (слишком радикально).И то, и другое непрактично, так как установка занимает более часа.Делать это для каждого теста излишне и безумно.

Есть ли способ нарисовать линию на песке в схемах БД, а затем откатить ее обратно к этому моменту времени?Сорта, как большая функция «отменить».Что-то кроме expdp / impdp или rman.Возможно, весь подход отключен.Предложения?Как другие сделали это?

Для CI или небольшого окна обновления производства, пакет тестирования whold должен работать в разумные сроки (30 минут было бы идеально).

Существуют ли продукты, которые могут помочь достичь этой способности отмены?

Ответы [ 4 ]

11 голосов
/ 11 июня 2011

Кевин Маккормак (Kevin McCormack) опубликовал в блоге The Server Labs статью о непрерывном тестировании интеграции для PL / SQL с использованием Maven и Hudson. Проверьте это .Ключевым компонентом для компонента тестирования является среда Стивена Фейерштейна utPlsql , которая представляет собой реализацию концепций JUnit в PL / SQL.

Необходимость сброса наших тестовых приспособлений является одной из самых больших проблемс тестированием PL / SQL.Одна вещь, которая помогает, это соблюдать передовой опыт и избегать коммитов в хранимых процедурах: транзакционный контроль должен быть ограничен только самыми внешними частями стека вызовов.Для тех программ, которые просто должны выдавать коммиты (возможно, неявно, потому что они выполняют DDL), всегда есть тестовое приспособление, которое выдает операторы DELETE.Обработка реляционной целостности делает их довольно сложными для кода.

Альтернативным подходом является использование Data Pump.Похоже, вы отбрасываете impdp, но Oracle также предоставляет для него PL / SQL API, DBMS_DATAPUMP .Я предлагаю это здесь, потому что он предоставляет возможность удалить любые существующие данные перед запуском импорта.Таким образом, мы можем иметь экспортированный набор данных в качестве нашего тестового устройства;Чтобы выполнить SetUp, нужно запустить задание Data Pump.Вам не нужно ничего делать в TearDown, потому что это происходит в начале SetUp.

9 голосов
/ 11 июня 2011

В Oracle вы можете использовать технологию Flashback, чтобы восстановить подачу к моменту времени.

http://download.oracle.com/docs/cd/B28359_01/backup.111/b28270/rcmflash.htm

3 голосов
/ 14 июня 2011

1,5 часа - это очень много для 1100 таблиц и 400 КБ кода. Я, очевидно, не знаю деталей вашего заключения, но, основываясь на моем опыте, держу пари, вы можете сократить это до 5-10 минут. Вот две основные проблемы скрипта установки, которые я видел в Oracle:

1. Операции разбиты на мелкие кусочки

Чем больше у вас шагов, тем больше накладных расходов. Например, вы хотите максимально консолидировать такой код:

Заменить:

create table x(a number, b number, c number);
alter table x modify a not null;
alter table x modify b not null;
alter table x modify c not null;

С:

create table x(a number not null, b number not null, c number not null);

Заменить:

insert into x values (1,2,3);
insert into x values (4,5,6);
insert into x values (7,8,9);

С:

insert into x
select 1,2,3 from dual union all
select 4,5,6 from dual union all
select 7,8,9 from dual;

Это особенно верно, если вы запускаете свой скрипт и базу данных в разных местах. Это крошечное сетевое отставание начинает иметь значение, когда вы умножаете его на 10000. Каждый инструмент Oracle SQL, о котором я знаю, будет отправлять по одной команде за раз.

2. Разработчики должны совместно использовать базу данных

Это скорее решение для долгосрочного процесса, чем техническое исправление, но вы должны начать когда-нибудь. В большинстве мест, где используется Oracle, он установлен только на нескольких серверах. Тогда это становится дефицитным ресурсом, которым нужно тщательно управлять. Люди борются за это, роли неясны, и вещи не исправляются.

Если это ваша среда, остановите безумие и установите Oracle на каждый ноутбук прямо сейчас. Потратьте несколько сотен долларов и дайте каждому личное издание (которое имеет те же функции, что и Enterprise Edition). Дайте всем инструменты, в которых они нуждаются, и постоянное усовершенствование в конечном итоге решит ваши проблемы.


Кроме того, для схемы "отменить" вы можете изучить переносимые табличные пространства. Я никогда не использовал его, но, предположительно, это гораздо более быстрый способ установки системы - просто скопируйте и вставьте файлы вместо импорта. Похоже, что может помочь какой-то тип виртуализации - создать снимок ОС и базы данных.

0 голосов
/ 09 февраля 2013

Хотя Oracle Flashback является функцией Enterprise Edition, технология, на которой она основана, доступна во всех выпусках, а именно Oracle Log Miner:

http://docs.oracle.com/cd/B28359_01/server.111/b28319/logminer.htm#i1016535

Мне было бы интересно узнать, использовал ли это кто-нибудь для обеспечения изоляции теста для функциональных тестов, т. Е. Запрашивая v $ LOGMNR_CONTENTS, чтобы получить список операторов UNDO с момента времени, соответствующего началу теста.

База данных должна находиться в режиме архива, а в тестовом случае junit - метод, помеченный

@Startup 

вызовет DBMS_LOGMNR.START_LOGMNR. Тест будет выполняться, а затем в методе, помеченном

@Teardown

будет запросом v $ LOGMNR_CONTENTS, чтобы найти список операторов UNDO. Затем они будут выполнены через JDBC. Фактически, запрос и выполнение операторов UNDO могут быть извлечены в хранимую процедуру PLSQL. Порядок выполнения утверждений должен быть рассмотрен.

Я думаю, что это дает преимущество, позволяющее транзакции совершать транзакции, когда очень много ошибок может появиться, т. Е. Ссылочная целостность, нарушения первичного ключа и т. Д.

...