【问题标题】:How to unit test an SQL query?如何对 SQL 查询进行单元测试?
【发布时间】:2011-05-15 00:46:56
【问题描述】:

我有一个类DBHandler,它接受一个查询,通过SQL 服务器运行它,检查错误并返回结果。如何对这个类进行单元测试?

编辑:我会尽量准确: DBHandler 负责将查询传递给服务器。为了测试它是否真的做到了,抛出正确的异常等等,我想将它连接到一个我将填充的模拟数据库。我的问题是 - 怎么做?如何创建一个处理调用的模拟“服务器”?

【问题讨论】:

  • @duffymo 这是一个计划,我还没有实施。我的问题更准确——如何模拟 SQL 服务器返回查询等?
  • 为什么要模拟 SQL Server?您正在测试 DBHandler - 将请求发送到真实数据库。没必要嘲笑这样的事情。
  • @duffymo 首先,我不想污染我的数据库。其次,我想确切地知道测试中存在哪些信息。
  • 污染您的数据库?测试是如何做到的?
  • 数据库添加记录测试

标签: java sql database unit-testing junit


【解决方案1】:

您需要使用在设置时创建和填充的内存中测试数据库,或者使您的所有测试都具有事务性,这样它们就不会改变您的测试数据库。

您将不得不担心数据的存在。

如果您使用的是 Spring,它们支持事务性单元测试。

不清楚你在问什么。您已经了解 JUnit。你认为你缺少什么?

【讨论】:

    【解决方案2】:

    只需传递一个 SQL 查询,并将返回的结果与预期结果进行比较。简单的。 JUnit 是一个单元测试框架,你可以使用它。

    有关复杂的数据库单元测试,请查看DBUnit

    【讨论】:

    • 不简单,预期结果可能取决于数据库内容。如果您真的走这条路,您应该有一个仅用于开发的数据库,并在开始测试之前将其置于已知状态。这种方法的问题在于,对于任何不重要的问题,测试都需要很长时间。
    • @stivlo:通常我们不采用开发数据库,​​但我们有一个测试数据库。是的,运行完整的 DBUnit 套件可能需要很长时间,但这是可以接受的。在编码期间运行几个测试不需要太多时间。
    • 嗨,Adeel,好的,同意,所以最好将真正的单元测试(无数据库测试)与功能测试(包括数据库测试)分开。
    • @Stivlo:确实是一个非常有效的想法。
    • 感谢您提及 DBUnit。它不能解决我的问题,但我认为它在未来的项目中会很有用)
    【解决方案3】:

    我会使用依赖注入来传递数据库连接或类似的东西,这样整个事情就可以在测试中被模拟出来。然后,您可以编写模拟查询抛出异常、返回各种错误或有效结果的测试。那么您的测试只是检查DBHandler 是否正确执行。

    【讨论】:

      【解决方案4】:

      模拟数据库的快速解决方案如下所示:

      • 设置 HSQLDB 测试服务器 独立于您的应用。

      • 填充测试数据。

      • 使用条件代码 连接到您的真实数据库,以 连接到测试服务器。一种 您的应用程序中的属性可以 控制这个。

      • 测试应用程序

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2012-01-08
        相关资源
        最近更新 更多