Ускорение LocalSessionFactoryBean dropDatabaseSchema, createDatabaseSchema - PullRequest
2 голосов
/ 16 декабря 2011

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

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

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

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

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

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

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

1 голос
/ 17 декабря 2011

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

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

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

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

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

...