使用Spring Cloud Contracts时,生产者为什么要创建合同?

时间:2018-12-24 22:06:05

标签: spring-cloud consumer spring-cloud-contract

我一直在使用Spring Cloud Contracts。这是到目前为止我对工作流程的理解。

在服务器端

  • 写合同(以Groovy或Yaml)
  • 自动生成测试(使用gradle插件)
  • 为Base Controller进行适当设置的设置BaseClass
  • 运行自动生成的测试
  • 将生成的存根jar文件发布到某个本地存储库(其中包含内置的带有请求/响应的Wiremock服务器)

在客户端

  • 下载存根jar文件
  • 针对此存根jar编写测试。使用stubrunner验证响应

我不明白的是,这个消费者是如何驱动的?合同似乎来自生产者,消费者似乎正在被动地测试生产者发布的内容(使用存根jar文件)。生产者可能会意外地不更新合同,而是做出重大更改。这可能会导致对客户端的测试通过,即使它应该失败了。这是真的还是我误解了从消费者方创建合同的步骤

有想法吗?

1 个答案:

答案 0 :(得分:1)

消费者驱动的合同(CDC)开发基本上是扩展到生产者-消费者应用程序的测试驱动的开发(TDD)。由于是TDD,应该首先进行测试,然后再进行实施。而且由于它是由消费者驱动的-消费者会为生产者创建测试

因此,假设我们有一个生产者和一个消费者,以及一些需要实现的新import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common'; import { HttpException } from '@nestjs/common'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const request = ctx.getRequest(); const status = exception.getStatus(); response .status(status) .json({ statusCode: status, timestamp: new Date().toISOString(), path: request.url, }); } } 。在CDC中,工作流程如下(您可以在official documentation中找到更多信息)。

在消费者方面:

  • 写出该功能缺少的实现
  • 在本地克隆 Producer 存储库
  • 生产者的存储库中本地定义合同(并为其自动生成单元测试)
  • 运行集成测试(在消费者侧)
  • 提交拉取请求

在生产者方面:

  • 接受拉取请求(消费者已在此处生成测试)
  • 编写缺少的实现(TDD样式)
  • 部署您的应用
  • 在线工作

消费者为新功能(但在生产者的存储库中)签定合同以来,这一切都变得有意义了-我们有一个消费者驱动的方法

相关问题