Как (модульно) протестировать приложение PL / SQL с интенсивным использованием данных - PullRequest
9 голосов
/ 19 апреля 2010

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

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

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

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

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

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

Буду рад любым предложениям или рекомендациям, которые помогут нам. Некоторые члены команды, как правило, устают, разбираясь в том, как даже начать, поскольку наш опыт модульного тестирования не охватывает устаревшие системы с интенсивным использованием данных PL / SQL (только те проекты Java с нуля "из книги") * 1013

Ответы [ 4 ]

8 голосов
/ 19 апреля 2010

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

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 . Создайте модульные тесты для битов, которые вы собираетесь изменить, прежде чем применить изменение, чтобы вы знали, что они все еще работают после того, как вы сделали изменение.

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

4 голосов
/ 20 апреля 2010

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

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 подходит для этой среды. Проверка кода со стороны знающих людей будет иметь больше шансов поймать проблемы.

Если у вас есть деньги, посмотрите регрессионное тестирование Oracle RAT (реальное тестирование приложений).

3 голосов
/ 19 апреля 2010

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

1 голос
/ 19 апреля 2010

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

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