【问题标题】:Using live endpoints vs using mocked endpoints in integration tests在集成测试中使用实时端点与使用模拟端点
【发布时间】:2013-03-07 03:18:23
【问题描述】:

最近我和我的同事一直在为一个 Java 项目编写集成测试。这些集成测试中的大多数都需要至少一个 SOAP Web 服务调用、LDAP 查询或其他依赖于我们不一定能够控制的端点的东西。其中一些 SOAP/LDAP 调用使用仍在开发中的库。

这最终意味着我们的集成测试有时会在构建过程中当机器停机、库更改或端点被更改时失败。在做了一些研究之后,我注意到人们在集成测试中使用实时端点似乎相当普遍,但我也发现了关于为什么使用实时端点可能有害的文章(http://martinfowler.com/articles/nonDeterminism.html#RemoteServices)。

我想知道在创建集成测试时什么更有意义:模拟所有端点,还是使用实时端点?似乎使用实时端点,尤其是在不可靠的情况下,会使测试变得不确定。但是,模拟似乎只能带您到此为止,并且您将无法测试在类似生产的环境中发生的情况。由纯模拟组成的集成测试对于验证除回归之外的任何内容是否有价值?

【问题讨论】:

    标签: java testing integration-testing


    【解决方案1】:

    在模拟和端点时,准确模拟端点非常重要。如果您不这样做,您的测试可能会导致您错误地认为您可以正确地与服务集成。您正在使用不断变化的端点这一事实似乎使这变得困难。

    无论您是在集成测试还是验收测试级别进行,您都应该有与真实端点交互的测试,否则您将不知道集成是否真的有效。

    在您的情况下,例如,如果库更改或端点被更改并且您的测试失败,那实际上是集成失败,因此检测到这是一件好事。如果机器出现故障,您可以在测试中检测到该问题并将测试报告为已跳过而不是在此测试中失败。

    所以在这种情况下,我会使用真实服务来确保您的软件与第三方组件正确集成。

    【讨论】:

    • 感谢您的回复。我明白你在说什么,但由于多种原因(lib 更改、机器停机、端点被更改等)而导致失败的测试不是不确定的吗?如果我不得不在某个时候忽略它,这是一个很好的测试吗?我觉得这是一个滑坡,导致我无法依赖的测试。
    • 会有一些不确定的行为,但这将真正代表您的生产系统。如果您无法控制这些服务,那么您将无能为力,但如果我对真实服务进行测试,我会更有信心。你总是可以为你的一些测试写一个模拟,但这增加了很大的维护责任。不管你是否在某种程度上模拟了服务,我肯定会进行一些真实的测试。
    • 有道理。在阅读了更多内容后,我找到了 Martin Fowler 的另一篇文章 - martinfowler.com/bliki/IntegrationContractTest.html 由于我的端点有些不可靠,我认为这可能会有所帮助
    • 假设测试替身的维护不会成为负担,这是一个很好的组成部分。祝你好运!
    【解决方案2】:

    您绝对应该尝试模拟您的端点。这样做有几个原因:

    • 性能很重要,
    • 对生产环境没有压力,或者
    • 如果检测到一些错误,为什么要破坏生产环境?

    您可以在this blog 中找到有关此问题的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2021-11-16
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多