起因
Grails 的 HibernateSpec 单元测试技术可以让我们对 service 做很好的单元测试,而且是读写test数据库的方式进行真实的数据库测试。
但因为是读写真实的test数据库,所以当 Domain class (表)多了以后,启动一次单元测试要花1、2分钟,对于需要快速得到结果是非常不友好的。
原因
之所以 HibernateSpec 的启动这么慢是因为作者 Graeme Rocher 是这样设计测试流程的。
1、用 create-drop 方式创建 hiberante data source,于是在启动时会创建表,在停止时会删除表
2、执行测试方法
3、删除所有的表
慢的原因又具体是在创建表结构时,会一条条地创建“外键约束”,非常的慢。
解决方案
通过查看 HiberanteSpec 代码,发现只要改写方法 getConfiguration() 提供我们需要的数据库创建方法就可以了。
在测试类中,重载 getConfiguration() 方法,返回 “update” 类型,而非 “create-drop” 类型,这样就可以避免反复创建表,从而节约时间。
@Override
Map getConfiguration() {
return Collections.singletonMap(Settings.SETTING_DB_CREATE, "update")
}
注意事项
这样改完,需要注意测试方法结束后数据不会被删除,因此这样使用的测试用例要能避免旧数据的干扰,要能重复执行且能通过才行,否则会失去“单元测试”的意义。