【问题标题】:PACT vs spring cloud contract testsPACT 与 Spring Cloud 合约测试
【发布时间】:2019-02-01 15:50:06
【问题描述】:

我正在尝试了解 PACT 和 Spring Cloud Contract 之间更好的工具来实现消费者驱动程序合同测试。 我没有找到任何明确的例子来找出利弊。

我想实现 CDCT,我的项目中没有使用 Spring。据我了解,我假设 PACT 很适合。

欢迎任何信息或建议。 谢谢。

【问题讨论】:

  • 我都试过了,对我来说。 Pact 更容易用于 REST APIs 契约,并且易于在不同语言之间进行测试,并且 Pact 提供了一个服务器来在消费者和提供者之间共享 Pacts。 Spring Cloud 合约提供了消息传递、esp、Spring AMQP、Spring Cloud Stream 等的测试能力,它还尝试支持多语言并提供 Pact 兼容性。我为这些创建了一些示例,github.com/hantsy/spring-cloud-sample
  • 谢谢!作为仅供参考,Pact 还支持消息

标签: pact spring-cloud-contract


【解决方案1】:

Spring Cloud Contract 允许您为 REST API 和消息传递定义和测试合约。它提供了清晰易用的静态类型 Groovy DSL,还允许通过 yaml 定义合约。无论是使用 DSL 还是使用 yaml,对于任何熟悉标准 HTTP/消息传递术语的人来说,定义合同都是非常直观的,例如:

request {
    method PUT()
    url '/fraudcheck'
    body([
           "client.id": $(regex('[0-9]{10}')),
           loanAmount: 99999
    ])
    headers {
        contentType('application/json')
    }
}
response {
    status OK()
    body([
           fraudCheckStatus: "FRAUD",
           "rejection.reason": "Amount too high"
    ])
    headers {
        contentType applicationJson()
    }
}

生产者端测试由 SCC 自动生成,并在构建期间添加到项目中。如果没有正确实施履行合同,项目将不会被构建和部署。如果通过,消费者的存根将被生成并与相应的工件版本一起发布。

在消费者方面,对于 HTTP,SCC 提供 Stubrunner,它启动一个 Wiremock(内存中的 http 服务器)实例,为匹配的请求提供存根响应。 Stubrunner 与外部工件存储库(例如 Nexus 和 Artifactory)以及本地 m2 存储库一起使用。

SCC 与 SpringBoot 无缝集成,还与 Spring Cloud 开箱即用集成,可用于在集成测试期间代替服务发现。

它还与 Pact 开箱即用地集成,并允许通过挂钩利用额外的 Pact 功能,同时仅使用 SCC 合同定义。

SCC 还提供基于 Docker 的选项,用于在 JVM 以外的技术中实施和测试合约。

免责声明:我是 Spring Cloud Contract 提交者。

【讨论】:

  • 这个答案并没有真正提供两者之间的区别。它只是谈论 SCC 并没有真正将其与 Pact 区分开来。例如第一行“测试 REST API 和消息传递的合同”:您也可以在 Pact 中这样做。
  • 现在可以,但以前不能,即使 SCC 已经支持它。
【解决方案2】:

在合约测试中,我们希望确保 API 的提供者和消费者相互兼容。因此,我们将我们的期望定义为使用 DSL 的合约,并针对 API 的消费者或提供者对其进行测试,如果成功,则将其发布(通过手动复制或发布到共享存储库)到合约的另一端(提供者或消费者)。

此类功能的两个主要提供者是:Pact 和 SCC(Spring Cloud Contract)

PACT:Pact 是消费者驱动的合约,意味着我们在消费者端定义和验证合约,然后将其推送到提供者端进行验证。 此外,Pat 不限于特定的框架甚至语言(pact-JVM 用于 java 应用程序)。此外,它与 Spring (Boot) 集成得很好,您可以在启动整个应用程序 (@SpringBootTest) 或在 Slice 测试期间 (@WebMvcTest) 定义 pact 测试

SCC:通常它鼓励提供者驱动的合同,这意味着您在提供者端定义合同,如果它验证然后将其发布到消费者端。但是,我们可以这样做the other way around,甚至我们可以单独定义合约并针对生产者和消费者手动测试它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多