【问题标题】:How do you make a unit test when the results vary?当结果不同时,如何进行单元测试?
【发布时间】:2010-09-29 17:42:32
【问题描述】:

我正在构建一个查询 Web 服务的应用程序。数据库中的数据随时间变化和变化。如何为这种类型的应用程序构建单元测试?

Web 服务发回 xml 或没有搜索结果的 html 页面。我不能真正改变网络服务。我的应用程序基本上使用 HTTPURLConnection 查询 Web 服务并将响应作为字符串获取。

希望对更多细节有所帮助。

【问题讨论】:

    标签: java unit-testing integration-testing


    【解决方案1】:

    使用您可以模拟的代理来抽象出 Web 服务。让您的模拟 Web 服务返回代表正常数据和极端情况的各种值​​。还模拟从 Web 服务获取异常。确保您的代码在这些条件下工作,并且您可以合理地确定它适用于 Web 服务提供的任何值。

    查看jMock 进行 Java 模拟。

    【讨论】:

    • 我什至没有想过要模拟 Web 服务。这听起来像是要走的路。
    【解决方案2】:

    严格来说单元测试,您只能测试具有确定性行为的单元。

    连接到外部网络服务器的测试是集成测试

    解决方案是模拟 HTTPURLConnection - 也就是说,在您的单元测试中创建一个派生自 HTTPURLConnection 类并返回硬编码或可参数化值的类。 编辑:请注意,这可以手动完成,无需任何模拟框架。

    查询Web服务器的类不应实例化HTTPURLConnection,而是通过参数接收它。在单元测试中,您创建 HTTPURLConnectionMock,并将其传递给询问 Web 服务器的类,该类将使用它,因为它使用的是真正的 HTTPURLConnection。在生产代码中,您创建一个真正的 HTTPURLConnection 并将其传递给类。

    您还可以使您的 HTTPURLConnectionMock 能够抛出 IOException,以测试错误条件。只是有一个方法告诉它不要返回结果,而是在下一次请求时返回异常。

    【讨论】:

    • 感谢您提供更全面的回答。
    【解决方案3】:

    您的问题有点开放,但仅使用上述信息肯定有一些可测试的选项:

    1. 您可以测试查询是否有效。断言您应该返回一个非空/非空结果集。
    2. 您可以测试查询结果是否为有效结果集。断言结果应该通过您的验证代码(所以此时,您知道数据是非空的,不是无意义的并且可能有用)。
    3. 如果您对数据架构/数据描述有所了解,则可以断言这些字段之间的关系是合理的。例如,如果您使用直升机获得结果,则不应将其与负 100 米的高度相关联....
    4. 如果您对数据的概率分布有所了解,您应该能够收集一组数据并断言您得到的分布在您期望看到的标准偏差范围内。

    相信有了更多信息,你会得到一堆有用的建议。

    【讨论】:

      【解决方案4】:

      听起来你的测试水平太高了。考虑模拟 Web 服务接口并在访问数据库的数据层上编写其他单元测试。此处提供更多细节可能会使这个问题更容易回答,例如您尝试测试的情况。

      我通常希望单元测试的结果不会改变,或者至少在您期望的范围内

      【讨论】:

        【解决方案5】:

        我遇到的一个问题是复杂的(意思是“蹩脚”)数据模型,您永远无法确定问题是由代码错误还是数据错误引起的。

        这种情况的一个症状是当您的应用程序运行良好、通过所有测试等时使用模拟数据或新数据集,但是当您在真实数据上运行应用程序时会严重中断。

        【讨论】:

        • 非常正确。我想这就是为什么您需要不止一种类型的验证:单元测试和集成测试。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 2019-10-31
        • 1970-01-01
        相关资源
        最近更新 更多