測試是軟件流程中很是重要,不可或缺的一個環節。通常的測試分爲單元測試,集成測試,端到端的手工測試,這也是構成測試金字塔的三個層級。咱們今天將要討論的話題是契約測試,它是處於單元測試和集成測試中間的一個環節。這三個層級分別測試的場景以下:html
契約測試最開始的概念由Martin Fowler 提出,請參見這篇文章, 它又被稱之爲:消費者驅動的契約測試(Consumer Driven Contracts)。這裏的契約是指軟件系統中各個服務間交互的數據標準格式,更多的指消費端(client)和提供端(server)之間交互的數據接口的格式。後端
系統工程中存在這樣的理論:線性系統(即複雜性隨規模線性增加的系統)的可靠性等於組成它的各個組件的可靠性之乘積。這容易理解,由於整個系統正常工做的條件是必須每一個組件都同時正常工做。架構
如上圖所述,三個組件共同支撐的系統,若是每一個組件的可靠性是90%,那麼整個系統的可靠性就是 90%×90%×90%=72.9%,咱們能夠看到系統總體的可靠度是低於任一組件的可靠性的。若是一個系統由100個組件組成,每一個組件即便能達到99%的可靠性,那麼整個系統的可靠性也會降到36.6%左右。框架
咱們常說複雜性是軟件工程的最重要的特性,一個完善的軟件系統必然是靠不少的子系統,組件共同撐起來的。根據上面的理論,若是是一個複雜的軟件系統那麼每個組件的可靠性都對系統總體的可靠性有着很是重要的影響,排除組件自己的可靠性的因素,各個組件之間的相互依賴和調用關係也將會對系統的穩定性有着決定性的影響。隨着業務的複雜度愈來愈高,整個系統也變得愈來愈龐大和錯綜複雜,在今天的軟件工程開發中微服務已經不是一個新名詞,在微服務的架構下一般一個client會與多個service相互交互,能夠想象一下若是某一個服務的接口發生變化將會影響整個系統的運行。以下圖展現的傳統的大服務與微服務的區別。微服務
那麼在微服務模式下若是保證各個服務端與消費端之間以及服務與服務之間可以可靠的交互呢?這就回到了到咱們要聊的契約測試的話題。單元測試
以下圖,在服務端接口發生變化的狀況下經過契約測試能夠很容易的測試出契約不匹配,能夠在集成測試以前就能發現問題,儘早解決。測試
單元測試:spa
集成測試:server
端到端測試:htm
契約測試:
通常契約測試是在單元測試以後,集成測試以前要進行的,首先在保證各自功能正確的前提下測試消費者和提供者的契約是否相匹配,而後再進一步的測試功能的完備性和整個業務流的正確性。
本文主要淺顯的介紹了契約測試是什麼以及它的重要性,後續將會繼續介紹契約測試的框架以及相關實踐。