【问题标题】:Tools and Methods for testing Service/DAO layers in Java在 Java 中测试服务/DAO 层的工具和方法
【发布时间】:2011-03-01 15:43:33
【问题描述】:

我正在尝试找出测试服务和 DAO 层的最佳方法。所以,几个子问题...

  1. 在测试服务层时,最好针对模拟 DAO 层或指向测试环境的“实时”DAO 层进行测试?
  2. 当唯一的测试数据库在共享环境(Oracle/DB2)时,DAO层的SQL应该如何测试
  3. 您如何解决任何 DAO 写入/更新都需要使用 DAO 读取进行测试的悖论,这也是必须测试的东西?

我正在寻找该领域的任何优秀文档、文章或参考资料,以及帮助自动化该过程的任何工具。我已经知道用于单元测试的 JUint 和用于 CI 的 Hudson。

【问题讨论】:

    标签: java testing automated-tests integration-testing


    【解决方案1】:

    获取Growing Object-Oriented Software, Guided by Tests。它提供了一些关于如何测试数据库访问的重要提示。

    就个人而言,我通常将 DAO 测试分为 2 个部分,一个带有模拟数据库的单元测试来测试 DAO 上的功能,以及一个集成测试来测试针对数据库的查询。如果您的 DAO 只有数据库访问代码,则不需要单元测试。

    我从书中得到的一个建议是(集成)测试必须将更改提交到数据库。在使用休眠并确定测试被标记为回滚并且数据库从未得到插入语句之后,我已经学会了这样做。如果您使用触发器或任何类型的验证(甚至是 FK),我认为这是必须的。

    另一件事,远离 dbunit,它是一个很好的开始工作的框架,但是当一个项目变得非常微小时,它就变得非常糟糕。我的偏好是使用一组Test Data Builder 类来创建数据,并将其插入测试设置或测试本身。

    并检查 dbmigrate,它不是用于测试,但它会帮助您管理脚本以升级和降级数据库架构。

    在共享数据库服务器的场景中,我为每个环境创建了一个架构/用户。由于每个开发人员都有自己的“本地”环境,因此他也拥有一个架构。

    【讨论】:

      【解决方案2】:

      这是我的答案:

      1. 使用模拟 DAO 测试您的服务。容易得多,糊得更快。使用 EasyMock 或 Mockito 或任何其他模拟框架来测试服务层。
      2. 为每个开发人员提供自己的数据库模式来执行他的测试。这样的模式通常是空的:单元测试在运行测试之前用一个小的测试数据集填充数据库,并在测试完成后清空它。为此请使用DBUnit
      3. 如果读取操作针对定义明确的静态测试数据集(您应该对其进行单元测试),那么您可以依靠它们对写入进行单元测试。但是您也可以使用临时查询甚至 DBUnit 来测试写入是否按预期工作。测试不一定按此顺序运行这一事实并不重要。如果一切顺利,则一切正常。

      【讨论】:

      • 工具和建议+1。您对 Augusto 关于 DBUnit 的评论有何反驳?
      • DBUnit 有其怪癖,但如果您坚持每个单元测试类使用一个数据集(而不是为所有测试使用一个大数据集),那么它是易于管理的。我必须说我没有在同一个联盟中尝试过任何其他工具,但是 DBUnit 在一个相当大的项目中为我工作。
      • 也许我的说法有点苛刻,但我发现DBunit的问题是它很难重构。我和 4 个非常优秀的开发人员一起在项目中工作,我们经常更改架构。不幸的是,eclipse 不擅长做这些重构,所以我们不得不手动更新 DBunit 文件(我们每个测试类都有一个数据集)。我认为 intellij 可能在这方面做得更好,但我不确定。
      猜你喜欢
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 2012-03-19
      • 2013-09-09
      • 1970-01-01
      • 2017-06-07
      相关资源
      最近更新 更多