Я хочу создать модульные тесты, которые охватывают код, который использует реляционную базу данных в Play Framework 2.1.0. Существует много возможностей для этой и всех проблем:
Тестирование встроенной базы данных H2
Документация по платформе приложений предлагает запустить модульные тесты в базе данных H2 в памяти, даже если основная база данных, используемая для разработки и производства, использует другое программное обеспечение (то есть MySQL):
app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
Мое приложение не использует сложные функции RDBMS, такие как хранимые процедуры, и большинство случаев доступа к базе данных - это вызовы ebean, поэтому они должны быть совместимы как с MySQL, так и с H2.
Однако в операторах создания таблиц в эволюциях используются специфичные для MySQL функции, такие как указание ENGINE = InnoDB
, DEFAULT CHARACTER SET = utf8
и т.д. Я боюсь, что если я удалю эти проприетарные части CREATE TABLE
, MySQL будет использовать некоторые настройки по умолчанию, которые Я не могу контролировать и зависит от версии, поэтому для тестирования и разработки приложения основная конфигурация MySQL должна быть изменена.
Кто-нибудь использовал этот подход (делая эволюции совместимыми с MySQL и H2)?
Другие идеи, как это можно обработать:
- Отдельные эволюции для MySQL и H2 (не очень хорошая идея)
- Какой-то способ заставить H2 игнорировать дополнительный материал MySQL в
CREATE TABLE
(режим совместимости MySQL не работает, он все еще жалуется даже наdefault character set
). Я не знаю, как.
Тестирование на том же драйвере базы данных, что и основная база данных
Единственное преимущество базы данных с внутренней памятью H2 в том, что она быстрая, и тестирование на том же драйвере базы данных, что и dev/production database, может быть лучше, потому что оно ближе к реальной среде.
Как это можно сделать прямо в платформе Play?
Пробовал:
Map<String, String> settings = new HashMap<String, String>();
settings.put("db.default.url", "jdbc:mysql://localhost/sometestdatabase");
settings.put("db.default.jndiName", "DefaultDS");
app = Helpers.fakeApplication(settings);
Похоже, что эволюция работает здесь, но как лучше всего очистить базу данных перед каждым тестом? Создавая собственный код, который обрезает каждую таблицу? Если это приведет к отбрасыванию таблиц, будут ли эволюции запускаться снова перед следующим тестом или они будут применены один раз за команду play test
? Или один раз за вызов Helpers.fakeApplication()
?
Каковы лучшие практики здесь? Слышал о dbunit, можно ли интегрировать его без особых проблем и причуд?