Наша команда желает к модульному тесту новый код, написанный в соответствии с под управлением проектом, расширяющим существующую огромную систему Oracle.
Система записана только в МН / SQL, состоит из тысяч таблиц, сотен пакетов хранимых процедур, главным образом получая данные из таблиц и/или вставляя/обновляя другие данные.
Наше расширение не является исключением. Большинство функций возвращает данные из довольно сложного ВЫБОРА statementa по многим взаимно связанным таблицам (с небольшой добавленной логикой прежде, чем возвратить их) или делает преобразование от одной сложной структуры данных до другого (сложным в другом отношении).
Что лучший подход является к модульному тесту таким кодом?
Нет никаких модульных тестов на существующую кодовую базу. Ко всем неприятностям только пакеты, триггеры и представления управляются источником, структуры таблиц (включая "изменяют таблицу" материал, и необходимые преобразования данных развертываются по каналу кроме управления версиями). Нет никакого способа изменить это в объеме нашего проекта.
Поддержание набора данных тестирования, кажется, невозможно, так как существует новый код, развернутый на продуктивной среде на еженедельной основе, обычно без предварительного уведомления, часто изменяя структуру данных (добавьте столбец здесь, удалите тот туда).
Я был бы рад за любое предложение или ссылку помочь нам. Некоторые члены команды склонны устать путем выяснения, как даже запустить для нашего опыта с поблочным тестированием, не покрывает МН / SQL информационно емкие унаследованные системы (только они "от книги" greenfield проекты Java).
Существует несколько различных инструментов для тестирования PL / SQL. Стивен Фейерштейн написал два из них, utplsql и Quest Code Tester для Oracle (ранее QUTE). Я большой поклонник utplsql, но у него больше нет активного сообщества поддержки (что очень жаль). Это также имеет тенденцию быть довольно многословным, особенно когда дело доходит до настройки тестовых приборов. Он действительно имеет кардинальную виртуальную ценность чистых пакетов PL / SQL ; исходный код немного корявый, но это СОПРОТИВЛЕНИЕ.
QCTO поставляется с графическим интерфейсом пользователя, что означает, как и другие продукты Quest, например, TOAD, только для Windows. Он не совсем автоматизирует создание тестовых данных, но предоставляет интерфейс для его поддержки. Как и другие продукты Quest, QCTO лицензируется, хотя есть бесплатная копия.
Стивен (раскрытие, он один из моих героев Oracle) написал сравнение функций всех инструментов тестирования PL / SQL. Очевидно, что QOTC выходит на первое место, но я думаю, что сравнение честное. Проверьте это.
Совет по тестовым приборам в utplsql
Управление тестовыми данными для модульного тестирования может быть настоящей головной болью. К сожалению, utplsql не предлагает много возможностей для облегчения бремени. Итак
add_months ()
, last_day ()
, interval
, trunc (sysdate, 'MM')
и т. Д.Другие вещи, о которых следует помнить:
ut_setup
. Это особенно полезно при тестировании функции только для чтения. utAssert.EqQuery
, utAssert.EqQueryValue
, utAssert.EqTable
, utAssert.EqTabCount
и utAssert.Eq_RefC_Query
- все очень полезные функции, когда дело доходит до вывода значений изменчивых данных. ut_teardown
и очистить тестовые данные в начале ut_setup
. Работа с устаревшим кодом
Комментирование сообщения Гэри напомнило мне еще одну вещь, которая может оказаться вам полезной. Стивен Ф. написал ulplsql как PL / SQL-реализацию JUnit, авангарда Java в движении Test First. Однако методы TDD могут также применяться к большим объемам унаследованного кода (в этом контексте унаследованный код - это любой набор программ без каких-либо модульных тестов).
Главное, что нужно иметь в виду, это то, что вам не нужно сразу все подвергать модульному тестированию. Начинайте постепенно. Создавайте модульные тесты для новых вещей, Test First . Создавайте модульные тесты для битов, которые вы собираетесь изменить, прежде чем применять изменение, чтобы вы знали, что они по-прежнему работают после того, как вы внесете изменение.
В этой области много думают, но (неизбежно, если это позорно), это в основном исходит от программистов объектно-ориентированного программирования. Майкл Фезерс - главный герой. Прочтите его статью Эффективная работа с устаревшим кодом . Если вы сочтете это полезным, он впоследствии написал книгу с таким же названием.
Я использовал DbFit для модульного тестирования кода PL / SQL. Попробуйте.
utPLSQL может помочь, но похоже, что вам нужен лучший способ поддержки тестовых данных. Вы можете также посмотреть Swingbench для этого.
Возьмем следующий сценарий
FUNCTION ret_count (local_client_id IN number) RETURN NUMBER IS
v_ret number;
BEGIN
SELECT count(*) INTO v_ret FROM table_1 WHERE client_id = local_client_id;
RETURN v_ret;
END;
Очень простая функция, но есть целый беспорядок, который может пойти не так. Преобразование типов данных, индексирование и статистика могут повлиять на пути запросов, производительность и, в некоторых случаях, на ошибки. Также существует множество слабых связей, таких как настройки сеанса (например, языковые предпочтения). Если кто-то пришел и добавил столбец «LOCAL_CLIENT_ID» в table_1, вся логика функции изменится.
Я лично не считаю, что TDD подходит для этой среды. Проверки кода знающими людьми имеют больше шансов выявить проблемы.
Если у вас есть деньги, посмотрите на RAT (тестирование реальных приложений) Oracle для регрессионного тестирования.