我想创建单元测试,涵盖在 Play 框架 2.1.0 中使用关系数据库的代码。这有很多可能性,并且都会导致问题:
在内存 H2 数据库上进行测试
Play 框架文档建议在 H2 内存数据库上运行单元测试,即使用于开发和生产的主数据库使用其他软件(即 MySQL):
app = Helpers.fakeApplication(Helpers.inMemoryDatabase());
我的应用程序不使用存储过程等复杂的 RDBMS 功能,并且大多数数据库访问案例都是 ebean 调用,因此它应该与 MySQL 和 H2 兼容。
但是,evolutions 中的表创建语句使用 MySQL 特定的功能,例如指定ENGINE = InnoDB
,DEFAULT CHARACTER SET = utf8
等。我担心如果我将删除这些专有部分CREATE TABLE
,MySQL 将使用一些我无法控制且取决于版本的默认设置,所以要测试和开发应用程序,必须修改主 MySQL 配置。
有人使用过这种方法(使进化与 MySQL 和 H2 兼容)吗?
如何处理它的其他想法:
- MySQL 和 H2 的单独演进(不是一个好主意)
- 使 H2 忽略其他 MySQL 内容的某种方法
create table
(MySQL 兼容模式不起作用,它仍然会抱怨default character set
)。我不知道怎么做。
在与主数据库相同的数据库驱动程序上进行测试
H2 内存数据库的唯一优势是速度快,并且在相同的数据库驱动程序上进行测试可能比开发/生产数据库更好,因为它更接近真实环境。
如何在 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,是否可以在没有太多痛苦和怪癖的情况下集成它?