【发布时间】:2009-12-29 11:07:18
【问题描述】:
我正在使用存根将我的 web 服务相关测试与实际 web 服务隔离开来。
您/我应该如何合并测试以确保我精心制作的响应与实际的 Web 服务匹配(我无法控制它)?
我不想知道怎么做,但是何时何地?
我应该为 testdata 测试创建一个 testsuite-testsuite 吗?...
【问题讨论】:
标签: web-services language-agnostic testing
我正在使用存根将我的 web 服务相关测试与实际 web 服务隔离开来。
您/我应该如何合并测试以确保我精心制作的响应与实际的 Web 服务匹配(我无法控制它)?
我不想知道怎么做,但是何时何地?
我应该为 testdata 测试创建一个 testsuite-testsuite 吗?...
【问题讨论】:
标签: web-services language-agnostic testing
我会使用像这个优秀的工具这样的东西
【讨论】:
如果可以,请将服务安装在一个小型、完全受控的环境中。缺点:你必须想办法在新版本推出时得到通知。
如果这不可行,请编写一个调用真实服务并检查重要点的测试(我会得到响应吗?所有部分都在那里吗?我期望它们在哪里?我可以解析结果吗?)
避免检查时间戳、结果大小等事情,这些事情可以而且确实会一直变化。
【讨论】:
您可以使用 EasyMock 测试可能的故障,如下所示:
public void testDisplayProductsWhenWebServiceThrowsRemoteLookupException() {
...
EasyMock.expect(mockWebService.getProducts(category)).andThrow(new RemoteLookupException());
...
someServiceOrController.someMethodThatUsesMockWebService(...);
}
对所有可能的故障情况重复。另一种解决方案是自己实现一个虚拟 SEI。使用 JAX-WS,您可以简单地注释一个 java 类,该类生成一个与您使用的客户端一致的接口。所有方法都只能返回虚拟数据。然后,您可以在自己的服务器上部署服务,并将测试环境指向虚拟位置。
也许比我到目前为止所说的任何废话更重要的是,您可以听取 The Pragmatic Programmer 的作者的建议并使用断言进行编程。也就是说,鉴于您无法控制其实现,您必须不可避免地对所使用的 Web 服务做出某些假设,您可以添加如下代码:
if(resultOfWebService == null || resultOfWebService.getId() == null)
throw new AssertionError("WebService violated contract by doing xyz: result => " + resultOfWebServivce);
这样,如果您的假设不成立,您至少会发现它,而不是可能默默地失败!
您还可以打开架构验证和协议验证,以确保服务按照规范运行。
【讨论】: