精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊契約測試

開發 開發工具
契約測試不是銀彈,它不是替代E2E測試的終結者,更不是單元測試的升級換代,它更偏向于服務和服務之間的API測試,通過解耦服務依賴關系和單元測試來加快測試的運行效率。

一、什么是契約

如果從契約產生的階段來說,現有資料表明最早要追溯到西周時期的《周恭王三年裘衛典田契》,將契約文字刻寫在器皿上,就是為了使契文中規定的內容得到多方承認、信守,“萬年永寶用”。所以訂立契約的本身,就是為了要信守,就是對誠信關系的一種確立。誠信,是我國所固有的一種優良傳統,也是延續了幾千年的一種民族美德,在中國儒家的思想體系里,是倫理道德內容中的一部分。

[[232064]]

《現藏于臺北故宮博物院》

現實真的是那么美好嗎?小時候的價值觀教育未能改變社會的現狀,缺少契約精神的案例卻比比皆是。

那么,契約真的要消失了嗎?不盡然,在軟件測試領域,我們又重新拾起了契約這把利器。

二、發展歷程

接下來讓我們回顧一下契約測試的起源和發展歷程:

假設我們有這樣一個場景:A團隊負責開發API服務,B團隊進行API調用消費服務。

為了保證API的正確性,我們會對外部系統的API進行測試(除非你100%相信外部系統永遠正確和保持不變),這很可能就會導致一個問題,當外部系統并不那么穩定或者請求時間過長時,就會導致我們的測試效率很低,并且穩定性下降。比如當外部API掛掉導致測試失敗時,你并不能完全確信是API功能被更而改導致的失敗還是運行環境不穩定導致的請求失敗。

最初,解決這個問題的方案是構建測試替身(Test Double),通過模擬外部API的響應行為來增強測試的穩定性和反應速度。實現手段是在測試環境中搭建一個模擬服務環境,通過設定一些請求參數來返回不同的響應內容,然后再被內部系統調用,來保證調用端的正確性。構建模擬環境時我們可以使用幾種不同的測試手段,如Dummy,Fake,Stubs,Spies,Mocks等。可是,問題又來了,如果使用測試替身那如何能保證外部系統API變化時得到及時的響應,換句話說,當內部系統測試都通過的通過時,如何能保證真正的外部API沒有變化?

一個比較簡單的方式是部分測試使用測試替身,另外一部分測試定期調用真實的外部API,這樣既保證了測試的運行效率、調用端的準確性,又能確保當真實外部系統API改變時能得到反饋。

是不是到這里就皆大歡喜了呢?

如果劇情到這里就結束的話,未免太過俗套。這個方案最大的缺陷在于API的反應速度,真實外部API的反饋周期過長,如果減少真實API測試間隔時間就又會回到文章最開始的兩難境地。

那么如何解決這個問題呢?先來讓我們剖析一下前面幾種解決方案的共通點。

在上面的場景中,我們都是已知外部API功能來編寫相應的功能測試,并且使用直接調用外部API的方式來達到驗證測試的目的,這樣就不可避免的帶來兩個問題:

  • 第一,服務消費方對服務提供方API的更改是通過對API的測試來感知的。
  • 第二,直接依賴于真實API的測試效果受限于API的穩定性和反映速度。

解決方式首先是依賴關系的解耦,去掉直接對外部API的依賴,而是內部和外部系統都依賴于一個雙方共同認可的約定—“契約”,并且約定內容的變化會被及時感知;其次,將系統之間的集成測試,轉換為由契約生成的單元測試,例如通過契約描述的內容,構建測試替身。這樣,依賴契約的測試效率優于集成測試,同時契約替代外部API成為信息變更的載體。

對于契約來講,行業內比較成熟的解決方案是基于YAML標記語言的Swagger Specification(OpenAPI Specification),或者是基于JSON格式的Pact Specification。

通常的做法是API的提供者使用“契約”的形式,將功能發布在公共平臺,給調用方進行說明和參考,這里我們可以暫時稱之為Provider-Driven-Contract。這種做法的潛在問題是,功能提供方的API返回內容是否都滿足所有API調用者的需求不得而知。所以,針對這個問題,依賴關系再一次反轉,契約測試就搖身一變成為了Consumer-Driven-Contract test(CDCT), 通過給API提供方提供契約的形式,來完成功能的實現。

難道CDCT成為了問題終結者嗎?請聽后面分解。

注: 契約測試其中一個的典型應用場景是內外部系統之間的測試,另一個典型的例子是前后端分離后的API測試,這里不做過多展開。

三、契約測試的維度

1. 測試覆蓋范圍對比(縱向)

  • 單元測試:對軟件中的基本組成單位的測試,大多數是方法函數的測試,運行速度快。
  • 契約測試:對服務之間的功能進行的測試,運行速度基本與單元測試相同。
  • E2E 測試:對系統前后端或者不同系統之間的集成測試,大多通過模擬UI操作的方式實現,運行速度三者之中最慢。

2. 測試效率對比(橫向)

環境依賴:

  • 單元測試:程序集
  • 契約測試:程序集、依賴契約文件、虛擬路由服務
  • 端到端測試:程序集、真實路由服務、前端UI
  • 運行速度: 單元測試 > 契約測試 > 端到端測試

Pact官方給出的幾個場景:

適用場景:

  • 團隊能把控開發過程中的Consumer和Provider端
  • 適合Consumer驅動開發的場景
  • 對于每個獨立的Consumer端,Provider端都能管理好需求。

不適用的場景:

  • 公共API或者是OAuth授權服務
  • Provider端和Consumer端沒有良好的溝通渠道
  • 針對性能的測試
  • Provider端的功能性測試(Pact只測試內容和請求格式)
  • 對于不同輸入有相同的輸出,并未達到驗證的目的
  • 當前測試輸入需要依賴之前測試返回的結果

以上對比說明契約測試所要解決的問題是替代系統之間的集成測試,通過契約和單元測試的方式加速系統運行。同時也說明契約測試存在一些不適用的場景,要依據使用場景區別對待。契約測試沒有取代單元測試以及E2E測試。

四、契約測試與CD的整合

最開始,我們的pipeline是這樣的,單元測試是獨立的測試,當通過單元測試后運行集成測試。此時集成測試成為了系統瓶頸,而且一旦集成測試失敗,就必須被迅速修復,其他pipeline只能等待其修復,否則任何新的變更都會測試失敗。

一個解決辦法是將集成測試分散在每個pipeline上,每次集成測試運行的版本是當前的最新代碼和其他系統的上一次通過版本之間的測試。這樣解決了測試的獨立性以及不會阻礙其他pipeline測試的效果,然后將通過測試的不同系統的package按照版本保存。但是這樣一來,集成測試的缺點就更為明顯提現出來,第一是系統部署時間長,每次集成測試需要運行同樣的測試在不同pipeline上,增加了測試成本和反饋周期。

接下來,我們使用契約測試替代集成測試。這樣有幾點好處不僅解決了獨立測試的目的,同時解決了集成測試慢和部署時間長等問題。

為了保證契約測試的正確性,契約文件由Consumer端生成,然后Provider端來實現API,我們使用CDCT來改造我們的pipeline。

我們先假設B系統希望A系統提供新功能,如果按照圖中黃色步驟來提交的話,則會測試失敗,原因在于此時,契約文件是最新的B-A.consumer.1.1.pact與之對應A-B.provider.1.0.jar不是最新的,所以測試失敗。

按照圖中步驟2運行,當提交A的pipeline時,當前版本的A已經升級到1.1,而契約文件還是1.0版本,沒有break測試的情況下,最終將A-B.provider.1.1.jar提交到服務器上。

 

然后按照圖中步驟3運行,A-B.provider.1.1.jar和B-A.consumer.1.1.pact完美契合,最終又將B-A.consumer.1.1.pact提交到服務器。所以,改成CDCT之后,雖然產生了一定的提交順序依賴,但是帶來的更多的好處是確保契約文件的產生是調用端提出,并且保證當前最新,確保系統的正確性。

喜歡思考的同學不難發現,CDCT存在自身的缺陷,一個簡單的例子是當B存在一個已有的契約約束A的一個功能,當B需要A更新其API時,是先提交B的契約測試,還是更改A的功能到最新版本?其實二者都不可行。

解決辦法萬變不離其宗,就是大家熟悉的不能再熟悉的重構心法,由王建總結的十六字箴言:

[[232073]]

我們分五步來完成API的更新:

  • Provider端提交一個新的API來保證新功能,同時舊的API功能不變,提交并通過測試。
  • 將Consumer端API的調用指向Provider端的新API,并更新契約文件以約束新功能。
  • 將Provider端舊API同步更新為新API,提交并通過測試。
  • 將Consumer端指回舊有API,其他保持不變。
  • 將Provider端臨時過渡的新API刪除。

至此,我們解決了API更新時如何保證契約測試的提交順序,如果是刪除API,則直接刪除Consumer端的契約測試即可。

五、需要思考的問題

1. 如果并行測試的話,誰先提交成功的版本,另外一個測試是否要重新運行?

設想,當兩個并行pipeline A和B,同時運行時,A中跑的是A1.1和B1.0,B中跑的是B1.1和A1.0的測試,假如雙方均能通過各自的測試,但是新版本不兼容(A1.1和B1.1測試失敗),雙方都將各自的新版本保留,這樣就造成了存在相互不兼容的兩個版本。目前解決方案是,人為制造一個“瓶頸”,保證同時只有一個契約測試在運行,保存的只有一個版本。

2. 契約測試可維護性如何?

構建契約測試類似于單元測試,并且在Pact的框架下十分方便維護。但是,測試框架本身還有一些問題,諸如,大小寫敏感,空值驗證,只有一份契約文件,契約測試分組等。

(以上是基于pact 1.0的實踐,pact2.0使用了正則表達式以及TypeMatching等機制解決了驗證“具體”值的問題,更多詳細內容請關注pact官方文檔)

六、結語

契約測試不是銀彈,它不是替代E2E測試的終結者,更不是單元測試的升級換代,它更偏向于服務和服務之間的API測試,通過解耦服務依賴關系和單元測試來加快測試的運行效率。

【本文是51CTO專欄作者“ThoughtWorks”的原創稿件,微信公眾號:思特沃克,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2018-01-10 14:13:04

測試矩陣API測試

2023-11-04 16:28:54

2020-01-03 11:04:54

安全測試滲透

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2023-07-26 07:24:07

2023-07-06 13:56:14

微軟Skype

2021-02-06 08:34:49

函數memoize文檔

2021-01-29 08:32:21

數據結構數組

2022-11-01 08:46:20

責任鏈模式對象

2022-08-08 08:25:21

Javajar 文件

2020-10-15 06:56:51

MySQL排序

2019-02-13 14:15:59

Linux版本Fedora

2018-11-29 09:13:47

CPU中斷控制器

2021-08-04 09:32:05

Typescript 技巧Partial

2023-05-15 08:38:58

模板方法模式

2021-01-01 09:01:05

前端組件化設計

2022-11-26 00:00:06

裝飾者模式Component

2020-06-28 09:30:37

Linux內存操作系統
點贊
收藏

51CTO技術棧公眾號

国产成人综合在线播放| 欧美成人精品一区二区男人小说| 日韩国产精品91| 色综合伊人色综合网| 91pony九色| aa在线视频| 2014亚洲片线观看视频免费| 国产欧美va欧美va香蕉在| 欧美 日韩 国产 一区二区三区| 亚洲1区在线观看| 色哟哟国产精品免费观看| 亚洲精品一区二区三区樱花| 亚洲成a人片77777精品| 视频一区二区国产| 欧美另类在线观看| 中文字幕成人动漫| 精品一级视频| 色综合久久久网| 91精品国产吴梦梦| 国产69精品久久app免费版| 国产麻豆视频一区| 国产97在线|亚洲| 日日骚一区二区三区| 欧美男男gaytwinkfreevideos| 欧美人妖巨大在线| 精品一卡二卡三卡| 欧美aaaaaaa| 国产精品久久看| 久久久综合香蕉尹人综合网| 国产老女人乱淫免费| 久久久999| 久久久久久久亚洲精品| av黄色免费在线观看| 香蕉久久精品| 亚洲成人av片在线观看| av免费一区二区| 日韩在线免费| 粉嫩老牛aⅴ一区二区三区| 国产又粗又大又爽的视频| 国产露出视频在线观看| a级精品国产片在线观看| 亚洲xxx大片| 在线免费观看高清视频| 久久久综合网| 欧洲亚洲女同hd| 精品肉丝脚一区二区三区| 欧美jizz| 中文字幕亚洲在线| 国产黄片一区二区三区| 一级黄色免费视频| 麻豆影视在线| 91免费看片在线观看| 超碰在线97av| 精品人妻无码一区二区| 国产在线不卡视频| 成人精品一区二区三区电影免费 | 亚洲精品亚洲人成在线| 精品久久久久久久久久久院品网 | 成年人免费高清视频| 午夜精品网站| 欧美老肥婆性猛交视频| 国产日韩欧美在线观看视频| 99久久影视| 色午夜这里只有精品| 永久免费毛片在线观看| 成人久久久久| 久久精品一本久久99精品| jizzjizz日本少妇| 五月久久久综合一区二区小说| 日韩一区视频在线| 欧美大片xxxx| 欧美国产综合| 高清视频欧美一级| 天天操天天干视频| 久久国产精品毛片| 国产成人在线一区二区| 日本黄色中文字幕| 美女网站色91| 亚洲自拍中文字幕| 三级视频在线看| 久久先锋影音av鲁色资源| 美乳视频一区二区| 岛国在线视频| 亚洲色图制服丝袜| 一卡二卡三卡视频| 免费网站看v片在线a| 91视频免费观看| 丝袜美腿玉足3d专区一区| 免费在线观看黄色| 亚洲成人手机在线| 超碰av在线免费观看| 91精品网站在线观看| 欧美精品一区二区久久久| 超碰男人的天堂| 精品日本12videosex| 乱亲女秽乱长久久久| 91午夜视频在线观看| 日本系列欧美系列| 99视频免费观看| 男操女在线观看| 亚洲男人的天堂网| 亚洲熟妇av一区二区三区漫画| 78精品国产综合久久香蕉| 欧美一级一区二区| 中文字幕国产综合| 中文字幕在线观看国产| 欧美顶级大胆免费视频| 欧美精品福利在线| 国产精品无码一区| 成人午夜在线视频| 亚洲激情一区二区| 国产资源在线观看入口av| 欧美日韩成人高清| 真人bbbbbbbbb毛片| 久久精品国内一区二区三区水蜜桃| 久久久久久香蕉网| 最近中文字幕av| 成人爽a毛片一区二区免费| 亚洲乱码一区二区三区三上悠亚 | 97av在线视频| 国产农村妇女毛片精品| 久久久久国产精品麻豆| www.欧美黄色| 色综合一区二区日本韩国亚洲| 日韩成人网免费视频| 日韩成人毛片视频| 热久久一区二区| 久久久精品国产一区二区三区| 精品国产白色丝袜高跟鞋| 色婷婷国产精品久久包臀| 中文字幕无码毛片免费看| 精品国产一区二区三区久久久樱花 | 国产一区二区在线免费视频| 日韩欧美在线番号| 亚洲资源中文字幕| 天天摸天天舔天天操| 欧美人与拘性视交免费看| 久久久久久欧美| av一区二区三| 亚洲色图欧美偷拍| 性生活免费在线观看| 精品国产乱码久久久久久果冻传媒| 81精品国产乱码久久久久久| 亚洲精品综合网| 亚洲免费观看高清完整| 一级做a免费视频| av中字幕久久| 国产成人aa精品一区在线播放| 四虎在线视频免费观看| 亚洲综合在线免费观看| 日韩久久久久久久久久久| 亚洲成人精品| 2019国产精品视频| 国产福利在线播放麻豆| 欧美日韩视频在线观看一区二区三区| 国产一区二区三区四区五区六区 | 欧美综合一区| 国产精品九九久久久久久久| 黄色在线网站| 欧美在线不卡一区| 蜜桃av免费在线观看| 日韩专区在线视频| 亚洲欧洲一区二区福利| 只有精品亚洲| 欧美大奶子在线| 亚洲经典一区二区三区| 性做久久久久久免费观看 | 婷婷综合成人| 国产v综合ⅴ日韩v欧美大片 | 蜜臀精品久久久久久蜜臀| 欧美精品亚洲| 国产第一亚洲| 美女国内精品自产拍在线播放| 成 人 黄 色 片 在线播放 | 小处雏高清一区二区三区| 精品国产网站地址| 特级西西444www高清大视频| 国产色产综合色产在线视频| 男人操女人逼免费视频| 亚洲人成网77777色在线播放| 日本一区二区在线免费播放| www.亚洲视频| 欧美裸体一区二区三区| 欧美偷拍第一页| 丰满白嫩尤物一区二区| 国产白丝袜美女久久久久| 免费一区二区| 国产精品第七影院| 国产激情视频在线观看| 欧美tk—视频vk| 男女视频免费看| 久久精品人人做人人爽人人| 17c国产在线| 国产精品videosex极品| 国产一区在线免费| 奇米777日韩| 综合av色偷偷网| 亚洲免费一级片| 欧美性猛交xxxx免费看| xxxx日本黄色| 国产福利一区二区| 日本精品免费在线观看| 凹凸成人精品亚洲精品密奴| 亚洲自拍小视频| 看黄在线观看| 中文字幕亚洲专区| 亚洲黄色在线观看视频| 91福利小视频| 久久久久成人网站| 久久一夜天堂av一区二区三区| 91小视频在线播放| 日韩一区二区久久| 亚州欧美一区三区三区在线| 亚洲一区二区三区四区电影| 国产91在线播放精品91| av网站网址在线观看| 日韩av最新在线观看| 一区二区日韩视频| 精品久久久久久| 国产又色又爽又高潮免费| 成人激情午夜影院| 在线黄色免费观看| 海角社区69精品视频| 神马影院一区二区| 精品成人自拍视频| 成人激情视频小说免费下载| 国产无遮挡裸体视频在线观看| 久久夜色精品亚洲噜噜国产mv| 五月激情丁香婷婷| 91精品国产91久久久久久最新毛片 | 精品国产导航| 91视频国产高清| 在线成人视屏| 久久久免费精品视频| caopo在线| 中文字幕日韩av综合精品| 99草在线视频| 欧美三级中文字| 手机av免费观看| 精品久久久一区二区| 亚洲欧美一区二区三区四区五区| 国产精品天美传媒沈樵| 成熟人妻av无码专区| 99re热视频这里只精品| 欧美久久久久久久久久久| 激情深爱一区二区| 青青在线免费观看视频| 99热这里只有成人精品国产| 激情六月天婷婷| 一区二区在线| 四虎影院一区二区三区 | 国产成人在线网址| 久久久久亚洲综合| 一区二区免费在线观看视频 | 日本一卡二卡在线| 国产精品系列在线观看| 国产三级生活片| 久久精品国产99| 亚洲高清免费在线观看| 日本不卡高清视频| 日韩伦理在线免费观看| 欧美日本精品| 亚洲欧洲久久| 欧美日韩国产亚洲一区| 亚洲高潮无码久久| 欧美不卡一区| 黄色成人在线看| 一道本一区二区| 国产日韩一区二区在线| 久久影院亚洲| 亚洲人视频在线| 精品影院一区二区久久久| 亚洲一区二区福利视频| 国产美女视频91| 无码人妻精品一区二区三区99不卡| 国产成人99久久亚洲综合精品| 免费观看一区二区三区| 丰满放荡岳乱妇91ww| 中文字幕国产专区| 国产喷白浆一区二区三区| 欧美另类69xxxx| 17c精品麻豆一区二区免费| 久久久久无码国产精品不卡| 亚洲国产精品综合小说图片区| 亚洲国产精品成人无久久精品| 亚洲不卡一区二区三区| 亚洲永久精品一区| 欧美剧情片在线观看| 国产熟女精品视频| 亚洲精品在线三区| 香蕉视频国产在线| 国产亚洲欧美aaaa| 超鹏97在线| 97福利一区二区| 少妇一区视频| 91香蕉国产在线观看| 色爱综合av| 一区二区三区的久久的视频| 欧美福利网址| 99视频在线免费播放| 蜜臀av国产精品久久久久| 手机在线免费毛片| 91麻豆6部合集magnet| 五月综合色婷婷| 欧美午夜性色大片在线观看| 亚洲熟妇无码久久精品| 日韩写真欧美这视频| 国产区视频在线播放| 久久手机精品视频| 漫画在线观看av| 亚洲一区二区自拍| 宅男在线一区| 黄色特一级视频| 亚洲免费影视| 精品人妻无码中文字幕18禁| 久久精品人人爽人人爽| 久久精品这里只有精品| 欧美日韩激情一区二区三区| 免费观看国产精品| 丝袜一区二区三区| rebdb初裸写真在线观看| 成人免费视频97| 国产乱码精品一区二区亚洲| 黄色影视在线观看| 麻豆精品在线视频| a天堂视频在线观看| 国产精品久久久久影视| 日本三级欧美三级| 欧美大片拔萝卜| 中国日本在线视频中文字幕| 91sa在线看| 免费萌白酱国产一区二区三区| 做爰高潮hd色即是空| 久久免费高清| 日本一区二区免费视频| 亚洲综合精品久久| 91欧美日韩麻豆精品| 亚洲片在线资源| 中文字幕色婷婷在线视频| 亚洲伊人一本大道中文字幕| 成人在线国产| 超碰在线播放91| 久久久精品免费免费| 国产91av视频| 欧美成人r级一区二区三区| 97caopor国产在线视频| 国产精品在线看| 国产一区二区三区网| 日本一极黄色片| 久久综合久色欧美综合狠狠| 国产无码精品在线播放| 欧美裸体一区二区三区| 中文字幕日本在线观看| 国产精品精品一区二区三区午夜版| 亚洲激情播播| 欧美这里只有精品| 久久国产精品72免费观看| 人妻一区二区视频| 色综合久久久久| 北岛玲一区二区三区| 日韩av电影在线播放| 西野翔中文久久精品国产| 777av视频| 久久蜜桃av一区精品变态类天堂| 99热在线观看免费精品| 亚洲激情视频在线观看| 日本免费久久| 日韩在线观看电影完整版高清免费| 久久免费国产| 小泽玛利亚一区| 日韩一区二区免费电影| 伊人影院在线视频| 精品在线不卡| 免费在线欧美黄色| www.黄色在线| 宅男在线国产精品| 精品精品导航| 久久99久久99精品蜜柚传媒| 日韩二区三区四区| 国产精品久久久免费看| 日韩视频在线你懂得| 超级白嫩亚洲国产第一| 欧美极品色图| 免播放器亚洲一区| 久久精品国产亚洲av香蕉| 精品亚洲一区二区三区在线观看 | 国产成人影院| 欧美日韩亚洲自拍| 夜夜操天天操亚洲| 好吊色一区二区| 日本高清+成人网在线观看| 日韩欧美综合| 亚洲av无码成人精品区| 精品动漫一区二区| 91在线视频免费看| 99re在线视频观看| 久久aⅴ国产紧身牛仔裤| 中文字幕求饶的少妇| 欧美成人精品二区三区99精品| 日本不卡1234视频|