测试包括对远程服务的调用

时间:2012-01-03 11:46:58

标签: java web-services unit-testing testing junit

我希望测试代码,在一段时间后,远程服务调用的结果会反映在本地数据库中。

有人可以建议我应该怎么做吗?

这是过程:

一种方法利用Web服务在远程系统上创建实体。一旦创建,实体就会通过涓流馈送反馈到本地系统(这不是要测试的代码的一部分)。然后,测试应查询本地数据库以确保已正确创建实体。复杂的是,使用实体更新本地数据库所需的时间是可变的。

欢迎任何建议和意见。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

您肯定正在进行集成测试。这在JUnit中是完全可行的,但是你总是需要知道你正在测试什么,以及你可以测试什么。

首先,您需要知道谁控制远程服务。如果是你,那很好。如果不是你,请小心。

我们假设远程服务不在您的控制之下。您正在向远程服务发送请求,它正在处理它,并向本地数据库发送请求。因此,您无法影响将花费多长时间,或者如何将数据写入本地数据库,或者将进行哪些数据转换。

因此,您可以测试的是,您发送的某些数据会在一段时间后最终出现在数据库中。因此,要测试某些事情正在发生,您需要做的就是测试数据库中的相应行。这可能只是一个简单的SELECT COUNT(*) WHERE ... [*]

如果远程系统稳定,不经常更改,那么您可以在本地数据库中测试更多行的详细信息,但请记住

  1. 每次远程服务更改时,您都必须更新测试,
  2. 每次远程服务版本更改时,都必须为测试添加逻辑。
  3. 请记住,在远程服务中测试复杂应用程序逻辑的地方是远程服务的代码。不是你的代码。

    要考虑的另一件事:

    在测试别人的代码时,事情可能会发生变化,恕不另行通知,由于代码中的错误,他们的集成服务器已关闭,数据库已关闭,测试可能会在没有警告的情况下失败。如果可能,请安装他们的在您控制的计算机上的代码,这可以减少您将拥有的此类问题的数量。另一种选择是有一个单独的项目  特别是对于这些测试,所以至少你的构建将在这些测试失败时起作用。

    如果您可以控制远程服务,那很好。将复杂的逻辑测试放在该服务的测试中,本地应用程序所需要的只是测试一些数据是否会返回,即环回测试。

    对于实际测试,远程服务的简单调用,然后每5秒左右测试一次数据存在的循环可能就足够了。当然是暂停。 JUnit中没有特定于循环的内容,但请查看超时的Timeout @Rule。

    [*]当然还有适当的错误条件。

答案 1 :(得分:0)

  

然后,测试应查询本地数据库以确保已正确创建实体

您想测试数据库引擎是否可以插入有效值..?我希望不是。您不应该需要查询数据库来测试实体创建。

您应该测试的是您的逻辑是否可以正确生成这些值,或者它是否可以构建正确的INSERT命令字符串。如果是这种情况,服务和实际与DAO / DB相关的对象的依赖应该是faked

在单元测试中,您希望关注单一功能(因此名称​​单元测试)。在这种情况下,我假设它将是适当的实体/值创建。测试整个过程听起来更像是integration test。那是你想做的吗?