Полное преобразование схемы БД — как тестировать переписанные запросы?

Наша база данных плохо спроектирована со всех сторон (мы унаследовали ее). Я переработал схему во что-то полезное и поддерживаемое. Довольно много таблиц и столбцов было удалено, многие столбцы перемещены, а большинство таблиц и столбцов переименованы. Некоторые типы данных также были изменены.

Я извлек все запросы из наших веб-приложений, и мы начали их переписывать. Мы думаем, что наш администратор базы данных может перенести старые данные в новую схему. Чтобы быть уверенным, нам нужно протестировать каждый запрос, сравнив старые результаты с новыми.

Как мы можем протестировать такую ​​оптовую миграцию? Мне нужно иметь возможность указывать параметры и сопоставлять старые таблицы/столбцы с новыми таблицами/столбцами. С сотнями запросов это сложная задача. Я мог бы написать что-нибудь сам, но у меня уже много времени, поэтому предпочтительнее использовать существующий инструмент.

Спасибо!


person Paul    schedule 21.07.2011    source источник


Ответы (3)


Мне пришлось это сделать... и это было легко, потому что я переписал все приложение;)

Многие запросы звучат так, как будто базовые операции, такие как выбор, вставка, обновление, не были абстрагированы в функциях — возможно, это поможет навести порядок перед адаптацией.

Теперь о тестировании:

Вам нужен тестовый скрипт, который будет а) запускать все ваши запросы б) сохранять вывод всех выборок для сравнения

  1. сделайте резервную копию вашего тестового db @ state 0, очистите общий журнал запросов

  2. поэкспериментируйте со своим приложением, используя все операции удаления, выбора и обновления,

  3. скопируйте и вставьте этот журнал, возьмите каждый отдельный выбор и предварите его «Создать таблицу temptable_xyz» (или, конечно, SELECT в temptable_xyz .. зависит от доступного синтаксиса)

  4. запустить в обеих базах данных, проверить db @ состояние 0 и проверить db @ состояние 0 после сценария миграции

  5. сравнивать

Это должно сработать, если вы можете убедиться, что используете все функции в каждом приложении.

GL - ничто не сравнится с улучшением существующих вещей ;)

person Morg.    schedule 22.09.2011
comment
По сути, это то, что я в итоге сделал. Я написал приложение для тестирования до и после запросов и для сравнения результатов. Запросы, сопоставление старого с новым и утверждения указываются в XML. - person Paul; 22.09.2011

Иногда простые решения помогают.

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

cd newqueries
for queryfile in *; do
    psql -f $queryfile migrateddb > /tmp/newresult
    psql -f ../oldqueries/$queryfile olddb > /tmp/oldresult

    if ! diff /tmp/oldresult /tmp/newresult; then
        echo "Difference in $queryfile"
        exit 1
    fi
done

Или вы можете написать сравнение результатов на основе модульного теста.

person jkj    schedule 21.07.2011
comment
К сожалению, у нас также есть вставки, обновления и удаления. - person Paul; 21.07.2011
comment
В прошлый раз я просто изменил базу данных и вручную прошел все запросы. Поиск и замена помогли. Я попытался протестировать приложение, но некоторые ошибки миграции были обнаружены позже. - person jkj; 21.07.2011
comment
jkj, это может быть будущее и для нас, каким бы удручающим оно ни было. У нас есть тестер, но он некомпетентен и через несколько месяцев уйдет на пенсию, так что теперь это действительно ложится на плечи разработчиков. Спасибо. Кстати, я пытался упомянуть вас в комментарии, но он постоянно отфильтровывался — должно быть, ваше имя слишком короткое? - person Paul; 21.07.2011
comment
Я узнал, почему ваше имя было удалено... это намеренно: случилось с моим приветствием">meta.stackexchange.com/questions/97098/ По крайней мере, я сегодня кое-чему научился! - person Paul; 21.07.2011
comment
Ага. Извините, что не смог вам помочь. Надеюсь, кто-то еще придумает подходящие инструменты. Кстати, могу я спросить, на каком языке веб-приложение? - person jkj; 21.07.2011
comment
Java с Tomcat вместо Oracle. - person Paul; 21.07.2011
comment
Просто используйте php + mysql, и вы можете забыть обо всех этих внешних ключах, транзакциях, целостности данных и чепухе личного здравомыслия;) - person jkj; 21.07.2011

Это был бы мой подход:

  1. Восстановите тестовую базу данных с данными, запустите все известные запросы.
  2. Восстановите другую тестовую базу данных, запустите все новые запросы.
  3. Создайте сценарий sql, который объединяет каждую таблицу базы данных и сравнивает результаты. Это можно сделать с помощью information_schema или других системных таблиц (в зависимости от поставщика).

    вставить во временную таблицу select (выбрать count(1) из db1..name) , (выбрать count(1) из db2..name) , (Select count(1) из db1.name t1 присоединиться к db2.name t2 на t1. col1 = t2.col1 и t1.colx = t2.colx) , имя_таблицы

Затем вы можете выполнить запросы, содержащие имя таблицы в запросе. Это даст вам отправную точку, где искать.

person user498023    schedule 01.08.2011