2011-10-16 167 views
3

我想知道人们发现他们的最佳实践是测试Hibernate映射和查询吗?测试Hibernate映射的最佳实践

这不能用单元测试完成,所以我的经验是编写集成测试,它只向下测试DAO层。通过这种方式,我可以完全测试每个插入/更新/删除/ ReadQueries,而无需测试完整的端到端解决方案。

每当集成测试套件运行它会: -

  1. 删除并重新创建数据库。
  2. 运行包含数据子集的导入SQL脚本。
  3. 在回滚事务的事务性上下文中运行每个测试。因此,它可以作为独立测试运行多次,或作为套件的一部分运行,并且由于数据库始终处于已知状态,因此会返回相同的结果。

我从不测试一个不同的“内存”数据库,因为总是有一个等效的开发数据库来测试。

我从来没有必要使用DBUnit。

回答

4

不要为此使用DbUnit。这种测试水平的开销太大了。

尤其是如果您在您的应用中使用Spring,请查看Spring Test Framework以帮助管理您的数据访问测试,特别是transaction management features

“等效开发数据库”没有问题,但内存中的内存将为其他任何东西带来速度。这很重要,因为尽管这些测试的单元/集成状态可能会受到争议,但它们是您想要运行很多的测试,因此它们需要尽可能快。

所以我的DAO的测试看起来像这样:

  1. 春季管理SessionFactoryTransactionManager
  2. Spring处理测试方法的所有事务。
  3. Hibernate在内存中的H2数据库中创建当前模式。
  4. 测试所有保存,加载,删除和查找方法,在对象之前和之后进行字段之间的比较。 (例如创建对象foo1,将其保存,将其加载作为foo2,验证foo1foo2包含相同的值。)

非常轻便,为快速反馈有用。

+0

感谢您的反馈(和其他人!!)。知道别人做什么非常有用。你能澄清,如果你的测试回滚插入/更新/删除?我的想法是数据库应该处于相同的状态,因为如果你想重新运行一个单独的测试或者测试类。如果测试改变数据库,理论上你可以改变每次运行测试的行为。 – Alex

+0

是的。 Spring测试框架处理这个问题。 –

+0

那么对于那些不使用弹簧的人来说最好的解决方案。 – monksy

3

如果您不依赖于专有的rdbms功能(触发器,存储过程等),那么您可以使用JUnit和内存数据库(如HSQLDB)轻松并全面地测试DAO。您需要通过一个类来初始化hibernate.cfg.xml仿真(用HSQLDB初始化hibernate,加载所需的hbm.xml文件),然后将提供的数据源传递给您的daos。

工作良好,为开发生命周期提供了真正的价值。

+0

非常感谢您的反馈。 :) – Alex

1

我这样做的方式与您自己的方式非常相似,除了实际使用内存数据库(如HSQLDB)之外。它比配置真正的数据库(在独立服务器上运行的数据库)更快,更便于携带。确实,对于某些更高级的特性,HSQLDB不起作用,因为它不支持它们,但我注意到,当我只是集成测试我的数据访问层时,我几乎遇到了这些问题。但是,如果是这种情况,我喜欢使用“jar”版本的mysql,它允许我从java启动一个功能齐全的MYSQL服务器,并在完成后关闭它。这是不是很实用的jar文件是相当大的:

http://dev.mysql.com/doc/refman/5.0/en/connector-mxj-configuration-java-object.html

,但它仍然在某些情况下是有用的。

+0

非常感谢您的反馈。 :) – Alex