Как к (единица-) данные тестирования интенсивное МН приложение / приложение SQL

Наша команда желает к модульному тесту новый код, написанный в соответствии с под управлением проектом, расширяющим существующую огромную систему Oracle.

Система записана только в МН / SQL, состоит из тысяч таблиц, сотен пакетов хранимых процедур, главным образом получая данные из таблиц и/или вставляя/обновляя другие данные.

Наше расширение не является исключением. Большинство функций возвращает данные из довольно сложного ВЫБОРА statementa по многим взаимно связанным таблицам (с небольшой добавленной логикой прежде, чем возвратить их) или делает преобразование от одной сложной структуры данных до другого (сложным в другом отношении).

Что лучший подход является к модульному тесту таким кодом?

Нет никаких модульных тестов на существующую кодовую базу. Ко всем неприятностям только пакеты, триггеры и представления управляются источником, структуры таблиц (включая "изменяют таблицу" материал, и необходимые преобразования данных развертываются по каналу кроме управления версиями). Нет никакого способа изменить это в объеме нашего проекта.

Поддержание набора данных тестирования, кажется, невозможно, так как существует новый код, развернутый на продуктивной среде на еженедельной основе, обычно без предварительного уведомления, часто изменяя структуру данных (добавьте столбец здесь, удалите тот туда).

Я был бы рад за любое предложение или ссылку помочь нам. Некоторые члены команды склонны устать путем выяснения, как даже запустить для нашего опыта с поблочным тестированием, не покрывает МН / SQL информационно емкие унаследованные системы (только они "от книги" greenfield проекты Java).

9
задан Karel Smutný 19 April 2010 в 14:19
поделиться

4 ответа

Существует несколько различных инструментов для тестирования PL / SQL. Стивен Фейерштейн написал два из них, utplsql и Quest Code Tester для Oracle (ранее QUTE). Я большой поклонник utplsql, но у него больше нет активного сообщества поддержки (что очень жаль). Это также имеет тенденцию быть довольно многословным, особенно когда дело доходит до настройки тестовых приборов. Он действительно имеет кардинальную виртуальную ценность чистых пакетов PL / SQL ; исходный код немного корявый, но это СОПРОТИВЛЕНИЕ.

QCTO поставляется с графическим интерфейсом пользователя, что означает, как и другие продукты Quest, например, TOAD, только для Windows. Он не совсем автоматизирует создание тестовых данных, но предоставляет интерфейс для его поддержки. Как и другие продукты Quest, QCTO лицензируется, хотя есть бесплатная копия.

Стивен (раскрытие, он один из моих героев Oracle) написал сравнение функций всех инструментов тестирования PL / SQL. Очевидно, что QOTC выходит на первое место, но я думаю, что сравнение честное. Проверьте это.

Совет по тестовым приборам в utplsql

Управление тестовыми данными для модульного тестирования может быть настоящей головной болью. К сожалению, utplsql не предлагает много возможностей для облегчения бремени. Итак

  • Всегда проверяйте известных значений :
    • Избегайте использования dbms_random;
    • Постарайтесь ограничить использование последовательностей столбцами, значения которых не материя;
    • С датами тоже сложно. Избегайте жесткого кодирования дат: используйте переменные, в которые подставляется sysdate. Научитесь ценить add_months () , last_day () , interval , trunc (sysdate, 'MM') и т. Д.
  • Изолируйте тестовые данные от других пользователей. Постройте его с нуля. По возможности используйте отличительные ценности.
  • Создайте столько тестовых данных, сколько вам нужно. Объемное тестирование - это другая ответственность.
  • При тестировании процедур, которые изменяют данные, создаются определенные записи для каждого модульного теста.
  • Также: не полагайтесь на успешный результат одного теста, чтобы предоставить данные другого теста.
  • При тестировании процедур, которые просто сравнивают данные с записями об обмене данными между модульными тестами, когда это необходимо.
  • По возможности делитесь структурными данными (например, указанными первичными ключами).
  • Используйте поля произвольного текста (имена, описания, комментарии), чтобы определить, какой тест или тесты используют запись.
  • Минимизируйте работу, связанную с созданием новых записей:
    • Назначайте только те значения, которые необходимы для набора тестов и ограничений таблицы;
    • Используйте значения по умолчанию, насколько это возможно ;
    • Сделайте как можно больше процедур.

Другие вещи, о которых следует помнить:

  • настройка тестового устройства может занять много времени. Если у вас много данных, подумайте о создании процедуры для настройки статических данных, которые можно запускать один раз за сеанс, и включать только изменчивые данные в сам ut_setup . Это особенно полезно при тестировании функции только для чтения.
  • помните, что создание тестовых данных - это самостоятельное упражнение в программировании, поэтому оно подвержено ошибкам.
  • использовать все возможности utplsql. 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 . Создавайте модульные тесты для битов, которые вы собираетесь изменить, прежде чем применять изменение, чтобы вы знали, что они по-прежнему работают после того, как вы внесете изменение.

В этой области много думают, но (неизбежно, если это позорно), это в основном исходит от программистов объектно-ориентированного программирования. Майкл Фезерс - главный герой. Прочтите его статью Эффективная работа с устаревшим кодом . Если вы сочтете это полезным, он впоследствии написал книгу с таким же названием.

8
ответ дан 4 December 2019 в 13:00
поделиться

Я использовал DbFit для модульного тестирования кода PL / SQL. Попробуйте.

3
ответ дан 4 December 2019 в 13:00
поделиться

utPLSQL может помочь, но похоже, что вам нужен лучший способ поддержки тестовых данных. Вы можете также посмотреть Swingbench для этого.

1
ответ дан 4 December 2019 в 13:00
поделиться

Возьмем следующий сценарий

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 для регрессионного тестирования.

4
ответ дан 4 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: