我正在构建一个查询Web服务的应用程序。数据库中的数据会随着时间的推移而变化。如何为此类应用程序构建单元测试?
Web服务发送回xml或无搜索结果的html页面。我无法真正改变网络服务。我的应用程序基本上使用HTTPURLConnection查询Web服务并将响应作为String获取。
希望有助于提供更多细节。
答案 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)
你的问题有点开放,但肯定有一些可测试的选项只使用上述信息:
我相信,通过更多信息,您将获得一堆有用的建议。
答案 4 :(得分:1)
我遇到的一个问题是复杂的(意思是“糟糕的”)数据模型,你无法确定问题是由于代码错误还是数据错误造成的。
这种情况的症状是,当您的应用程序运行良好,通过所有测试等时,使用模拟数据或新数据集,但是当您在真实数据上运行应用程序时会出现可怕的破坏。