Как создать модульные тесты для базы данных не в памяти, такой как MySQL в платформе Play, с возвратом в известное состояние?

Я хочу создать модульные тесты, которые охватывают код, который использует реляционную базу данных в Play Framework 2.1.0. Есть много возможностей для этого, и все они вызывают проблемы:

Тестирование в базе данных H2 в памяти

В документации Play Framework предлагается выполнить модульные тесты для базы данных H2 в памяти, даже если основная база данных, используемая для разработки и производства, использует другое программное обеспечение (например, MySQL):

app = Helpers.fakeApplication(Helpers.inMemoryDatabase());

Мое приложение неИспользование сложных функций СУБД, таких как хранимые процедуры, и большинство случаев доступа к базе данных являются вызовами ebean, поэтому оно должно быть совместимо как с MySQL, так и с H2.

Однако операторы создания таблиц в эволюции используют специфичные для MySQL функции, такие как указание,ENGINE = InnoDBDEFAULT CHARACTER SET = utf8и т. д. Я боюсь, что удаляю эти проприетарные частиCREATE TABLE, MySQL будет использовать некоторые настройки по умолчанию, которые я могуЭто зависит от версии, поэтому для тестирования и разработки приложения необходимо изменить основной конфигурационный файл MySQL.

Кто-нибудь использовал этот подход (делая эволюции совместимыми как с MySQL, так и с H2)?

Другие идеи, как это можно сделать:

Отдельные эволюции для MySQL и H2 (не очень хорошая идея)Некоторый способ заставить H2 игнорировать дополнительные вещи MySQL вcreate table (Режим совместимости MySQL нене работает, он все еще жалуется наdefault character set). Я нене знаю как.Тестирование на том же драйвере базы данных, что и основная база данных

Единственное преимущество базы данных H2 в памяти - это то, что она быстра и тестирование на том же драйвере базы данных, что и на базе данных dev / production, может быть лучше, поскольку она ближе к реальной среде.

Как это можно сделать прямо в фреймворке Play?

Пытался:

Map settings = new HashMap();
settings.put("db.default.url", "jdbc:mysql://localhost/sometestdatabase");
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);

Похоже, эволюции работают здесь, но как этолучше очищать базу данных перед каждым тестом? Создавая собственный код, который усекает каждую таблицу? Если он удалит таблицы, то эволюция будет запущена снова перед следующим тестом, или они будут применены один раз заplay test команда? Или один раз заHelpers.fakeApplication() вызов?

Каковы лучшие практики здесь? Слышал оDbUnitМожно ли интегрировать его без особых усилий и излишеств?

Ответы на вопрос(5)

Ваш ответ на вопрос