当结果变化时,您如何进行单元测试?

时间:2009-01-06 02:34:37

标签: java unit-testing integration-testing

我正在构建一个查询Web服务的应用程序。数据库中的数据会随着时间的推移而变化。如何为此类应用程序构建单元测试?

Web服务发送回xml或无搜索结果的html页面。我无法真正改变网络服务。我的应用程序基本上使用HTTPURLConnection查询Web服务并将响应作为String获取。

希望有助于提供更多细节。

5 个答案:

答案 0 :(得分:26)

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

查看jMock的Java模拟。

答案 1 :(得分:6)

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

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

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

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

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

  1. 您可以测试查询是否有效。断言您应该返回非空/非空结果集。
  2. 您可以测试查询结果是否为有效结果集。断言结果应该通过验证代码(所以在这一点上,你知道数据是非空的,不是非敏感的,也可能是有用的。)
  3. 如果您对数据模式/数据描述一无所知,则可以断言这些字段相互之间是合理的。例如,如果您使用直升机获得结果,则不应与负100米的高度相关联....
  4. 如果您对数据的概率分布一无所知,那么您应该能够收集一组数据并断言您的结果分布与您期望看到的标准偏差相符。
  5. 我相信,通过更多信息,您将获得一堆有用的建议。

答案 4 :(得分:1)

我遇到的一个问题是复杂的(意思是“糟糕的”)数据模型,你无法确定问题是由于代码错误还是数据错误造成的。

这种情况的症状是,当您的应用程序运行良好,通过所有测试等时,使用模拟数据或新数据集,但是当您在真实数据上运行应用程序时会出现可怕的破坏。