我希望测试代码,在一段时间后,远程服务调用的结果会反映在本地数据库中。
有人可以建议我应该怎么做吗?
这是过程:
一种方法利用Web服务在远程系统上创建实体。一旦创建,实体就会通过涓流馈送反馈到本地系统(这不是要测试的代码的一部分)。然后,测试应查询本地数据库以确保已正确创建实体。复杂的是,使用实体更新本地数据库所需的时间是可变的。
欢迎任何建议和意见。
提前谢谢。
答案 0 :(得分:3)
您肯定正在进行集成测试。这在JUnit中是完全可行的,但是你总是需要知道你正在测试什么,以及你可以测试什么。
首先,您需要知道谁控制远程服务。如果是你,那很好。如果不是你,请小心。
我们假设远程服务不在您的控制之下。您正在向远程服务发送请求,它正在处理它,并向本地数据库发送请求。因此,您无法影响将花费多长时间,或者如何将数据写入本地数据库,或者将进行哪些数据转换。
因此,您可以测试的是,您发送的某些数据会在一段时间后最终出现在数据库中。因此,要测试某些事情正在发生,您需要做的就是测试数据库中的相应行。这可能只是一个简单的SELECT COUNT(*) WHERE ...
[*]
如果远程系统稳定,不经常更改,那么您可以在本地数据库中测试更多行的详细信息,但请记住
请记住,在远程服务中测试复杂应用程序逻辑的地方是远程服务的代码。不是你的代码。
要考虑的另一件事:
在测试别人的代码时,事情可能会发生变化,恕不另行通知,由于代码中的错误,他们的集成服务器已关闭,数据库已关闭,测试可能会在没有警告的情况下失败。如果可能,请安装他们的在您控制的计算机上的代码,这可以减少您将拥有的此类问题的数量。另一种选择是有一个单独的项目 特别是对于这些测试,所以至少你的构建将在这些测试失败时起作用。
如果您可以控制远程服务,那很好。将复杂的逻辑测试放在该服务的测试中,本地应用程序所需要的只是测试一些数据是否会返回,即环回测试。
对于实际测试,远程服务的简单调用,然后每5秒左右测试一次数据存在的循环可能就足够了。当然是暂停。 JUnit中没有特定于循环的内容,但请查看超时的Timeout @Rule。
[*]当然还有适当的错误条件。
答案 1 :(得分:0)
然后,测试应查询本地数据库以确保已正确创建实体
您想测试数据库引擎是否可以插入有效值..?我希望不是。您不应该需要查询数据库来测试实体创建。
您应该测试的是您的逻辑是否可以正确生成这些值,或者它是否可以构建正确的INSERT
命令字符串。如果是这种情况,服务和实际与DAO / DB相关的对象的依赖应该是faked。
在单元测试中,您希望关注单一功能(因此名称单元测试)。在这种情况下,我假设它将是适当的实体/值创建。测试整个过程听起来更像是integration test。那是你想做的吗?