我想创建单元测试,覆盖在Play框架2.1.0中使用关系型数据库的代码。有许多可能性可供选择,但都会导致问题:
在内存中测试H2数据库
Play框架文档建议在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忽略
create table
中的其他MySQL内容(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,是否可能在没有太多痛苦和问题的情况下集成它?