关于契约测试的粒度你怎么看

前言

本文源于一次关于处理契约测试在CI上更新的小讨论。仅抛砖引玉,期待更多地讨论和建议。

上下文铺垫

契约测试多用于微服务架构,当不同服务之间需要互调API时,传统测试无法覆盖,需要通过制定一个类似通信协议(这里叫契约)来确保内部服务正常通信。契约测试会测试外部服务的边界,以查看服务调用的输入输出,并测试该服务能否符合契约预期:作为数据的生产者,需要确保其提供的数据能够符合消费者的要求。作为数据的消费者,需要确保从生产者获取数据后,能够有效地被处理。

  • 角色:消费者(Consumer) & 生产者(Provider)
  • 思想:Consumer Driven (需求驱动)
  • 具体实现:Consumer 端提供一个类似“契约”的东西(如json 文件,约定好request和response)交给Provider 端,告诉Provider 有什么需求,然后Provider 根据这份“契约”去实现。
为了更好地理解,我们来举个栗子。

小明的妈妈让小明去超市帮她买东西,同时她列了一份购物清单给小明。小明拿着这份购物清单去超市把清单上的东西都买了回来给妈妈。

标重点 购物清单就是小明和妈妈之间的契约,消费端是小明的妈妈,她提供了契约,生产端是小明,他根据这份契约去实现。

事情是这样的

A:小二,上图!记得加五毛钱特效啊!
B:图来喽!

Basic CI.png
简单标下重点:A ,B两个服务,独立在CI部署,A对B有依赖。现在CI上A的版本是1.0, B是2.0,远端有一个中央仓库存储了A,B之间最近成功版本的契约。对于A,B的每次版本升级,在跑CT的时候都要去仓库取上一个版本对应的契约跑测试,保证该次变化对于上个版本的需求是兼容的。
A,B一直相安无事,突然有一天,程序员小衰接到一个需求,要改B服务的某个API(该API被A服务消费,A,B之间已经存在相互约束的契约),需求很简单,天真烂漫地小衰在本地契约测试顺利跑过之后,顺手提交了B服务的CI。挖了个去,瞬间CI变成了酱紫。
CI 卒.png

小衰有点紧张,心中默念提交十四字法则:新加先提生产端,删除先提消费端。于是被故事选中地悲催小衰眉头一皱,发现不管A,B间的提交顺序,CI到底都是要挂的,因为这道题超纲了!

由于A,B已有的契约约束,当A需要B更新其API时,是先提交A的契约,还是更改B的功能到最新版本?如果只是单纯字段的增删,提交十四字法则是可以保障的。比如,A做为消费端,需要增加一个字段,这时候我们先提交B,新版本B从远端仓库拿到旧的契约,发现还是满足之前的约定,新版本的B被更新到远端仓库。我们再提交新版本的A,A从远端仓库拿到新版本的B,一经验证是我想要的,A再被更新到远端仓库。
但是小衰就没有这么幸运了,因为测试基础设施的限制,同时由于契约测试粒度过细,A,B之间的契约约定了某数组结构具体的数据值,其数据值的更改,导致契约测试就过不了。最后在现有中央仓库约束的机制下为了让CI过,还得在生产端保证旧的API不变,创建一个新的API,先提交,然后在消费端更新契约文件并把原来API的调用指向生产端的新API,最后生产端还得把旧API的更新为新API,消费端再把调用指回旧的API。显然是多了很多成本的。

那么问题来了

显然小衰遇到的问题比较特殊,但由此引发了思考,我们契约测试到底该测些什么,它的测试粒度怎么取舍?
现在的模式是消费端A通过Pact把mock数据变成一份json契约文档,生产端B把json传入测试,通过构建数据来验证契约是否满足,验证过程要求每个字段的值必须匹配。但实际上这些数据也只是消费端mock的假数据,对于我生产端,还有必要挨个字段值验证嘛,还是说我只需要验证每个字段的类型是消费端想要的就好了,具体什么值我也根本不关心?

我个人的理解是业务逻辑在单元测试完全可以覆盖,契约测试更倾向测服务间的协议地连通,我消费端提供了一份我需要的数据的结构,那我生产端验证能够造出这个结构的数据即可,具体业务,不该由我来承担,职责很清晰。
当然纯属个人见解,接触契约测试几个月,可能理解上存在一些偏差。

期待拍砖,欢迎讨论!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,550评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,226评论 25 707
  • 借钱的情况千万种,但概况起来就两类:一是“穷”;二是“缺流动资金”。对于王文伟这样的生意人来说,借钱确是常态。 “...
    b7ac267825cd阅读 779评论 0 1
  • 本文主要对我们最常用到的apt包管理器做相关介绍。 安装应用 这个就不做多解释了,就是安装一个应用,大家都是入门了...
    小豪丶阅读 649评论 0 2
  • 刚看完了这部众口皆碑的《釜山行》,不知是否受了之前评论的影响,但单纯从内心来说,是一部震撼心灵的好电影!我...
    MrSandman_阅读 230评论 0 2