Я хочу создать модульные тесты, которые охватывают код, который использует реляционную базу данных в 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, можно ли интегрировать его без особых проблем и причуд?