Spring Cloud Contract简介
转载:https://www.jianshu.com/p/e3277824a10a
和dummy service一样
Spring Cloud Contract是个啥?
Spring Cloud Contract 为通过CDC(Customer Driven Contracts)开发基于JVM的应用提供了支持。它为TDD(测试驱动开发)提供了一种新的测试方式 - 基于接口。
为什么要使用契约做测试?
试想一下,如果你所在的项目在使用微服务架构,各个服务之间存在调用关系如下:

当你想专注测试某一个服务时,需要将其他的服务都起起来,才能进行测试。或者,写大量的集成测试,将外部的所有服务调用都mock掉。
这两种方式的测试的成本都很高。那么怎么解决这个问题?
答案就是:契约测试
契约测试的优势
一旦服务和服务之间定义了契约,Spring cloud contract会为服务消费端提供stub的mock server,这样,用户就可以只关注自己的服务进行测试,同时也不需要写大量的集成测试。
契约测试契约测试适用的场景
并不是所有的场景都适用,如果该服务并没有太多的外部调用依赖,那其实并没有写契约测试的必要。只有当服务的依赖很多,同时依赖的系统特别多的时候,契约测试才会适用。契约测试的使用成本
契约的优势在于,当上下游之间签订了契约后,任意一方对契约进行了修改,另外一方就能知道。但是,如果只是单边加了契约测试,其实意义不是很大,充其量只是个可测试的api文档。
在使用的过程中,当有复杂的业务场景是,我们常常会因为需要mock很多的数据,而需要花很长的时间去准备测试数据,为此可能需要写很多的契约。
如何定义契约呢?
Spring Cloud Contract现在支持2种格式 yaml和groovy。
groovy灵活性比较高,但是上手成本有点高。
org.springframework.cloud.contract.spec.Contract.make {
request {
method 'PUT'
url '/api/12'
headers {
header 'Content-Type': 'application/vnd.org.springframework.cloud.contract.verifier.twitter-places-analyzer.v1+json'
}
body '''\
[{
"created_at": "Sat Jul 26 09:38:57 +0000 2014",
"id": 492967299297845248,
"id_str": "492967299297845248",
"text": "Gonna see you at Warsaw",
"place":
{
"attributes":{},
"bounding_box":
{
"coordinates":
[[
[-77.119759,38.791645],
[-76.909393,38.791645],
[-76.909393,38.995548],
[-77.119759,38.995548]
]],
"type":"Polygon"
},
"country":"United States",
"country_code":"US",
"full_name":"Washington, DC",
"id":"01fbe706f872cb32",
"name":"Washington",
"place_type":"city",
"url": "http://api.twitter.com/1/geo/id/01fbe706f872cb32.json"
}
}]
'''
}
response {
status OK()
}
}
yaml上手比较简单,但是,对于复杂的契约支持稍微弱一点。
description: Some description
name: some name
priority: 8
ignored: true
request:
url: /foo
queryParameters:
a: b
b: c
method: PUT
headers:
foo: bar
fooReq: baz
body:
foo: bar
matchers:
body:
- path: $.foo
type: by_regex
value: bar
headers:
- key: foo
regex: bar
response:
status: 200
headers:
foo2: bar
foo3: foo33
fooRes: baz
body:
foo2: bar
foo3: baz
nullValue: null
matchers:
body:
- path: $.foo2
type: by_regex
value: bar
- path: $.foo3
type: by_command
value: executeMe($it)
- path: $.nullValue
type: by_null
value: null
headers:
- key: foo2
regex: bar
- key: foo3
command: andMeToo($it)
我个人还是比较倾向于使用yaml,主要还是因为yaml语法比较简单,同时,对于90%的契约,其实都是简单型契约,很少会遇到复杂的使用场景,如果你要写一个特别复杂的契约,可能你就需要好好想想如何简化这个契约了。
契约只要组成部分就是 request(method,url,body,headers),response(status,body),我们比较常用的方式是 将request的body和response的body定义成2个json文件,然后,使用fromFile方法直接引用。
groovy 写法
import org.springframework.cloud.contract.spec.Contract
Contract.make {
request {
method('PUT')
headers {
contentType(applicationJson())
}
body(file("request.json"))
url("/1")
}
response {
status OK()
body(file("response.json"))
headers {
contentType(textPlain())
}
}
}
yaml写法
request:
method: GET
url: /foo
bodyFromFile: request.json
response:
status: 200
bodyFromFile: response.json
request.json
{ "status" : "REQUEST" }
response.json
{ "status" : "RESPONSE" }
附上源码:https://github.com/huleTW/spring-contract-yaml-demo/tree/master
Spring Cloud Contract简介的更多相关文章
- Spring Cloud Contract
http://www.infoq.com/cn/news/2017/04/spring-cloud-contract 在默认情况下,我们希望用户以JAR文件的形式将生产者存根和契约发布到Maven库. ...
- Spring Cloud Contract 微服务契约测试
简介 使用场景 主要用于在微服务架构下做CDC(消费者驱动契约)测试.下图展示了多个微服务的调用,如果我们更改了一个模块要如何进行测试呢? 传统的两种测试思路 模拟生产环境部署所有的微服务,然后进行测 ...
- SpringCloud升级之路2020.0.x版-21.Spring Cloud LoadBalancer简介
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford 我们使用 Spri ...
- Spring Cloud Eureka简介及原理
Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务.Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务 ...
- 我们为什么要使用Spring Cloud?简介
转载:https://blog.csdn.net/smallsunl/article/details/78778790 单体架构 在网站开发的前期,项目面临的流量相对较少,单一应用可以实现我们所需要的 ...
- Spring Cloud 模块简介2
前面一篇文章谈到微服务基础框架,而Netflix的多个开源组件一起正好可以提供完整的分布式微服务基础架构环境,而对于Spring Cloud正是对Netflix的多个开源组件进一步的封装而成,同时又实 ...
- Spring Cloud 模块简介
Spring Cloud Netflix对微服务的支持还有: Hystrix: 断路器和资源隔离 Feign: 声明式HTTP REST请求客户端 Ribbon: 与Eureka结合实现软负载均衡 Z ...
- spring cloud要点简介及常用组件
spring cloud基于spring boot spring cloud是通过包装其他技术框架实现的,例如OSS组件,实现了一套通过基于注解.java配置和基于模板开发的微服务框架. spring ...
- spring cloud alibaba 简介
### Spring Cloud Alibaba [官方github地址](https://github.com/alibaba/spring-cloud-alibaba) Spring Cloud ...
随机推荐
- 网络安全专家教你设置史上最安全的WiFi密码
通过设置强密码可以防止WiFi被蹭网现象的发生,保证WiFi网络安全.那么我们的WiFi密码怎么设置才最安全呢? 提供以下设置建议: 1.WiFi密码设置尽量使用字母.数字和字符组成的密码.这种密码强 ...
- NOIP2011提高组 Day1 T3 Mayan游戏
题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步 ...
- 【leetcode】1046. Last Stone Weight
题目如下: We have a collection of rocks, each rock has a positive integer weight. Each turn, we choose t ...
- Django2 + python3 上传图片
. ├── db.sqlite3 ├── manage.py ├── myImg │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init_ ...
- 求超大文件上传方案( Java )
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- java扫描仪上传文件
问题: 项目中有一个功能,原来是用ckfinder做的,可以选择本地图片上传至服务器,然后将服务器的图片显示在浏览器中,并可以将图片地址保存到数据库:现在客户觉得麻烦,提出连接扫描仪扫描后直接上传至服 ...
- 【HDOJ6686】Rikka with Travels(树形DP)
题意:给定一棵n个点,边权为1的树,求有多少个有序数对(l1,l2)使得存在两条互不相交的路径,长度分别为l1和l2 n<=1e5 思路: #include<bits/stdc++.h&g ...
- 关于JS的面向对象的思考和总结
面向对象编程的概念和原理 1.面向对象编程是什么 它是用抽象的方式创建基于现实世界模型的编程模式(将数据和程序指令组合到对象中) 2.面向对象编程的目的 在编程中促进更好的灵活性和可维护性,在大型软件 ...
- 给网页标题添加icon小图标
so easy: 给网页标题添加icon小图标: 直接在html文件的head部分添加下面代码(注意href的路径): <link rel="icon" type=" ...
- CSU 1553 Good subsequence(RMQ问题 + 二分)
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n nu ...