【问题标题】:Best practice for testing Hibernate mappings测试 Hibernate 映射的最佳实践
【发布时间】:2011-10-16 15:03:57
【问题描述】:

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

这不能通过单元测试来完成,所以我的经验是编写仅向下测试 DAO 层的集成测试。这样我就可以完全测试每个插入/更新/删除/读取查询,而无需测试完整的端到端解决方案。

无论何时运行集成测试套件,它都会:-

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

我从不针对不同的“内存中”数据库进行测试,因为总是有一个等效的开发数据库可供测试。

我从来不需要使用 DBUnit。

【问题讨论】:

    标签: java hibernate integration-testing


    【解决方案1】:

    永远不要为此使用 DbUnit。这种级别的测试开销太大了。

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

    “等效的开发数据库”很好,但是内存中的H2 database 会为了速度而吹掉其他任何东西。这很重要,因为虽然这些测试的单元/集成状态可能存在争议,但它们是您想要运行的测试,因此它们需要尽可能快。

    所以我的 DAO 测试如下所示:

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

    非常轻量级,可用于快速反馈。

    【讨论】:

    • 感谢您的反馈(以及其他所有人!!)。了解其他人的行为非常有用。您能否澄清您的测试是否回滚插入/更新/删除?我的想法是数据库应该处于相同的状态,因为如果您想重新运行单个测试或测试类。如果测试改变了数据库,那么理论上你可以在每次运行时改变测试的行为。
    • 不使用spring的人有什么解决办法。
    • 我更愿意测试与您的生产数据库相同的数据库提供程序(例如,通过 docker 容器),因此不针对内存数据库。根据您的目标数据库(例如 DB2)和 DDL 创建/更新策略,映射测试可能变得毫无价值。
    【解决方案2】:

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

    运行良好并为开发生命周期提供真正的价值。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-24
        • 2023-03-16
        • 2011-06-29
        • 2020-02-05
        • 2020-04-19
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多