10

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

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

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

4

5 回答 5

26

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

查看jMock以进行 Java 模拟。

于 2009-01-06T02:39:57.060 回答
6

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

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

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

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

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

于 2009-01-06T07:04:01.690 回答
3

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

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

于 2009-01-06T02:40:25.967 回答
3

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

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

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

于 2009-01-06T02:43:50.250 回答
1

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

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

于 2009-01-06T17:25:16.010 回答