版權(quán)聲明:本作品采用【知識(shí)共享署名-非商業(yè)性使用-禁止演繹 4.0 國(guó)際許可協(xié)議】進(jìn)行許可。
一段時(shí)間以來研究和實(shí)踐契約測(cè)試,發(fā)現(xiàn)如過去大家對(duì)于單元測(cè)試染坯、集成測(cè)試丘逸、端到端測(cè)試等等測(cè)試?yán)斫獠灰恢乱粯又俪^大多數(shù)情況下都把契約測(cè)試?yán)斫饣驊?yīng)用錯(cuò)了湃鹊。
為了統(tǒng)一認(rèn)知怀愧,寫了個(gè)簡(jiǎn)介余赢,以求被拍磚和拍人。
目的(解決的問題)
契約測(cè)試是一種以自動(dòng)化測(cè)試作為技術(shù)手段扛拨,解決團(tuán)隊(duì)間因存在明顯溝通邊界鬼癣,由溝通不暢和代碼變更而造成的系統(tǒng)間接口不匹配問題的最佳實(shí)踐待秃。
原理
通過測(cè)試驅(qū)動(dòng)生成服務(wù)間的契約文檔,利用該契約文檔和Mock Server(銀行業(yè)常稱之為“擋板”)分別對(duì)契約的消費(fèi)者和提供者進(jìn)行自動(dòng)化測(cè)試暖庄,以確保雙方能夠按照契約實(shí)現(xiàn)滿足規(guī)格要求的接口培廓,并利用持續(xù)集成流水線實(shí)現(xiàn)對(duì)雙方變更影響的快速反饋肩钠。
原則
- 快速反饋
- 契約測(cè)試應(yīng)當(dāng)聚焦對(duì)于接口規(guī)則的驗(yàn)證价匠,能夠易于編寫踩窖,快速運(yùn)行洋腮,最簡(jiǎn)驗(yàn)證。所以通常采用測(cè)試替身(Test Double)來代替集成組件加快運(yùn)行速度(速度與單元測(cè)試相當(dāng))滤灯。
- 測(cè)試運(yùn)行時(shí)使消費(fèi)者與提供者解耦(分別運(yùn)行測(cè)試)
- 對(duì)于接口的功能驗(yàn)證鳞骤,應(yīng)當(dāng)由接口集成測(cè)試來保證豫尽。
- 對(duì)于系統(tǒng)間的協(xié)作驗(yàn)證美旧,應(yīng)當(dāng)由系統(tǒng)間集成測(cè)試榴嗅,或端到端測(cè)試來保證。
- 消費(fèi)者驅(qū)動(dòng)設(shè)計(jì)優(yōu)于提供者驅(qū)動(dòng)設(shè)計(jì)
- 符合需求拉動(dòng)和簡(jiǎn)單設(shè)計(jì)思想绪励,減少冗余設(shè)計(jì)疏魏。
適用場(chǎng)景 / 條件
- 契約測(cè)試屬于進(jìn)階自動(dòng)化測(cè)試實(shí)踐大莫,團(tuán)隊(duì)需具備基本的自動(dòng)化測(cè)試和持續(xù)集成實(shí)踐能力,并了解微服務(wù)基本知識(shí)和概念懈凹。
- 系統(tǒng)間采用松耦合的通訊和開發(fā)方式介评,例如HTTP+JSON们陆。而非緊耦合的通訊和開發(fā)方式坪仇,例如共享接口文件的RPC類框架椅文。
- A團(tuán)隊(duì)與B團(tuán)隊(duì)間存在明顯的溝通邊界皆刺,但二者均可控(可采用統(tǒng)一實(shí)踐并堅(jiān)持)。
- 提供者提供的接口被多個(gè)消費(fèi)者消費(fèi)凌摄,需要快速反饋代碼變更所造成的影響羡蛾。
前置知識(shí)與能力
- 自動(dòng)化測(cè)試基礎(chǔ)
- 單元測(cè)試
- 集成測(cè)試
- 端到端測(cè)試
- 測(cè)試替身
- 簡(jiǎn)單設(shè)計(jì)(增量式設(shè)計(jì))/ 測(cè)試驅(qū)動(dòng)開發(fā)
- API測(cè)試方法
- 版本控制
- 持續(xù)集成 / 持續(xù)交付
- 微服務(wù)
可用工具
-
Pact(推薦)
- 消費(fèi)者驅(qū)動(dòng)
- Pact Specification 契約規(guī)范 + 多技術(shù)棧實(shí)現(xiàn)
- 基于JSON的契約文件
- 支持HTTP+JSON的接口實(shí)現(xiàn) / 消息隊(duì)列
-
Spring Cloud Contract
- 提供者驅(qū)動(dòng) / 消費(fèi)者驅(qū)動(dòng)
- JVM + Spring 技術(shù)棧,可與Pact Broker集成
- 基于JAR的契約文件
- 支持HTTP+JSON的接口實(shí)現(xiàn) / 消息隊(duì)列