天天看點

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

導讀:作為一名測試,我們知道不是任何情況都可以用真實對象來測,比如我們要測一個地方PM2.5超過900的情況,我們不能每天等着PM2.5的指數超過900再測試,這個時候可以用一個虛拟對象來建立測試,做一個Mock。如何構造Mock使用場景?如何使用Mock提效,不用老加班?11月2日,阿裡巴巴研發效能事業部-雲效平台技術專家孫琛,在雲效Work Like Alibaba系列直播上,結合視訊示範為大家分享了Mock平台的功能實踐,讓大家在測試開發過程中用Mock提效。

<b>為什麼會需要Mock?</b>

<b></b>

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

傳統架構下的一些銀行、保險、證券等金融類客戶,存在很多的第三方的接口會用于代付、轉賬等,當對方提供的測試環境不穩定時,我們自身的研發效能就會受到影響。比如說聯調,如果對方系統挂了,我們肯定要Delay一天,這種環境不穩定的情況是傳統架構比較容易出現的。還有種情況,假設我們要測一個賬戶,他一天内有100多次轉賬記錄的資料準備,如果讓銀行準備的話,可能會拿這個使用者來回來回轉賬,會非常麻煩。

另外,現在比較流行的網際網路架構下,有一種分布式實踐,就是把自己的業務拆成很多的服務,有提供者、消費者,粒度非常細。例如下圖,有非常複雜的依賴關系,在開發過程中,如果同時讓菱形和三角形來開發,那在三角形還沒有準備好的時候,我們怎麼保證菱形的業務能正确走下去?還有一種現在比較提倡的前後端分離,如何在後端代碼還沒有準備好,或者說接口還沒有提供出來的時候,可以先做前端頁面的一個邏輯?這些是Mock需要解決的問題。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

<b>Mock解決方案</b>

<b>1.Mock解決不穩定的問題。</b>Mock服務非常簡單,沒有業務邏輯,是以它足夠穩定。比如說銀行那邊的接口挂了,全都接到Mock平台的話,所有的請求權會從Mock平台出,而不會跟銀行的接口有什麼關聯。

<b>2.快速構造複雜資料。</b>我們可以自定義一個傳回結果,有了自定義的傳回結果後,就可以構造非常複雜的資料,不需要銀行或者其他第三方給我們準備資料,完全可以用我的資料在傳回裡面把它定義好,再繼續做業務的一個驗證。

<b>3.快速構造異常場景。</b>對于一些異常的情況,比如網絡延遲高,或者傳回特殊異常的時候,也可以用Mock來構造。

<b>服務端Mock平台</b>

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

服務端Mock平台主要是在服務調用者和服務提供者中間,讓調用者不再直接調用那個提供者,而去調用我們的Mock平台,目前Mock平台支援Http、Dubbo、Sofa、Hsf(Edas)。Mock能讓測試以及聯調不受環境的影響,提升研發測試效率,并且對于開發也沒有任何侵入性,不需要額外編寫代碼,隻需要在頁面配置就可以完成接口的Mock,同時也可以支援一些業務複雜情況下,在Mock裡模拟各類場景。

<b>Mock平台基礎功能</b>

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

<b>多協定支援:</b>Http(s)、Dubbo、Sofa、Hsf(Edas),還有一些rpc的請求。

<b>多格式支援:</b>支援一些常見的Json,Xml,還有其他一些自定義格式都是支援。

<b>标簽化:</b>對管理來說,有一個标簽化的管理,能快速定位到我們需要的Mock。

<b>動态表達式:</b>如果我們希望傳回結果不是最簡單的,就這麼一個靜态文本,我們希望是它可以輸出目前的日期,或者是一些簡單的邏輯運算,希望他有一個最簡單的動态化的功能,或者再簡單的舉個例子,就是說我們希望他跟入參會有一些互動。

<b>多端口:</b>支援任意端口請求,避免開發修改代碼。

<b>異常Mock:</b>Http異常Code,Rpc異常類

以一個Http的例子來做一個示範。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

這是一個擷取天氣的接口,比如說我傳city=杭州,它就會傳回杭州的天氣情況,比如溫度、pm指數等,這個很常見。假設接到的需求要模拟pm2.5超過900的情況,看下我自身的業務邏輯會怎麼走?我們不能每天在那裡等pm2.5超過900才去做測試,是以可以做一個Mock。

我們新增一個天氣的Mock,然後選擇Http,填個Mock名字,然後API的話,把接口url填這裡。那傳回值的話,我們可以先從真實的傳回值裡面做修改,把真實調用的傳回結果拷貝下,我們希望pm2.5非常高,那把原先的pm2.5值修改為999。這樣子的話,一個最簡單的Mock就定義好了。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

我們接着做一次對域名的切換,比如說原先是指向真實的伺服器,現在改成我們的一個Mock伺服器,我們把這個域名指向Mock伺服器,然後再做次重新整理,可以看到pm2.5就變成999,我們的Mock就生效了,這就是一個最簡單的Http的Mock使用場景。

<b>Mock平台進階功能</b>

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

基礎功能基本上可以解決大部分的日常使用問題,Mock平台還有一些比較進階的特性。比如說我們<b>支援動态Mock</b>。當我們需要寫一些很複雜的邏輯時,例如:希望當參數沒傳的時候,傳回一個error資訊,我們可以在這裡用Java的一個傳回結果,然後在這裡寫具體的一個腳本。比如說city=杭州。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

這就是舉一個最簡單的例子,你可以在這裡寫任意的一個代碼。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

然後再講一下<b>比對規則</b>。比如說當city=羅馬的時候,我們會輸出一個失敗,因為還沒有羅馬這個城市的支援情況。當Admin來通路的時候,我們會打出另外一種情況,這裡大家注意到有權重的問題,就是說當Mock比對到了以後,它會以權重值來決定它的優先級。比如說當city=羅馬時,它會說我們還不支援的城市,但是當city=羅馬&amp;admin,會輸出管理者你說了算,因為管理者的權重比羅馬要高。這就是一個比對規則。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

<b>前置步驟:</b>主要是做一些自定義的解析。比如在前置步驟裡,我先定義一些變量,比如說a=hello,那可以直接在表達式裡面直接引用這個a。"你說了算${a}",最終輸出為"你說了算hello",這就是前置步驟的一個用法。

<b>Mock錄制:</b>你可以在沒有任何Mock的情況下,先把你的域名綁定到Mock平台,它會先請求Mock平台,然後把你的入參拿到一個真實的伺服器平台去請求,拿到一個具體的傳回值,這樣有了入參和傳回值,還有具體的API後,就會生成一個具體的Mock。這在初期快速建立Mock的一些資料的時候會用到。

<b> </b>

<b>内置子產品:</b>主要是基于動态Mock的基礎上,我們内置了很多子產品:随機字元串,Json或者Xml的解析,Http調用,資料庫等。

<b>回調:</b>有些服務希望在Mock請求到以後,由Mock發起一個新的請求到一個具體的位址,做一些回調用。

這裡有個封包的示範。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

一般情況下會用的比較多。比如說參數是一個很大的封包,結果裡面也是一個封包,但是傳回結果裡面的某些值,假設這個傳回結果的這個城市,它需要根據入參的城市來做一個定義,就可以用這種形式。

如何讓測試少加班?阿裡Mock平台使用方法揭秘!

比如再看這個例子,可以看到它的包裡是這麼一個封包,Mock以後,就是我們Mock它的一個封包。剛才看到,城市是可以動态的根據入參封包的那個動态修改,比如說檢視北京的,那它就會報北京的資料,對于金融類企業,這種是比較有用的。

<b>填寫需求後我們會盡快與您聯系!</b>

<b>常見問題</b>

<b>問1:如果我希望不同的入參,能傳回不同的值,那我們具體要怎麼做呢?</b>

<b>答1:</b>其實Mock平台是支撐三種不同的做法。一個動态表達式,還有程式設計模式,還有比對規則,那這三個分别在什麼場景下用呢?

動态表達式比較适合于你的傳回值是一個模闆,就是有模闆可套的,比如是一個很大的封包,隻是裡面狀态或者說裡面的code,會随着入參的不同而不同。在這種情況下,你完全可以把入參中的code或者是狀态,用動态表達式的方式來做。

第二種就是它的傳回值完全不一樣,就完全不是同一套模闆,格式也可能不一樣。這種情況下,可以用之前的if else來寫,比如說當入參等于多少的時候,你傳回這樣一個模闆。

第三種情況,就是當你覺得寫代碼比較困難,或者覺得沒必要的時候,可以用比對規則。比如說入參等于多少的時候,你可以設定一個規則,它傳回什麼樣的參數,當入參等于另外一個規則的時候,傳回另外一個參數。

以上三種情況可以根據具體情況結合操作。

<b>問2:用了這個Mock平台以後,開發代碼要怎麼配合修改呢?</b>

<b>答2:</b>我覺得開發代碼一般情況下是不用改的。對于http類型,開發經常會用一些域名加端口加API的方式通路,你完全可以把API配到Mock平台上,然後通過修改這個域名對應的host,或者說DNS來切換一個真實的測試環境和Mock環境。對于rpc類型的話,我們一般會有自己的一些配置,會選擇直連一個提供者,他可以把提供者的IP,也就是Mock平台的IP配進去。

<b>問3:假設我是同一個接口,然後我有不同的項目在并行開發,但我希望A項目的調用,傳回的是A,B項目的話傳回是B,那我們Mock平台,隻能配一個Mock怎麼辦?</b>

<b>答3:</b>這裡可以用IP來區分,我們可以用比對規則的IP屬性,當IP等于A項目,我們可以給它傳回A項目的一個資料,如果IP是B項目,那就是傳回B項目的一個資料。

<b>問4:對于rpc請求,可能就是把API包上傳到mock平台上。有些同學可能會說他的API包,不在一個裡面,是分散到各個Jar包裡面的怎麼辦?</b>

<b>答4:</b>我們其實也考慮到這個情況,讓那個Jar包管理子產品裡面有一個添加依賴的方式,你可以把多個Jar包同時上傳到平台上。

<b>問5:假設我現在剛開始做,隻需要Mock服務裡的一個方法,怎麼辦?</b>

<b>答5:</b>這個不用擔心。比如說你有5個方法,你隻實作了其中1個Mock方法,其餘4個會真實調用你的測試環境,是以你可以了解這4個是不變的,隻是某1個你用了Mock。

<b>問6:可能會有一些同學發現,就是我Mock一個請求過來,可能會有非常多個Mock全都比對到,那調用的時候到底調用哪一個呢?</b>

<b>答6:</b>上面也說過,我們有一個比對規則的權重,權重數字大的肯定會比權重小的優先調用,如果沒有比對規則的話,會有一個新舊的順序,新的Mock會覆寫舊的Mock的傳回值。

<b>PDF下載下傳:</b>點選<b>附件</b>下載下傳