【发布时间】:2010-09-29 17:42:32
【问题描述】:
我正在构建一个查询 Web 服务的应用程序。数据库中的数据随时间变化和变化。如何为这种类型的应用程序构建单元测试?
Web 服务发回 xml 或没有搜索结果的 html 页面。我不能真正改变网络服务。我的应用程序基本上使用 HTTPURLConnection 查询 Web 服务并将响应作为字符串获取。
希望对更多细节有所帮助。
【问题讨论】:
标签: java unit-testing integration-testing
我正在构建一个查询 Web 服务的应用程序。数据库中的数据随时间变化和变化。如何为这种类型的应用程序构建单元测试?
Web 服务发回 xml 或没有搜索结果的 html 页面。我不能真正改变网络服务。我的应用程序基本上使用 HTTPURLConnection 查询 Web 服务并将响应作为字符串获取。
希望对更多细节有所帮助。
【问题讨论】:
标签: java unit-testing integration-testing
使用您可以模拟的代理来抽象出 Web 服务。让您的模拟 Web 服务返回代表正常数据和极端情况的各种值。还模拟从 Web 服务获取异常。确保您的代码在这些条件下工作,并且您可以合理地确定它适用于 Web 服务提供的任何值。
查看jMock 进行 Java 模拟。
【讨论】:
严格来说单元测试,您只能测试具有确定性行为的单元。
连接到外部网络服务器的测试是集成测试。
解决方案是模拟 HTTPURLConnection - 也就是说,在您的单元测试中创建一个派生自 HTTPURLConnection 类并返回硬编码或可参数化值的类。 编辑:请注意,这可以手动完成,无需任何模拟框架。
查询Web服务器的类不应实例化HTTPURLConnection,而是通过参数接收它。在单元测试中,您创建 HTTPURLConnectionMock,并将其传递给询问 Web 服务器的类,该类将使用它,因为它使用的是真正的 HTTPURLConnection。在生产代码中,您创建一个真正的 HTTPURLConnection 并将其传递给类。
您还可以使您的 HTTPURLConnectionMock 能够抛出 IOException,以测试错误条件。只是有一个方法告诉它不要返回结果,而是在下一次请求时返回异常。
【讨论】:
您的问题有点开放,但仅使用上述信息肯定有一些可测试的选项:
相信有了更多信息,你会得到一堆有用的建议。
【讨论】:
听起来你的测试水平太高了。考虑模拟 Web 服务接口并在访问数据库的数据层上编写其他单元测试。此处提供更多细节可能会使这个问题更容易回答,例如您尝试测试的情况。
我通常希望单元测试的结果不会改变,或者至少在您期望的范围内
【讨论】:
我遇到的一个问题是复杂的(意思是“蹩脚”)数据模型,您永远无法确定问题是由代码错误还是数据错误引起的。
这种情况的一个症状是当您的应用程序运行良好、通过所有测试等时使用模拟数据或新数据集,但是当您在真实数据上运行应用程序时会严重中断。
【讨论】: