契約測試的必要性

2022-01-18 16:51:44 字數 1618 閱讀 4671

測試是軟體流程中非常重要,不可或缺的乙個環節。一般的測試分為單元測試,整合測試,端到端的手工測試,這也是構成測試金字塔的三個層級。我們今天將要討論的話題是契約測試,它是處於單元測試和整合測試中間的乙個環節。這三個層級分別測試的場景如下:

契約測試最開始的概念由martin fowler 提出,請參見這篇文章, 它又被稱之為:消費者驅動的契約測試(consumer driven contracts)。這裡的契約是指軟體系統中各個服務間互動的資料標準格式,更多的指消費端(client)和提供端(server)之間互動的資料介面的格式。

系統工程中存在這樣的理論:線性系統(即複雜性隨規模線性增長的系統)的可靠性等於組成它的各個元件的可靠性之乘積。這容易理解,因為整個系統正常工作的條件是必須每個元件都同時正常工作。

如上圖所述,三個元件共同支撐的系統,如果每個元件的可靠性是90%,那麼整個系統的可靠性就是 90%×90%×90%=72.9%,我們可以看到系統整體的可靠度是低於任一元件的可靠性的。如果乙個系統由100個元件組成,每個元件即使能達到99%的可靠性,那麼整個系統的可靠性也會降到36.6%左右。

我們常說複雜性是軟體工程的最重要的特性,乙個完善的軟體系統必然是靠很多的子系統,元件共同撐起來的。根據上面的理論,如果是乙個複雜的軟體系統那麼每乙個元件的可靠性都對系統整體的可靠性有著非常重要的影響,排除元件本身的可靠性的因素,各個元件之間的相互依賴和呼叫關係也將會對系統的穩定性有著決定性的影響。隨著業務的複雜度越來越高,整個系統也變得越來越龐大和錯綜複雜,在今天的軟體工程開發中微服務已經不是乙個新名詞,在微服務的架構下通常乙個client會與多個service相互互動,可以想象一下如果某乙個服務的介面發生變化將會影響整個系統的執行。如下圖展示的傳統的大服務與微服務的區別。

那麼在微服務模式下如果保證各個服務端與消費端之間以及服務與服務之間能夠可靠的互動呢?這就回到了到我們要聊的契約測試的話題。

如下圖,在服務端介面發生變化的情況下通過契約測試可以很容易的測試出契約不匹配,可以在整合測試之前就能發現問題,盡早解決。

單元測試:

整合測試:

端到端測試:

契約測試:

可以使得消費端和提供端之間測試解耦,不再需要客戶端和服務端聯調才能發現問題

完全由消費者驅動的方式,消費者需要什麼資料,服務端就給什麼樣的資料,資料契約也是由消費者來定的

測試前移,越早的發現問題,保證後續測試的完整性

一般契約測試是在單元測試之後,整合測試之前要進行的,首先在保證各自功能正確的前提下測試消費者和提供者的契約是否相匹配,然後再進一步的測試功能的完備性和整個業務流的正確性。

this的必要性

先看下面一段 lesson8 necessary of this class person show name public void showinfo class demo 8 1 this屬於乙個物件,代表的是物件,其實就是乙個物件的引用,只能在類定義的方法中使用。那麼它代表那個物件呢?答 哪個...

it 的必要性

for std vector iterator itlocal m vecsoftwareer.begin itlocal m vecsoftwareer.end else it 如上所示,c 98中map erase並沒有返回值為iterator的原型函式。那麼問題來了it map.erase i...

sh c的必要性

在linux使用 echo 並配合命令重定向是實現向檔案中寫入資訊的快捷方式。比如要向 test.asc 檔案中隨便寫入點內容,可以 echo 資訊 test.asc 或者 echo 資訊 test.asc 下面,如果將 test.asc 許可權設定為只有 root 使用者才有許可權進行寫操作 su...