日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

探秘Spring Contract:如何保障您的API符合預期?

來源: 責編: 時間:2024-03-22 17:42:29 272觀看
導讀微服務集成測試之痛環境搭建成本高,需啟動多個服務用例編寫難運行慢發現問題晚測試脆弱,外部依賴多1.什么是契約測試契約測試(Contract testing)是一種測試技術,它通過以隔離檢查集成點上的每個應用的方式,確保應用發送或接

Tor28資訊網——每日最新資訊28at.com

微服務集成測試之痛

  • 環境搭建成本高,需啟動多個服務
  • 用例編寫難
  • 運行慢
  • 發現問題晚
  • 測試脆弱,外部依賴多

1.什么是契約測試

契約測試(Contract testing)是一種測試技術,它通過以隔離檢查集成點上的每個應用的方式,確保應用發送或接收的消息符合調用雙方共識,并允許隨著時間的推移進行演化。Tor28資訊網——每日最新資訊28at.com

契約測試是對單元測試的增強,針對服務接口provider測試,覆蓋了一部分本來需要集成測試才能測試到的場景。Tor28資訊網——每日最新資訊28at.com

2.為什么要做契約測試

契約測試主要解決在存在溝通邊界情況下,測試替身(Test Double)與生產代碼表現可能不一致的問題。在契約測試中,契約由代碼生成,保持與現實同步,而且應用可以獨立于其它應用而僅基于契約進行快速測試。Tor28資訊網——每日最新資訊28at.com

由于集成測試容易受到網絡緩慢或不可靠,以及服務不可靠等因素的影響而運行緩慢或失敗,所以通常會引入測試替身來代替真實外部服務,以快速完成覆蓋度更廣的測試,讓測試真正起到作用。Tor28資訊網——每日最新資訊28at.com

3.契約測試的定位

金字塔模型是構建健康、快速、可維護測試集的成熟理論。Tor28資訊網——每日最新資訊28at.com


Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com


Tor28資訊網——每日最新資訊28at.com

4.契約測試的價值

眾所周知,越是在項目生命周期的后期發現Bug,其修復的成本就越高。Tor28資訊網——每日最新資訊28at.com


Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com


Tor28資訊網——每日最新資訊28at.com

不同于端到端(E2E)測試,契約測試可以在開發人員推送代碼之前運行,在開發階段提早發現問題。Tor28資訊網——每日最新資訊28at.com

契約測試還有很多端到端測試不具備的好處:Tor28資訊網——每日最新資訊28at.com

  • 不需要調用其它組件,運行得很快。
  • 編寫測試不需要了解系統全貌,更容易維護。
  • 問題只存在于被測試組件中,更容易調試和修復。
  • 極易反復運行。
  • 每個組件獨立測試,不會引發流水線構建時間大幅增長。

引入契約測試,還會帶來如下福利:Tor28資訊網——每日最新資訊28at.com

  • 在提供者API就緒之前就可以開發消費者應用。
  • 為提供者供應準確的需求
  • 會收獲一組文檔化良好的用例,它們確切地顯示了如何使用提供者。
  • 提供者對API變更更有信息,可以準確知道使用者感興趣的字段,方便地移除未使用的字段,以及添加新的字段。
  • 對提供者API進行修改,可以立即看到會影響哪些使用者。

沒有兩個團隊是完全一樣的,契約測試也不是萬能的,關鍵要看契約測試可以為團隊和項目帶來什么。Tor28資訊網——每日最新資訊28at.com

5.契約測試適合的場景

契約測試可以用于任何需要通信的兩個服務,比如Web前端與后端API服務。Tor28資訊網——每日最新資訊28at.com

在微服務架構體系中,因為存在更多團隊獨立、服務間調用及服務單獨演進的情形,契約測試有了更好更大的用武之地。良好的契約測試,使得開發人員很容易避免版本地獄,是微服務開發和部署的利器。Tor28資訊網——每日最新資訊28at.com

6.概念術語

契約測試主要涉及如下概念術語:Tor28資訊網——每日最新資訊28at.com

  • 消費者(Consumer):對于調用,發起請求的一方。對于MQ,為接收消息的一方。
  • 提供者(Provider):對于調用,響應請求的一方。對于MQ,為生成消息的一方。
  • 契約(Contract):消費者和提供者之間的共識,是一系列交互的集合。對于HTTP調用,包括描述消費者向提供者發送什么的預期請求,以及描述消費者希望提供者返回的最小期望響應。對于消息交互,則描述消費者希望得到的最小期望消息。


Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com

7.契約測試模式

契約測試分為消費者驅動(consumer-driven)和提供者驅動(Provider-driven)兩種模式。Tor28資訊網——每日最新資訊28at.com

消費者驅動更具哲學意義,將API的消費者置于設計過程的核心,來倡導更好的內部微服務設計。該模式的優點在于,只有消費者正在使用的部分會得到測試,而提供者可以自由地更改消費者不使用的任何其它部分,而不必破壞任何現有測試。Tor28資訊網——每日最新資訊28at.com

提供者驅動思路較為常規,更適合開放數據或系統的場景。Tor28資訊網——每日最新資訊28at.com

無論采用哪種風格,關鍵在于獲得契約測試的好處,實現引入契約測試的目的。Tor28資訊網——每日最新資訊28at.com

(1)消費者驅動

消費者驅動的契約測試運行步驟如下:Tor28資訊網——每日最新資訊28at.com

  • 步驟1:消費者端
  • 編寫并運行單元測試(包括對接口的請求參數和預期響應)
  • MockService代替實際服務提供者(自動)
  • 生成契約文件(自動)
  • 步驟2:提供者端
  • 啟動服務提供者
  • 重放契約文件中的請求,驗證真實響應是否滿足預期(自動)


Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com

(2)提供者驅動

提供者驅動模式由提供者定義契約并驅動整個過程。Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com

8.契約測試工具

流行的契約測試工具為:Tor28資訊網——每日最新資訊28at.com

  • Pact:是一個命令行工具,反饋時間更短,有助于消費者和生產者之間更好地溝通,支持與Maven/Gradle等集成。
  • Spring Cloud Contract:主要用于JVM環境,也容易擴展到非JVM環境,主要適用于生產者驅動的契約測試。

9.利用Pact進行消費者驅動的測試價值Tor28資訊網——每日最新資訊28at.com

利用Pact進行契約測試的整個流程示意如下,使用了 pact 之后,依然是每個服務獨立的進行單元測試,但是可以模擬出真實集成場景。Tor28資訊網——每日最新資訊28at.com

  • 將一個笨重的集成測試化為兩個容易編寫、容易運行的單元測試/接口測試
  • 解耦消費者與提供者,甚至可以在沒有提供者實現的情況下開展消費者端測試
  • 通過測試保證契約和實現的一致性,測試通過之時就是代碼實現完成之時
  • 測試前移:在開發階段就應該運行,并作為CI的一部分,便于盡早發現問題


Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com

10.Pact示例

pact契約測試分為兩步:Tor28資訊網——每日最新資訊28at.com

  • 編寫test用例,生成契約文件(不需要啟動服務)。
  • 利用pact-verifier命令和契約文件,驗證接口提供者是否正確 (需要啟動提供者服務)

以下為nlp-pact-parent示例:Tor28資訊網——每日最新資訊28at.com

(1)父項目pom包相關

<dependencies><!-- contract testing --><dependency>    <groupId>au.com.dius</groupId>    <artifactId>pact-jvm-consumer-junit5</artifactId>    <version>4.0.10</version>    <scope>test</scope></dependency><dependency>    <groupId>au.com.dius</groupId>    <artifactId>pact-jvm-provider-junit5</artifactId>    <version>4.0.10</version>    <scope>test</scope></dependency>

(2)nlp-pact-consumer消費端項目

編寫ConsumerTest生成契約:Tor28資訊網——每日最新資訊28at.com

@ExtendWith(PactConsumerTestExt.class)@SpringBootTest(classes = PactConsumerApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)@PactTestFor(providerName = "nlp-pact-provider", port = "8202")public class ConsumerTest {   private TestRestTemplate restTemplate = new TestRestTemplate();   @Test   @PactTestFor(pactMethod = "greetingPact")    void greeting_shouldReturnMessage() {      // Arrange      HttpHeaders headers = new HttpHeaders();      headers.add("Content-Type", "application/json");      // Act      ResponseEntity<Map> response = restTemplate.getForEntity("http://localhost:8202/greeting?name=John", Map.class);      // Assert      assertEquals(HttpStatus.OK, response.getStatusCode());      assertEquals(Collections.singletonMap("message", "Hello, John!"), response.getBody());   }   // Pact 定義   @Pact(consumer = "nlp-pact-consumer", provider = "nlp-pact-provider")   public RequestResponsePact greetingPact(PactDslWithProvider builder) {      return builder            .given("a request for greeting with name 'John'")            .uponReceiving("a request to greet John")            .path("/greeting")            .method("GET")            .query("name=John")            .willRespondWith()            .status(200)            .headers(Collections.singletonMap("Content-Type", "application/json"))            .body("{/"message/": /"Hello, John!/"}")            .toPact();   }}

(3)執行ConsumerTest測試用例,生成如下契約文件:

# nlp-pact-consumer-nlp-pact-provider.json{  "provider": {    "name": "nlp-pact-provider"  },  "consumer": {    "name": "nlp-pact-consumer"  },  "interactions": [    {      "description": "a request to greet John",      "request": {        "method": "GET",        "path": "/greeting",        "query": {          "name": [            "John"          ]        }      },      "response": {        "status": 200,        "headers": {          "Content-Type": "application/json"        },        "body": {          "message": "Hello, John!"        }      },      "providerStates": [        {          "name": "a request for greeting with name 'John'"        }      ]    }  ],  "metadata": {    "pactSpecification": {      "version": "3.0.0"    },    "pact-jvm": {      "version": "4.0.10"    }  }}

(4)nlp-pact-provider提供端驗證契約

build配置如下:Tor28資訊網——每日最新資訊28at.com

<plugin>    <groupId>au.com.dius</groupId>    <artifactId>pact-jvm-provider-maven</artifactId>    <version>4.0.0</version>    <configuration>        <serviceProviders>            <!-- You can define as many as you need, but each must have a unique name -->            <serviceProvider>                <name>nlp-pact-provider</name>                <!-- All the provider properties are optional, and have sensible defaults (shown below) -->                <protocol>http</protocol>                <host>localhost</host>                <port>8200</port>                <path>/</path>                <pactFileDirectory>resources/pacts</pactFileDirectory>            </serviceProvider>        </serviceProviders>        <pactBrokerUrl/>    </configuration></plugin>

(5)運行命令:mvn pact:verify,驗證契約

Found 1 pact filesVerifying a pact between nlp-pact-consumer and nlp-pact-provider  [Using File D:/IdeaProjects/nlp-other-project-dev/nlp-pact-parent/nlp-pact-provider/target/pacts/nlp-pact-consumer-nlp-pact-provider.json]  Given a request for greeting with name 'John'         WARNING: State Change ignored as there is no stateChange URL  a request to greet John    returns a response which      has status code 200 (OK)      has a matching body (OK)[WARNING] Skipping publishing of verification results as it has been disabled (pact.verifier.publishResults is not 'true')[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time:  1.589 s[INFO] Finished at: 2023-03-08T15:02:33+08:00[INFO] --------

11.Pact Broker

Pact Broker是一個用于共享消費者驅動的合同和驗證結果的應用程序。Tor28資訊網——每日最新資訊28at.com

pact主頁面:Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com

查看服務間關系:Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com

與CICD集成:Tor28資訊網——每日最新資訊28at.com

Tor28資訊網——每日最新資訊28at.com

12.總結

我在不少項目中都嘗試過實施契約測試,但是真正實施成功的并不多,主要原因還是規模和痛點不夠大,從而導致團隊覺得沒有必要做,或者覺得做了收益比投入少。而成功的一般的都是團隊人員足夠痛,或者經歷過大型多團隊項目中服務改變等各種痛點,從而導致他們解決自己的痛點而主動實施契約測試,但是前提是他們都知道契約測試。所以要成功實施契約都是有兩個主要的前提條件:1,團隊對于相關問題足夠痛,2,團隊懂契約測試。在這種情況下,團隊才可能愿意主動實施契約測試,才能成功的實施契約測試。所以首先是要讓開發團隊懂契約測試,比如契約測試能解決什么問題,實施流程,相關測試框架等,然后等待團隊無法忍受相關痛點后,成功的實施契約測試就可以水到渠成了。Tor28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-78655-0.html探秘Spring Contract:如何保障您的API符合預期?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 使用 Node.js 和 htmx 構建全棧 CRUD 應用程序

下一篇: 一份關于2024年React初學者入門路線指南

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 分布式系統中的CAP理論,面試必問,你理解了嘛?

    對于剛剛接觸分布式系統的小伙伴們來說,一提起分布式系統,就感覺高大上,深不可測。而且看了很多書和視頻還是一臉懵逼。這篇文章主要使用大白話的方式,帶你理解一下分布式系統
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 自動化在DevOps中的力量:簡化軟件開發和交付

    自動化在DevOps中扮演著重要角色,它提升了DevOps的效能。通過自動化工具和方法,DevOps團隊可以實現以下目標:消除手動和重復性任務。簡化流程。在整個軟件開發生命周期中實現更
  • Temu起訴SHEIN,跨境電商戰事升級

    來源 | 伯虎財經(bohuFN)作者 | 陳平安日前據外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創意日前,Meta創始人兼CEO 馬克&middot;扎克伯發布公開信,宣布Meta計劃裁員超11000人,占其員工總數13%。他公開承認了自己的預判失誤:&ldquo;不僅
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久久精品999| 亚洲免费观看高清完整版在线观看熊| 欧美日韩专区| 欧美性理论片在线观看片免费| 国产精品高清网站| 国产日韩欧美另类| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲人在线视频| 亚洲免费影视第一页| 欧美一级午夜免费电影| 男女精品网站| 欧美午夜美女看片| 国产自产在线视频一区 | 极品少妇一区二区三区精品视频| 在线精品视频一区二区| 一区二区激情视频| 久久国产精品99精品国产| 欧美电影免费观看高清完整版| 欧美日韩专区| 韩日欧美一区二区三区| 亚洲精品视频一区| 欧美一级理论片| 免费一级欧美片在线播放| 国产精品chinese| 在线观看视频欧美| 亚洲欧美日韩在线综合| 免费在线观看精品| 国产精品一区二区a| 亚洲激情啪啪| 欧美一级在线播放| 欧美乱妇高清无乱码| 国产手机视频精品| 一区二区不卡在线视频 午夜欧美不卡'| 欧美在线观看视频| 欧美日韩精品三区| 加勒比av一区二区| 亚洲欧美视频在线| 欧美日韩国产精品| 亚洲国产二区| 久久成人免费| 国产精品久久一级| 99精品欧美一区| 美日韩精品视频| 国产视频一区欧美| 在线视频日本亚洲性| 麻豆成人在线播放| 国产视频欧美视频| 国产精品99久久99久久久二8| 欧美va亚洲va香蕉在线| 国内久久婷婷综合| 午夜欧美大片免费观看| 欧美三级网页| 亚洲精品在线电影| 免费久久99精品国产自| 国产一区在线播放| 午夜在线a亚洲v天堂网2018| 国产精品v日韩精品v欧美精品网站| 亚洲高清不卡在线| 久久精品在线播放| 国产欧美日韩综合精品二区| 国产精品99久久久久久久vr| 欧美精品一区二区蜜臀亚洲| 亚洲国产专区| 欧美不卡视频一区| 亚洲国产精品国自产拍av秋霞| 久久久精品性| 国产在线精品一区二区夜色| 欧美一区二区网站| 国产区日韩欧美| 亚洲欧美电影在线观看| 国产精品扒开腿爽爽爽视频| 一本一本久久| 欧美三日本三级三级在线播放| 日韩视频一区二区| 欧美日韩mv| 亚洲最新在线视频| 欧美日韩国产成人高清视频| 亚洲精品五月天| 欧美日本三级| 在线视频欧美一区| 国产精品麻豆成人av电影艾秋| 亚洲一区二区三区影院| 国产精品美女久久| 新狼窝色av性久久久久久| 国产精品一区二区在线观看| 亚洲欧美日本国产有色| 国产精品亚洲综合久久| 亚洲欧美国产另类| 国产伦精品一区二区三区高清版 | 国产精品久久二区二区| 在线亚洲一区观看| 国产精品av免费在线观看| 亚洲天堂av高清| 国产精品久久久久一区二区| 亚洲综合国产精品| 国产欧美一区二区色老头| 久久国产视频网站| 激情六月综合| 欧美成人午夜视频| 99国产精品国产精品久久| 欧美日韩激情网| 亚洲一区二区三区免费视频| 国产伦精品一区二区三区视频孕妇| 欧美一级视频免费在线观看| 国产在线观看91精品一区| 美女性感视频久久久| 亚洲另类自拍| 欧美视频亚洲视频| 欧美一区二区三区视频在线| 黄色在线一区| 欧美国产综合视频| 亚洲一区二区三区色| 国产综合欧美| 欧美激情久久久久| 一区二区三区四区五区在线| 国产欧美一级| 免费观看一级特黄欧美大片| 一本色道久久综合狠狠躁篇的优点 | 在线亚洲观看| 国产三区精品| 免费成人性网站| 一本色道久久综合狠狠躁的推荐| 国产精品福利在线观看网址| 久久精品麻豆| 亚洲精品资源美女情侣酒店| 国产精品任我爽爆在线播放 | 欧美刺激午夜性久久久久久久| 一区二区三区久久| 国产亚洲观看| 欧美精品在线网站| 欧美一区二区三区在线播放| 亚洲黑丝在线| 国产精品永久入口久久久| 免费观看一区| 亚洲欧美综合v| 亚洲国产一区在线| 国产精品日韩欧美| 你懂的视频欧美| 午夜精品一区二区三区四区| 亚洲国产cao| 国产精品久久久久久久久久久久久| 久久久久久久综合日本| 一区二区欧美激情| 永久域名在线精品| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久 | 亚洲男女自偷自拍图片另类| 一区二区视频免费在线观看 | 欧美午夜寂寞影院| 久久青草久久| 亚洲一区三区视频在线观看| 在线观看亚洲专区| 国产精品久久久久一区| 欧美**字幕| 欧美一区二区性| 一本一本久久| 亚洲第一久久影院| 国产欧美日韩在线| 欧美日韩视频在线一区二区观看视频 | 欧美有码在线视频| 99在线观看免费视频精品观看| 国外成人在线视频网站| 国产精品第十页| 欧美大成色www永久网站婷| 欧美在线视频日韩| 亚洲一区二区三区久久| 亚洲精品久久久久久久久久久久 | 亚洲精品久久久久久久久| 黄色亚洲在线| 国产精品尤物| 国产精品www.| 欧美黄免费看| 久久久中精品2020中文| 午夜精品短视频| 一区二区三区精品在线| 亚洲国产岛国毛片在线| 国产一区亚洲| 国产精品欧美日韩| 欧美色精品在线视频| 欧美精品电影| 你懂的网址国产 欧美| 久久综合久久88| 久久精品中文字幕免费mv| 亚洲欧美日本在线| 在线亚洲欧美视频| 99成人在线| 亚洲精品视频在线| 最新成人av在线| 亚洲国产婷婷香蕉久久久久久99| 国内精品伊人久久久久av影院| 国产精品网站在线| 欧美午夜宅男影院| 欧美日韩亚洲视频一区| 欧美激情一区二区久久久| 美女尤物久久精品| 久久综合电影一区| 久久人人精品| 久久香蕉国产线看观看网| 久久久久久久久一区二区| 久久av老司机精品网站导航| 欧美在线free| 久久精品人人做人人综合| 久久九九久精品国产免费直播| 欧美专区日韩视频| 久久er精品视频|