契约测试只能验证返回值类型和格式吗

是的
既然如此,它的意义在哪里呢?我就是带着这样的疑问进了现在的项目组 - API, Application Programming Interface

在解释这个回答之前,让我们先来回顾两个测试问题:

为什么单元测试需要Mock?

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法

如果容易构造且获取,那就可以不用Mock而直接用于测试中了。而且单元测试的目的是为了测试自己的函数功能,

为什么需要集成测试?

集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。

文中指的就是将两个模块组装成子系统的简单集成测试。

仔细想一下,如果是单元测试Mock+集成测试好像就可以解决很多外部服务依赖问题了,但这里有个问题,Provider如何知道自己的实现满足了Consumer的需求呢?

契约测试

在Martin Fowler的ContractTest中,了解到契约测试要解决的痛点是 - 减少双方约定的契约(API文档)有非预期的破坏

在Pact的实践中,相当于有两个Mock Service,一个是Mock Provider,另一个是Mocker Consumer。


Pact Interaction.png

当Consumer端写测试时,用的是Mock Provider,这跟通常意义下的Mock Server是一个意思,即针对固定请求,返回使用的最小Response,也就是说,你不关心的字段可以不用测试,只返回自己需要的内容,同时生成契约并放到公有的地方,这里Pact用到的是Broker。

Provider Verification.png

接着,Provider端会将契约从公有地Broker上拿下来,由Mock Consumer将契约中的请求发给真正的Provider,并验证真正的返回结果和契约中预期的返回结果是否匹配,并将结果回传至broker。可能只有类型、格式和数量的校验,但也足够了,其他的细节测试可以有Provider的功能测试来覆盖。

Broker中会收集Consumer端share过来的契约,也是一个展示Verify结果的地方。


Pact Broker.png

其中Latest pact published是Consumer最近的一次发布的时间,Last Verified是Provider端最近的一次verification的时间

当broker中verify的结果有失败时,Consumer和Provider双方都需要警觉了,肯定是契约被某一方破坏了,或者Consumer的需求变了,或者是实现变了,或者是人为的错误,但Pact的目的是发现问题并达成一致,从而继续推进。

理想情况下,如果Consumer需求有变动就先去找Provider商量,或者Provider端有升级前找各Consumer协商,就不会发生问题了,测试的核心是以防万一,在万一发生的情况下,如何快速知道已经出错,并快速制定解决方法而不至于导致更坏的结果。

在解释了单元测试、集成测试和契约测试之后,我们来看看不同,

单元测试 (简单的)集成测试 契约测试
目标 构造数据,测试自己某个模块的功能是否正常 调用外部服务API,测试是否能正常连接 双方校验,任何一方发生变动,既契约的被破坏,都会警觉
范围 单元测试是模块的自测,可以写在任何地方,不管是Consumer还是Provider,不管是前端还是后端 集成测测试是测试下游服务能否调通,无论Cosumer还是Provider都有下游服务,都可以有集成测试,测试的是不同的东西 发生在服务和服务之间,但测试和维护的都是同一个东西,且有反馈

场景1

团队在做API,供整个企业之后使用,他们需要构建监控,日志,登录,购买商品,支付等服务。

其中,如果监控和日志这些是用微服务自己做,那就可以使用契约测试,其他服务会消费它
如果登录,支付这些集成第三方的成熟的身份认证系统,或支付系统,就可以使用集成测试。

场景2

团队在做API,供整个企业之后使用,他们需要构建监控,日志,登录,购买商品,支付等服务。

同样的场景,如果所有的服务都是自己来构建,那就可以使用契约测试将所有的服务都管理起来。

场景3

大厂提供API供很多企业使用。通常会比较稳定,鲜少会改变。

如果想引入契约测试,Consumer端需要提供契约,Provider端需要构建Broker和进行验证测试。

误区一
契约测试的理想国是Provider端不需要写测试,所有Consumer的用例总和构成了Provider端测试的全部集合。这句话的弊端就在于provider端太寄希望于Consumer了,这就相当于让测试相信开发一样,不是说开发不可信,是以防万一。

误区二
曾经觉得,可以将契约测试中的Consumer测试结合到一起,既替换单元测试中的Mock。却忽略了单元测试在测试金字塔中是属于最底层的,代价小,效率高,所以case覆盖会很多,如果与契约测试结合到一起,会造成冗余及滥用

写在最后

回到最初的问题,确实契约测试的验证会比较简单,但它的优势就是监督双方或多方,在问题发生时,触发沟通或交流来达成一致,从而避免真正的问题发生,它的出现不是为了取代谁,而是关注点的不同 - 关注契约关注双方。

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

推荐阅读更多精彩内容

  • 如今,契约测试已经逐渐成为测试圈中一个炙手可热的话题,特别是在微服务大行其道的行业背景下,越来越多的团队开始关注服...
    ariman阅读 12,407评论 28 33
  • 背景 在当前微服务和前后端分离大行其道的行业背景下,越来越多的团队采用了前后端分离和微服务的架构风格。该服务架构下...
    博客已迁移I米阳阅读 24,335评论 2 18
  • 正如大家所知,最初QA都是手动执行测试用例,开发人员每修改一个版本,QA就要手动测试一遍,随着功能的不断增加,手动...
    ThoughtWorks阅读 2,795评论 1 18
  • 本文说的集成测试是指系统集成后的自动化测试。(也可以说是系统端对端的集成测试) 是的,最初QA都是手动执行测试用例...
    李春辉阅读 1,053评论 2 12
  • 什么是契约 如果从契约产生的阶段来说,现有资料表明最早要追溯到西周时期的《周恭王三年裘卫典田契》,将契约文字刻写在...
    ThoughtWorks阅读 2,910评论 1 12