干货时间:聊聊DevOps下的技术系列之契约测试
摘要:本期和大家简单聊聊在服务交互场景下使用服务契约的重要性,以及契约管理的必要性,最后简单介绍了下契约测试。
1、服务交互带来的问题
在上一篇文章中,我们系统的列举了DevOps各个流程中常用的测试技术。
接着上一篇的图,我们简单画下一个系统应用的内部服务的调用关系:交付一个大的系统可能涉及到多家ISV进行集成,每家ISV自己又存在前端、网关、后端等多个微服务,且各自ISV或者服务均存在自己的SE、开发和测试人员,都有自己相对独立的版本演进,服务之间存在调用关系。

思考一下,这会带来哪些问题呢?
- 通过接口文档或者表格管理接口内容,服务交互双方、多方频繁对接交互调用的接口信息,频繁刷新,剪不断、理还乱,让人崩溃。
- 服务依赖导致必须等待底层服务先开发完成才能联调对接和集成测试,效率低下;
- 此时如果发现被调用服务接口不满足要求、接口缺失、接口无法联调等问题时,需要重新等待版本联调,造成资源和时间上的浪费;
- 服务都在不停的向前演进,调用服务与被调用服务的版本会随着外部需求增加、Bug修改、代码重构等等因素而导致接口发生变更,接口调用服务往往无法及时获取接口变化而导致整体业务受损。
2、服务契约--服务交互问题的一种解决方案
如何解决服务间纷纷复杂的联调问题呢?本章节我们来聊一聊契约与契约测试。
顾明思义,契约就是一份由双方或多方共同订立的、具有强制遵从性的信用文书。契约测试全称消费者驱动契约测试(Consumer Driven Contracts Testing),最早见于2011年。“消费者驱动契约测试”名称中清楚描述了“契约”、“谁提供契约”的问题。
一般来说,是消费者(Consumer)把自己对输入和输出的数据结构、性能已经并发性等期望以约定的格式告诉服务提供者(Provider),服务提供者签署同意,这就形成了一份服务契约,服务提供者对所有消费者的契约取并集进行服务能力开发,形成自己服务的对外承诺或者schema。

模型如下:消费端服务 A、B、C 调用访问服务提供端服务A,消费端服务 A、C服务提供端服务B。服务提供端会根据消费端期望分别生成1份契约文件,以满足消费端的诉求。

服务之间通过契约交互会带来哪些好处呢?
1)、使用契约,接口调用双方的对接、问题定界等都有“法律依据”,问题不会扯不清、道不明、来回甩锅。
2)、使用契约,就确定了交付双方的接口形式和入口与出口期望,消费端和服务提供端可以并行开发服务,并且在开发过程中就利用契约进行预集成测试,不需要等待联调再来集成测试,大幅降低联调沟通成本。
3)、因为契约的存在,可以整体看到服务消费端的原有接口使用情况,让接口的变动有迹可循,即使变动也可以确保变动的安全性和准确性。
4)、消费端也能通过契约的变化获知服务端的API变化情况
3、契约交互的问题
在第二章节我们看到契约的基本流程。在正常的契约测试流程中,契约由消费者提供,服务者遵从,根据消费者的提供的契约完成服务测试。但是,大家思考下这种模式存在什么样的问题?我们思考下一下的问题:
- 双方的契约有了,但是口头协议空口无凭,契约如何存储,以及如何才能防篡改?
- 邮件交互、会议纪要难以维护?
- 在敏感市场,消费者提供的契约是否符合正常诉求与合规?
- 在多ISV服务商、多部门协作的应用系统,消费者频繁刷新契约要求怎么办?
- 正常需要刷新契约怎么处理、契约怎么会退或者回溯?
- 消费端驱动,会不会造成消费端权力过大,话语权过重,倒逼服务提供端,最终也会导致整个系统不伦不类?
从上面的几个问题可以看出,由于契约很重要,那么设计和管控契约也就显得更加重要。
4、契约设计与契约管理的必要性
交互的问题并不像想象的那边简单,为了解决契约设计和管控的问题,我们新增一个设计管控和契约管理的环节。
设计管控环节类似于议会这种机沟通和决策机构,用于调停和审视契约的合理性、合规性和更改的必要性,且对于多消费者的契约做合并处理。
契约管理环节,解决契约存储、访问认证和不可篡改性、可追溯性和可回退等问题。这样就避免了前面所说的问题,当然牺牲了一定了灵活性,但是在大型系统中,这样行为是值得的。
我们看下,消费者的契约的生成和下载过程就变成如下流程:

同时,如果服务端要主动变更契约,也要得到消费端和审视委员会的通过,审核通过合入后,消费者和服务提供者从契约管理平台下载契约使用。流程变得如下:

5、契约测试
前面的章节,我们花了较多篇幅介绍了契约的生成和契约在服务交互过程中的作用以及重要性,那么对契约的测试也很重要。下面我们简单聊聊如何对契约进行测试。
契约测试不是组件测试,契约测试和核心也是通过API来进行。每个消费者只会关注自己的期望是否得到满足,所以只需要根据自己提供的、已审核通过的契约文件进行测试。而服务提供端则需要满足所有消费者的诉求,需要拿所有消费者的契约做测试,所有契约需要测试通过。如下所示:

由于实际开发中,契约签订之后,Consumer和Provider是同步开发,所以Consumer和Provider也是分别测试。一般的契约测试过程如下:
Consumer服务的测试环境,需要使用契约进行Mock Provider服务进行构建:

Provider服务的测试环境,则需要根据和Consumer签署的契约文件生成的契约测试用例进行测试,通过测试契约用例验证自己提供的接口是否满足消费者需要,接口是否有变更。一旦接口发生变更,契约测试用例会执行失败。

前面所述,契约是消费者(Consumer)把自己对输入和输出的数据结构、性能已经并发性等期望以约定的格式告诉服务提供者(Provider),服务提供者签署同意后形成的,那边契约测试的主要内容也便是这几个方面:

支持契约测试的工具有Pact、Pacto、Janus、CloudTest,Swagger也能满足部分要求。一般来说,业界使用Pact工具的较多,简单说下Pact工具的过程,具体Pact用法请参照官网:
Consumer测试:

Provider测试:

我们也补充下Pact工具的优缺点

6、微服务下的服务契约样例
契约一般是一个yaml文件或者json文件的格式,我们以CSE微服务的契约为展示样例:


结语:本期和大家简单聊聊在服务交互场景下使用服务契约的重要性,已经契约管理的必要性,最后简单介绍了下契约测试。契约测试工具用法的指导文档较多,本篇没有做展开。DevOps下,契约测试也是需要集成到流水线中,欢迎下来继续交流。
本文分享自华为云社区《聊聊DevOps下的测试技术(2)聊聊契约与契约测试 》,原文作者:柳哥说 。
干货时间:聊聊DevOps下的技术系列之契约测试的更多相关文章
- CODING DevOps 系列第五课:微服务测试——微服务下展开体系化的微服务测试
微服务测试的痛点与挑战 这张图可以形象地展示单体服务和微服务的对比,单体应用就像左边巨大的集装箱,软件模块和应用都包括其中:而微服务就像是由一个小集装箱组成,微小的服务组成一个庞大.完整的系统.单体服 ...
- 9.Java 加解密技术系列之 RSA
Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项 ...
- DevOps 工程师成长日记系列四:打包
原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-4-packag ...
- DevOps 工程师成长日记系列二:配置
原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-2-config ...
- DevOps 工程师成长日记系列一:必备知识与技能组合
原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-366097df7737 ...
- 【腾讯优测干货】看腾讯的技术大牛如何将Crash率从2.2%降至0.2%?
小优有话说: App Crash就像地雷. 你怕它,想当它不存在.无异于让你的用户去探雷,一旦引爆,用户就没了. 你鼓起勇气去扫雷,它却神龙见首不见尾. 你告诫自己一定开发过程中减少crash,少埋点 ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证
上一篇:Window Azure ServiceBus Messaging消息队列技术系列2-编程SDK入门 http://www.cnblogs.com/tianqing/p/5944573.ht ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化
在上一篇中,我们介绍了消息的顺序收发保证: Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证 在本文中我们主要介绍下复杂对象消息是否需要支持序列 ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列5-重复消息:at-least-once at-most-once
上篇博客中,我们用实际的业务场景和代码示例了Azure Messaging-ServiceBus Messaging对复杂对象消息的支持和消息的持久化: Azure Messaging-Service ...
- 1.Java 加解密技术系列之 BASE64
Java 加解密技术系列之 BASE64 序号 背景 正文 总结 序 这段时间,工作中 用到了 Java 的加解密技术,本着学习的态度,打算从这篇文章开始,详细的研究一番 Java 在加解密技术上有什 ...
随机推荐
- 【matplotlib 实战】--漏斗图
漏斗图,形如"漏斗",用于展示数据的逐渐减少或过滤过程.它的起始总是最大,并在各个环节依次减少,每个环节用一个梯形来表示,整体形如漏斗.一般来说,所有梯形的高度应是一致的,这会有助 ...
- Splay 详细图解 & 轻量级代码实现
学 LCT 发现有点记不得 Splay 怎么写,又实在不知道这篇博客当时写了些什么东西(分段粘代码?),决定推倒重写. 好像高一学弟也在学平衡树,但相信大家都比樱雪喵强,都能一遍学会!/kel 写在前 ...
- Linux运维技能图谱
前言 该技能图谱依个人经验绘制,不适用于所有运维岗位.对于刚入行的从业者,也不需要按照图谱全学一遍,应该根据岗位工作内容来学习.有些技术我也不会,但作为一个选项我也写进去了,比如容器运行时有Docke ...
- Chromium Canvas工作流
blink 中实现了2种 canvas,分别是 blink::HTMLCanvasElement 和 blink::OffscreenCanvas ,前者对应 html/dom 中的 canvas,后 ...
- 优雅设计之美:实现Vue应用程序的时尚布局
前言 页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式.如果使用的是Nuxt,则可以提供开箱即用的优雅解决方案.然而,令人遗憾的是,在Vue中,这些问题并未得到官方文档的解决. 经 ...
- Android 面试知识总结
Android知识点 1. 四大组件 分别是Activity.Service.ContentProvider.BroadcastReceiver. Activity称为活动,属于展示型组件,主要负责显 ...
- 🔥🔥Java开发者的Python快速进修指南:自定义模块及常用模块
好的,按照我们平常的惯例,我先来讲一下今天这节课的内容,以及Java和Python在某些方面的相似之处.Python使用import语句来导入包,而Java也是如此.然而,两者之间的区别在于Pytho ...
- C# 对象与JSON字符串互相转换
一.JSON字符串转对象(反序列化) 1.使用Newtonsoft.Json 反序列化字符串转换为指定类型 (T) JsonConvert.DeserializeObject<T>(jso ...
- Http的演进
Http的演进 Http在1.1版本之前具有无状态的特点,每次请求都需要通过TCP三次握手四次挥手与服务器重新建立连接.比如某个客户端在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户请求 ...
- 一行代码修复100vh bug | 京东云技术团队
你知道奇怪的移动视口错误(也称为100vh bug)吗?或者如何以正确的方式创建全屏块? 一.100vh bug 什么是移动视口错误? 你是否曾经在网页上创建过全屏元素?只需添加一行 CSS 并不难: ...