【问题标题】:Testing which includes calls to remote services包括调用远程服务的测试
【发布时间】:2012-01-03 11:46:58
【问题描述】:

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

任何人都可以建议我应该如何去做吗?

流程如下:

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

欢迎任何意见和建议。

提前谢谢你。

【问题讨论】:

  • 不确定你想在这里测试哪个部分。您似乎想测试整个周期,但不想测试将实体复制到本地数据库的代码?你能澄清一下吗?
  • 没错。我想测试实体是否具有正确的属性,但我不需要测试将实体写入本地数据库的代码。这是一个“我们期望的本地数据库中有什么?”的情况
  • @mip: "是我们预期的本地数据库中的内容" - 这听起来真的像是你想测试你的数据库引擎是否可以完成它的工作。这是为什么?你永远不会测试这些东西——你对 ORM 映射、查询创建、从模块到 DAL 的信息流进行单元测试,这就是你停止的地方。你假设数据库可以完成它的工作。
  • @jimmy_keen 我正在尝试测试在原始 Web 服务调用和写入本地数据库的实体之间发生的处理。抱歉,我没有很好地解释这一点。

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


【解决方案1】:

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

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

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

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

如果远程系统稳定,不经常变化,那么你可以在本地数据库中测试更多行的细节,但要记住

  1. 每次远程服务更改时,您都必须更新测试,
  2. 每次远程服务版本更改时,您都必须在测试中添加逻辑。

请记住,在远程服务中测试复杂应用程序逻辑的地方是在远程服务的代码中。不是你的代码。

要考虑的另一件事:

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

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

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

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

【讨论】:

  • 非常有帮助。非常感谢。您是否知道此类测试的任何示例可能对我有用?
【解决方案2】:

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

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

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

在单元测试中,您有时希望专注于单一特性(因此得名单元测试)。在这种情况下,我认为这将是适当的实体/价值创造。测试整个过程听起来更像是integration test。那是你想做的吗?

【讨论】:

  • 是的,这可能被归类为集成测试。
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 2014-11-20
  • 2015-07-28
  • 2011-10-08
  • 1970-01-01
  • 2015-01-09
  • 2013-02-07
相关资源
最近更新 更多