Spring contract日常使用总结

前言

Spring contract解决了在开发时,由于不同服务团队之间的进度不一致,导致的测试困难的问题。

为什么需要spring contract

在日常的集成测试中,我们可以通过以下两种方式来进行测试,但是各有优缺点

部署所有微服务并执行端到端测试。

优点:

模拟生产。

测试服务之间的真实通信。

缺点:

要测试一个微服务,我们必须部署6个微服务,几个数据库等。

运行时间很长,稳定性差,容易失败。

非常难以调试,依赖服务不受控制。

在单元/集成测试中模拟其他微服务。

优点:

非常快速的反馈,简单易用。

没有基础设施要求,如DB,网络等。

缺点:

模拟不够真实。

部分场景测试不到。

总结

所以这时候Spring Contract的优势就体现出来了,既可以模拟测试服务间的真实通信,也可以有非常快的反应速度以及简单易用。

接下来我会根据工作中的例子来进行实际操作,然后一步一步的完成spring contract。具体案例有一定的简化与名称修改(涉及到公司保密措施)

Spring contract的实现步骤

1. 作用

服务提供方与消费方共同约定好契约,都按照约定契约进行开发。确保开发的代码满足双方的需求。

2.步骤

服务提供方

step 1:添加依赖与插件

依赖:spring-cloud-contract-verifier - 用于自动生成单元测试代码

插件:spring-cloud-contract-maven-plugin - 同时还需要指定测试基类,在baseClassForTest中指定基类位置。该插件才会自动生成测试类与stubs(存根)

step 2:创建测试基类

根据步骤一中指定的基类位置,创建对应的测试基类。测试基类的作用是用于定义测试需要的环境

step 3:编写待测试的接口

(接口开发完成的情况)接口的返回结果跟契约定义的结果需要一致,否则生成的测试类,断言会不通过,也就无法生成stub jar。这种是契约的正确使用方式,消费者定义契约,验证生产者的接口是否符合契约,符合才能够进行构建

(接口未开发完成的情况)可以不需要接口,只写契约,Maven install时,只需要Mvn clean install -DskipTests,即可跳过verifier的测试,这种是为了将生成的.jason文件移植到mock服务器上。

step 4:添加合同

在合同的默认位置 src/test/resources/contracts 下用Groovy、Kotlin或Yaml编写合同定义语言(DSL)。推荐使用groovy,简单易懂好编写。本次实操使用的就是groovy编写合同。

step 5:Maven install生成stubs-jar

install完成后会生成4个文件,自动测试类(1),合同(2),映射的json(3),存根jar(4),如下图所示:

消费方

step 1:添加依赖

依赖:spring-cloud-contract-stub-runner

step 2:写测试类

1.需要注意@AutoConfigureStubRunner这个注解,是用于自动注入配置一个StubRunner. 也就是使用这个注解才能够调用到具体的打桩服务:

ini 复制代码
@AutoConfigureStubRunner(
        repositoryRoot="https://xxx.xxx.net/repository/contract-test",
                ids = "com.xxx:loan:1.0.0-SNAPSHOT:stubs:8090")

2.也可以通过在/src/test/resources目录下增加一个配置文件application-stub.yml文件:

yaml 复制代码
stubrunner:
  stubs-mode: REMOTE
  repositoryRoot: https://xxx.xxx.net/repository/contract-test
  username: user
  password: xxx
  ids:
    - com.xxx.xxx:1.0.0-SNAPSHOT:stubs:8090

其中的ids格式是:groupId:artifactId:version:classifier:port

然后通过ids去定位到刚刚通过clean install好的那个stub jar 包,然后在指定端口去启动这个stub jar

最终效果

当测试上下文启动,无需启动生产者的服务,在测试类调用生产者的接口不会404,因为Spring Cloud Contract Stub Runner将自动启动测试中的WireMock服务器并使用从服务器端生成的存根来提供返回数据。

相关推荐
计算机学长felix1 天前
基于SpringBoot的“中学信息技术课程教学网站”的设计与实现(源码+数据库+文档+PPT)_2025-10-17
数据库·spring boot·后端
长安城没有风1 天前
从入门到精通【Redis】Redis 典型应⽤ --- 缓存 (cache)
数据库·redis·后端·缓存
Tony Bai1 天前
释放 Go 的极限潜能:CPU 缓存友好的数据结构设计指南
开发语言·后端·缓存·golang
周杰伦_Jay1 天前
【Spring Boot从入门到精通】原理、实战与最佳实践
java·spring boot·后端
呼哧呼哧.1 天前
SpringBoot 的入门开发
java·spring boot·后端
Penge6661 天前
Hadoop-大数据技术
后端
运维行者1 天前
知乎崩了?立即把网站监控起来!
前端·javascript·后端
华仔啊1 天前
Spring事件的3种高级玩法,90%的人根本不会用
java·后端
唐叔在学习1 天前
Pyinstaller - Python桌面应用打包的首选工具
后端·python·程序员
我叫黑大帅1 天前
用户头像文件存储功能是如何实现的?
后端·google