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

Java 测试,包括对远程服务的调用,java,web-services,unit-testing,testing,junit,Java,Web Services,Unit Testing,Testing,Junit,我希望测试一段时间后调用远程服务的结果会反映在本地数据库中的代码 有谁能建议我该怎么做 过程如下: 一种方法使用web服务在远程系统上创建实体。一旦创建了实体,实体就通过涓涓流反馈回本地系统(这不是要测试的代码的一部分)。然后,测试应查询本地数据库,以确保已正确创建实体。一个复杂的问题是,使用实体更新本地数据库所需的时间是可变的 欢迎任何意见和建议 先谢谢你 然后,测试应查询本地数据库,以确保已正确创建实体 是否要测试DB引擎是否可以插入有效值。。?我希望不是。您不需要查询数据库来测试实体创建

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

有谁能建议我该怎么做

过程如下:

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

欢迎任何意见和建议

先谢谢你

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

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

您应该测试的是您的逻辑是否能够正确生成这些值,或者它是否能够构建正确的
INSERT
命令字符串。如果是这样的话,应该考虑到与服务和实际DAO/DB相关对象的依赖关系


在单元测试中,您希望同时关注单个特性(因此称为单元测试)。在这种情况下,我假设它是正确的实体/值创建。测试整个过程听起来更像是一个过程。这就是您想要做的吗?

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

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

假设远程服务不在您的控制之下。您正在向远程服务发送请求,它正在处理该请求,并将请求发送到本地数据库。因此,您无法影响需要多长时间,或者数据将如何写入本地数据库,或者将发生什么样的数据转换

所以,您所能测试的就是,您发送的一些数据在一段时间后将最终进入数据库。因此,要测试发生了什么事情,您需要做的就是测试数据库中是否有适当的行。这可能只是一个简单的
选择计数(*),其中…
[*]

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

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

    另一件需要考虑的事情是:

    当测试其他人的代码时,事情可能会在没有通知的情况下发生变化,测试可能会在没有警告的情况下失败,因为他们的代码中存在错误,他们的集成服务器关闭,他们的数据库关闭。如果可能,请将他们的代码安装到您控制的机器上,这样可以最大限度地减少此类问题的数量。另一种选择是有一个单独的项目 特别是对于这些测试,所以如果这些测试失败,至少您的构建可以工作

    如果你能控制远程服务,那就太好了。将复杂的逻辑测试放在该服务的测试中,在本地应用程序中只需测试一些数据是否返回,即一个环回测试

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


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

    不确定要在此处测试的确切零件。您似乎想测试整个周期,但不想测试将实体复制到本地数据库的代码?你能澄清一下吗?没错。我想测试实体是否具有正确的属性,但不需要测试将实体写入本地数据库的代码。这是一个“本地数据库中的内容是否符合我们的预期?”@mip:“本地数据库中的内容是否符合我们的预期”-听起来您确实想测试您的DB引擎是否能够正常工作。为什么呢?您从未测试过这些东西—您需要对ORM映射、查询创建、从模块到DAL的信息流进行单元测试,而这正是您停止的地方。您假设DB可以完成它的工作。@jimmy_keen我正在尝试测试原始web服务调用和写入本地数据库的实体之间发生的处理。抱歉,我没有很好地解释这一点。是的,这可能被归类为集成测试。非常有用。非常感谢你。你知道这类测试的任何例子对我来说可能有用吗?