Приложение модульного тестирования, включая базу данных, работает слишком медленно - PullRequest
3 голосов
/ 29 февраля 2012

Я провожу много юнит-тестов (в основном PHP / Mysql), но сценарии SQL, используемые для создания базы данных, слишком медленны для запуска, поэтому я трачу много времени. Я не могу всегда издеваться над базой данных (устаревший код, слишком сложный для обработки), так что я могу сделать? Копировать данные Mysql файлы напрямую? Загрузить мою БД по-другому?

Загрузка большого количества данных выполняется быстро, это только СОЗДАНИЕ ТАБЛИЦ, которые работают медленно.

Ответы [ 6 ]

2 голосов
/ 01 марта 2012

Читая другой вопрос, дайте мне ответ: просто перенесите мою тестовую базу данных в память. В Debian / Ubuntu (в моем случае) мне просто нужно переместить каталог моей тестовой базы данных в / dev / shm, создать ссылку для привязки старого каталога к новому, перезапустить сервер MySQL и tada !!

Набор, для запуска которого требуется 140 с, теперь работает за 10 с. Так очевидно, чтобы сделать! Этот проект много использует базу данных во время тестов. Другой, который запускается в 18-20 с базой данных на диске, не работает быстрее с базой данных в памяти, но у него больше модульных тестов, чем в другом проекте, и меньше таблиц для создания в интеграционном тестировании.

1 голос
/ 24 июля 2018

Вы можете использовать движок MySQL MEMORY .

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

Предполагая, что у вас есть скрипт для настройки вашей БД с нуля (например, который запускается при инициализации тестов), вы можете просто добавить / заменить определения движка с InnoDB на MEMORY.

Вы даже можете установить движок в качестве параметра для вашего набора тестов, чтобы вы могли запускать быструю версию MEMORY с каждым сохранением / фиксацией и более длинную, но более надежную версию с innoDB перед выпуском.

По сравнению с другими предложениями здесь:

  • Это кроссплатформенная (в отличие от перемещения БД в память посредством копирования, которая работает только для Linux)
  • Проще и быстрее, чем с помощьювиртуальный сервер а-ля Docker / VMWare
1 голос
/ 29 февраля 2012

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

  1. Начать транзакцию,
  2. Вставить данные, относящиеся к вашим тестам, в базу данных,
  3. Запустите свой тест
  4. Откат транзакции.

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

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

0 голосов
/ 29 февраля 2012

Еще один вариант - настроить базу данных в экземпляре VMWare ... затем просто сбросить ее при необходимости.

0 голосов
/ 29 февраля 2012

Я бы:

  1. Создать тестовую базу данных так, как я хочу
  2. Выполнить mysqldump базы данных с помощью --add-drop-table и --no-autocommitтак что есть только одна огромная транзакция
  3. импорт дампа, когда вы хотите сбросить базу данных
0 голосов
/ 29 февраля 2012

Я был в похожей ситуации.Я создал игрушечную базу данных только для тестирования.Эта БД имеет только несколько записей.

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