Pact是什么
Pact是一個用于實現(xiàn)消費者驅(qū)動的契約測試的框架。關(guān)于什么是消費者驅(qū)動的契約測試,可以參見這篇文章喘漏,不再贅述。這里只說明契約測試對于構(gòu)建復(fù)雜軟件系統(tǒng)的重要作用华烟。
系統(tǒng)工程里有這樣一個規(guī)律翩迈,線性系統(tǒng)(即復(fù)雜性隨規(guī)模線性增長的系統(tǒng))的可靠性等于組成它的各個組件的可靠性之乘積。這容易理解盔夜,因為整個系統(tǒng)正常工作的條件是必須每個組件都同時正常工作负饲。
也就是說,如果一個系統(tǒng)由三個可靠性各為90%的組件組成喂链,那么整個系統(tǒng)的可靠性實際只有90%×90%×90%=72.9%返十,低于任一組件的可靠性。如果一個系統(tǒng)由100個組件組成衩藤,每個組件即使能達到99%的可靠性吧慢,那么整個系統(tǒng)的可靠性也會降到36.6%左右。
然而赏表,一個復(fù)雜軟件系統(tǒng)的情形可能更糟检诗,因為軟件系統(tǒng)實際上是非線性系統(tǒng)匈仗。組成軟件系統(tǒng)的各個組件之間有依賴與連接關(guān)系,除了要讓每個組件正常工作之外逢慌,還需要保證各個組件之間的調(diào)用正常悠轩。如果將每個組件視為一個微服務(wù)的話,每個微服務(wù)上暴露出的接口不止一個攻泼,組件兩兩之間的連接關(guān)系又不止一條火架。如此算來,在微服務(wù)規(guī)模不斷增長的情況下忙菠,系統(tǒng)的復(fù)雜度已不止線性增長何鸡,因此整個系統(tǒng)的可靠性將會比各組件可靠性的乘積還要更低。
因此牛欢,在構(gòu)建由微服務(wù)組成的復(fù)雜軟件系統(tǒng)時骡男,除了保證每個微服務(wù)組件的正確性之外,還必須通過測試驗證微服務(wù)之間連接的正確性傍睹。
Pact框架解決的就是如何測試微服務(wù)之間連接正確性的問題隔盛。
傳統(tǒng)方式下,一般通過集成測試來驗證服務(wù)之間調(diào)用是否正常拾稳,這需要將被測的各個組件均部署到環(huán)境中吮炕,然后再展開測試,且不說這種方式下測試運行得如何之慢访得,只是把各個服務(wù)都部署到同一環(huán)境之中這件工作龙亲,對于許多經(jīng)常搭環(huán)境的開發(fā)者來說,就已經(jīng)非常繁瑣而痛苦了悍抑。而且由于多個服務(wù)共享同一環(huán)境俱笛,測試也比較脆弱,很容易掛传趾。
Pact是一個思路精巧、設(shè)計優(yōu)雅的測試框架泥技。它通過將一個笨重的集成測試化為兩個可以獨立運行的單元測試和接口測試來解決這一問題浆兰。兩步即可完成:
Step 1: 服務(wù)消費者端編寫單元測試,測試對服務(wù)提供者接口的客戶端請求類珊豹。一運行測試簸呈,Pact框架便幫助自動生成json形式的pact文件(契約文件)。pact文件中含有交互的路徑店茶、方法蜕便、請求參數(shù)、請求頭與期望響應(yīng)等信息贩幻。
Step 2: 單獨啟動服務(wù)提供者(此時并不需要啟動服務(wù)消費者)轿腺,利用Pact框架提供的驗證命令進行契約驗證两嘴,基于上一步中生成的pact文件,對服務(wù)提供者的接口發(fā)送請求并驗證實際響應(yīng)是否與期望響應(yīng)相符族壳。
這種方式至少有明顯的幾個好處:
服務(wù)測試解耦憔辫。兩個測試之間唯一的耦合點是pact文件(自動生成),自然實現(xiàn)了服務(wù)消費者端與提供者端的測試解耦仿荆,再也不需要等待“聯(lián)調(diào)”就能各自展開開發(fā)贰您。
消費者驅(qū)動。由于契約文件是由服務(wù)消費者的單元測試驅(qū)動而成的拢操,服務(wù)提供者只要能夠正確通過契約驗證锦亦,就能保證滿足服務(wù)消費者端的需求。這一思想其實與敏捷實踐中的測試驅(qū)動開發(fā)(TDD)有異曲同工之處令境。
測試前移杠园。越早發(fā)現(xiàn)問題,解決問題的成本就越小展父。由于Pact測試已經(jīng)足夠輕量化返劲,開發(fā)者甚至在本地開發(fā)階段就可以進行相關(guān)的測試,而不需要等到集成階段才暴露問題栖茉。
Pact的前世今生
Pact是一個開源框架篮绿,最早是由澳洲最大的房地產(chǎn)信息提供商REA Group的開發(fā)者及咨詢師們共同創(chuàng)造。REA Group的開發(fā)團隊很早便在項目中使用了微服務(wù)架構(gòu)吕漂,并在團隊中對于敏捷和測試的重要性早已形成共識亲配,因此設(shè)計出這樣的優(yōu)秀框架并應(yīng)用于日常工作中也是十分自然。
Pact工具于2013年開始開源惶凝,發(fā)展到今天已然形成了一個小的生態(tài)圈吼虎,包括各種語言(Ruby/Java/.NET/JavaScript/Go/Scala/Groovy...)下的Pact實現(xiàn),契約文件共享工具Pact Broker等苍鲜。Pact的用戶已經(jīng)遍及包括RedHat思灰、IBM、Accenture等在內(nèi)的若干知名公司混滔,Pact已經(jīng)是事實上的契約測試方面的業(yè)界標準洒疚。
Pact中文參考指南
雖然在國外的許多互聯(lián)網(wǎng)開發(fā)團隊中,Pact已經(jīng)得到了廣泛應(yīng)用坯屿,但是由于英語水平的限制和交流的問題油湖,國內(nèi)許多團隊對Pact還知之甚少,對于具體使用時應(yīng)該遵循怎樣的原則和實踐更是缺乏足夠的了解领跛。
因此我們得到Pact作者們的允許乏德,基于Pact的官方文檔,翻譯出了這份《Pact中文參考指南》吠昭,幫助國內(nèi)開發(fā)者們了解和使用這一優(yōu)秀框架喊括。歡迎大家參考和提出修正意見胧瓜。
我們是誰,為什么要做這個
我們是一個虛擬的團隊:Cloud Native User Group瘾晃,主要關(guān)注云原生應(yīng)用贷痪、DevOps、持續(xù)交付等方面的技術(shù)與實踐蹦误,以及探討如何幫助傳統(tǒng)業(yè)務(wù)在云計算時代下實現(xiàn)云原生轉(zhuǎn)型劫拢。
我們致力于為國內(nèi)開發(fā)者團隊引入業(yè)界最新的軟件工程模式、技術(shù)與工具强胰,幫助消除因語言而造成的鴻溝舱沧。我們相信技術(shù)的溝通是無國界的,希望巴比倫塔在今天不再僅是傳說偶洋。
怎樣訪問《Pact中文參考指南》
- Pact中文參考指南地址:https://www.pact.net.cn
- Pact官方文檔:https://docs.pact.io
- Pact開源項目代碼:https://github.com/realestate-com-au/pact
更多關(guān)于Pact測試相關(guān)的介紹熟吏,請關(guān)注我在8月19日DevOpsDays上海站的演講:《輕量化微服務(wù)測試實踐》。
Enjoy! :)