Ускорение LocalSessionFactoryBean dropDatabaseSchema, createDatabaseSchema


Мне интересно, как я могу ускорить свои модульные тесты. Я использую JUnit, и перед каждым тестом я отбрасываю схему базы данных,а затем воссоздаю ее. Поскольку моя схема несколько велика, это может занять довольно много времени, учитывая, что у меня есть более 1000 тестов.

Чтобы дать вам представление о моей установке: Весна 3 hibernate3.LocalSessionFactoryBean, который использует диалект HSQL. Я использую программу Junit's Suite runner для запуска списка классов.

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

Я относительно новичок в Spring, и все это магия, но мне просто интересно, есть ли у кого-нибудь идеи относительно StackOverflow или какие-либо другие идеи в ускорении тестирования?

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

Заранее благодарю.

2 2

2 ответа:

HSQLDB 2.2.6 поддерживает оператор для очистки данных в схеме базы данных.

   TRUNCATE SCHEMA PUBLIC AND COMMIT

Смотрите руководство ЗДЕСЬ:

Http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement

Версия 2.2.7 и более поздние версии поддерживают TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT

Если требуется время для создания схемы, воспользуйтесь предложением фредта.

Если создание данных требует времени (а не схемы), то я бы пошел на ваше последнее предложение, чтобы создать "стандартную" базу данных, которая используется для всех ваших тестов, по крайней мере, в качестве базы. Именно этим я и занимаюсь в некоторых своих проектах.

У меня есть база данных.файл скрипта где-то в моем исходном дереве. В моей тестовой установке @Before я копирую файл во временный каталог. Моя весна конфигурация указывает на эту копию. Копия позволяет избежать изменения стандартной базы данных. Затем в @After я делаю shutdown и удаляю файл [*]. Использование @Before и @After - это боль, если у вас везде один и тот же код, поэтому посмотрите на ExternalResource, который является Теструлом, который позволяет реализовать логику до/после, но в хорошем, факторизованном виде.

Если я использую maven, целью для копии обычно является target / temp / something. Таким образом, все копии будут удалены с помощью mvn clean.

[*] это хорошо работает под linux, но под windows файлы иногда не удаляются, поэтому я либо перемещаю файл на временное имя, либо использую один файл на тест. Вы можете получить имя, используя правилоTestName .