Spring Cloud Contract 简介
Spring Cloud Contract 将 TDD 提升到软件架构层面。它允许您执行消费者驱动和生产者驱动的契约测试。
历史
在成为 Spring Cloud Contract 之前,这个项目叫做 Accurest。它由 (Codearte) 的 Marcin Grzejszczak 和 Jakub Kubrynski 创建。
0.1.0 版本于 2015 年 1 月 26 日发布,并于 2016 年 2 月 29 日发布 1.0.0 版本后趋于稳定。
测试问题
如果我们要测试前一节图中左上角的应用程序,以确定它是否可以与其他服务通信,我们可以做以下两件事之一
-
部署所有微服务并执行端到端测试。
-
在单元和集成测试中模拟其他微服务。
两者都有其优点,但也有很多缺点。
部署所有微服务并执行端到端测试
优点
-
模拟生产环境。
-
测试服务之间的实际通信。
缺点
-
要测试一个微服务,我们必须部署六个微服务、几个数据库和其他项目。
-
运行测试的环境被锁定,只能用于单个测试套件(在此期间,其他任何人都无法运行测试)。
-
它们运行时间很长。
-
反馈来得非常晚。
-
它们极难调试。
在单元和集成测试中模拟其他微服务
优点
-
它们提供非常快速的反馈。
-
它们没有基础设施要求。
缺点
-
服务实现者创建的存根可能与现实无关。
-
你可以使用通过的测试上线生产环境,但生产环境可能出现故障。
为了解决上述问题,Spring Cloud Contract 应运而生。其主要思想是为您提供非常快速的反馈,而无需设置整个微服务世界。如果您使用存根,那么您唯一需要的应用程序就是您的应用程序直接使用的那些。下图显示了存根与应用程序的关系
Spring Cloud Contract 确保您使用的存根是由您调用的服务创建的。此外,如果您可以使用它们,则意味着它们已通过生产方的测试。简而言之,您可以信任这些存根。
目的
Spring Cloud Contract 的主要目的是
-
确保 HTTP 和消息存根(在开发客户端时使用)与实际服务器端实现的功能完全一致。
-
推广 ATDD(验收测试驱动开发)方法和微服务架构风格。
-
提供一种发布合同变更的方法,这些变更可以立即在双方可见。
-
生成用于服务器端的样板测试代码。
默认情况下,Spring Cloud Contract 集成 Wiremock 作为 HTTP 服务器存根。
| Spring Cloud Contract 的目的不是开始在合同中编写业务功能。假设我们有一个欺诈检查的业务用例。如果一个用户可能因 100 种不同的原因被认定为欺诈,我们假设您会创建两个合同,一个用于正面情况,一个用于负面情况。合同测试用于测试应用程序之间的合同,而不是模拟完整的行为。 |