восстановление базы данных до определенного состояния для тестирования - PullRequest
2 голосов
/ 18 февраля 2011

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

Как видите, это процесс, требующий времени. Приложение использует более 100 таблиц. Мы думаем о написании пользовательских SQL для удаления ненужных данных из каждой таблицы. Есть ли лучший способ сохранить и восстановить состояние базы данных?

(Похоже, DBUnit может это сделать, я еще не пробовал.)

Один тест включает в себя:

  • создать схему базы данных.
  • Запустить сервер приложений.
  • Запуск нескольких клиентских приложений.
  • Выполнить и проверить.

У нас 5000 нечетных тестов, около 700 часов. (мы делаем это в сеточной среде, заканчиваем всю ночь)

В большинстве тестов используются небольшие объемы данных, скажем, до 10 МБ.

Ответы [ 6 ]

4 голосов
/ 18 февраля 2011

Какая версия Oracle (корпоративная 10g + или стандартная)?Предполагая, что вы используете Enterprise, вы можете использовать базу данных Flashback.Вы строите свою базовую базу данных.Тогда

create a guaranteed restore point
run your test
capture results somewhere outside the database
flashback database to restore point
start over

Этого должно быть достаточно, чтобы вы начали.Если вам нужны дополнительные детали, дайте мне знать.

4 голосов
/ 18 февраля 2011

Oracle Flashback позволяет вам восстановить таблицу в определенный момент времени, используя простой SQL-запрос.Документация доступна здесь .

Я не знаю, есть ли у Postgre похожая функция.

2 голосов
/ 07 апреля 2015

Для Oracle вы можете использовать этот пакет pl / sql: snapshot.sql

У нас есть 500 таблиц, 30 из которых восстанавливаются после каждого теста, и это занимает ~ 500 мссредний.

Использование чрезвычайно просто:

EXECUTE SNAPSHOT.TAKE_SNAPSHOT('snapshot name');
EXECUTE SNAPSHOT.RESTORE_SCHEMA('snapshot name');
2 голосов
/ 18 февраля 2011

Я думаю, что для PostgreSQL использование базы данных шаблонов быстрее, чем пересоздание всех таблиц по отдельности.

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

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

DROP DATABASE my_test_db;
CREATE DATABASE my_test_db WITH TEMPLATE my_template_db;

В 9.0 были некоторые оптимизации, которые ускорили бы это. Так что, возможно, такой подход быстрее, чем пересоздание всех таблиц с помощью SQL.

1 голос
/ 18 февраля 2011

Вопросы

  • О какой базе данных мы говорим?
  • Это размер Multi-T или всего несколько G?
  • Сколько данныхв нем?
  • Как определяются ограничения?
  • Как быстро это должно быть сделано?
  • Сколько времени занимают ваши тесты?(несколько дней или несколько недель)
  • Какой объем памяти доступен?
  • Сколько обновлений сделано во время теста?
  • Какая версия базы данных у вас есть?

Предложения

  • Если у вас достаточно места для хранения и не очень много обновлений, попробуйте флэш-базу данных.
  • Если вы тестируете копии базы данных prod, используйте клонирование (и, конечно, маскирование данных) (также хороший тест для резервного копирования Prod).
  • Если у вас есть хорошая тестовая база данных с ценными тестовыми данными, используйте резервное копирование / восстановление.
  • Если у вас есть база данных версии 11g, сконфигурированная с физической резервной базой данных, вы можете попробовать протестировать базу данных моментальных снимков.
1 голос
/ 18 февраля 2011

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

...