減少聯(lián)調(diào)、高效集成,試試這個工具
這里是Z哥的個人公眾號
每周五11:45 按時送達
當然了,也會時不時加個餐~
我的第「217」篇原創(chuàng)敬上
大家好,我是Z哥。
最近在工作中學(xué)習(xí)到一個我覺得很有價值的小工具,在這里與大家分享一下。
這個小工具需要自己稍作開發(fā),并不存在什么第三方的現(xiàn)成工具供你使用,因為這個工具的核心關(guān)鍵是「數(shù)據(jù)」,而「數(shù)據(jù)」這個東西對于不同的項目天然是不同的。
可能有的小伙伴已經(jīng)猜到了,我今天要聊的就是一個mock工具(暫且叫這個名字吧,它的能力其實不僅僅只是mock數(shù)據(jù))。
多團隊協(xié)作中,很多功能的實現(xiàn)需要依賴于其它的子系統(tǒng)。這不但影響開發(fā)進度,還會導(dǎo)致測試工作開展不太順利。這個問題在涉及多團隊協(xié)作的分布式系統(tǒng)中尤其突出。
如果每個子系統(tǒng)都能夠內(nèi)置一個mock工具(模塊),通過數(shù)據(jù)的自動生成,導(dǎo)入和導(dǎo)出,可以靈活地在不同環(huán)境上快速地讓系統(tǒng)run起來,哪怕自己還沒有真正地完成內(nèi)部的業(yè)務(wù)邏輯代碼編寫。
可能你會覺得說,現(xiàn)在很多工具都支持根據(jù)定義的API自動生成mock數(shù)據(jù)啊,postman、apifox、yapi等等,為啥還要自己搞呢。
最大的價值在于以下幾點:
這種方式支持在不同環(huán)境提供一份相同的數(shù)據(jù)(如唯一id等等),便于對相關(guān)的上下游系統(tǒng)屏蔽掉環(huán)境不同的影響。而使用上面提到的工具很難實現(xiàn)這點。
導(dǎo)入和導(dǎo)出功能可以作為在沒有打通上下游系統(tǒng)之前的手動關(guān)聯(lián)上下游系統(tǒng)的一種方式。
自動生成的數(shù)據(jù)可以針對多個API進行共享使用,以模擬“上下文”的感覺,讓mock這件事變得更加貼近真實,而不是很假,不管輸入的參數(shù)是什么,都只能固定返回某個數(shù)據(jù)。
基于上面第3點,我們可以再通過某種語法,串聯(lián)起多個API的調(diào)用,快速驗證mock出來的數(shù)據(jù)是否符合預(yù)期。并且這個串聯(lián)調(diào)用的case可以保存下來,在真實的業(yè)務(wù)邏輯實現(xiàn)后再運行一下,快速驗證自己的真實實現(xiàn)是不是存在什么bug。相當于同時編寫了一個針對該項目定制的自動化測試工具。
基于上面第4點,可以不斷地豐富case,以提高case所覆蓋的場景。這不但豐富了數(shù)據(jù)樣本,也提高了使用該工具進行自動化測試的效果。
總體來看,這樣一個工具我們在實現(xiàn)的時候需要具備以下這些能力。
自動生成mock數(shù)據(jù)
清除數(shù)據(jù)
導(dǎo)入數(shù)據(jù)
導(dǎo)出數(shù)據(jù)
mock開關(guān)
mock數(shù)據(jù)的條件匹配
mock外部依賴數(shù)據(jù)
下面我們一個個展開說說。
/01??自動生成mock數(shù)據(jù)/
自動生成mock數(shù)據(jù)是這個工具的最核心功能。但在這之前還有一件更加重要的事情要做,就是:需要提前確定對外提供的 API 契約,如此才能得到相應(yīng)的輸入和輸出參數(shù)。然后我們再考慮如何生成mock數(shù)據(jù)的事情。
當然,生成的數(shù)據(jù)必須要符合契約定義中的標準。比如,
字段的格式。int32還是int64?字符串的格式等等。
入?yún)⒑统鰠⒌南嚓P(guān)性,比如輸入?yún)?shù)中傳入的單據(jù)號,應(yīng)該與輸出參數(shù)中的單據(jù)號保持一致,以體現(xiàn)輸入和輸出之間的相關(guān)性。
……
其次,生成的mock數(shù)據(jù),需要盡可能地覆蓋更多的場景。
另外,生成的mock數(shù)據(jù)中如果存在一些依賴于外部系統(tǒng)的唯一ID,允許傳入一個ID生成器的hook,確保生成的Mock數(shù)據(jù)中的唯一ID在指定范圍內(nèi)。
然后,生成的mock數(shù)據(jù)需要持久化到硬盤上,以提供長期使用。
最后,可以指定生成某個API相關(guān)的mock數(shù)據(jù),而非全部數(shù)據(jù)。
/02??清除數(shù)據(jù)/
可以通過清除數(shù)據(jù),重置mock數(shù)據(jù)回到初始狀態(tài),以清理不符合當前API標準的垃圾數(shù)據(jù)。實現(xiàn)這個功能主要有兩個點:
清除數(shù)據(jù)時需要考慮數(shù)據(jù)間的關(guān)聯(lián)關(guān)系,比如清除單據(jù)類數(shù)據(jù)時,也應(yīng)當清除與該單據(jù)相關(guān)的明細數(shù)據(jù)。
可以指定清除某個指定API的mock數(shù)據(jù),而非全部數(shù)據(jù)。
/03? 導(dǎo)入數(shù)據(jù)/
通過配合導(dǎo)入mock數(shù)據(jù)功能,快速復(fù)制出一個完全相同的mock環(huán)境。實現(xiàn)這點也有兩個點:
可以導(dǎo)出指定API的mock數(shù)據(jù),而非全部數(shù)據(jù)。?
導(dǎo)出的數(shù)據(jù)建議為csv或者excel格式,便于二次編輯。
/04? 導(dǎo)出數(shù)據(jù)/
通過配合導(dǎo)出mock數(shù)據(jù)功能,快速復(fù)制出一個完全相同的mock環(huán)境。
導(dǎo)入數(shù)據(jù)時,需要進行數(shù)據(jù)合法性驗證。如果數(shù)據(jù)不合法,需要進行處理,有兩種情況:
缺失的數(shù)據(jù),如果可以自動填充缺省值,則自動修正。
非法數(shù)據(jù)或者無法自動填充的缺失數(shù)據(jù),進行相應(yīng)的提示。
/05??mock開關(guān)/
通過控制開關(guān),靈活切換使用真實業(yè)務(wù)存儲中的數(shù)據(jù)還是使用Mock存儲中的數(shù)據(jù)。
/06??mock數(shù)據(jù)的條件匹配/
可以對mock數(shù)據(jù)的返回內(nèi)容進行「條件匹配」配置,以滿足兩種能力:
1. 限定返回的數(shù)據(jù)范圍。
2. 實現(xiàn)返回的出參一定與入?yún)⒋嬖谙嚓P(guān)性。
/07? mock外部依賴數(shù)據(jù)/
可以將以上能力運用在所依賴的外部數(shù)據(jù)上,以提供系統(tǒng)「無依賴獨立運行」的能力。
具備這個能力后,你所負責系統(tǒng)的測試工作可以不用等待所依賴的外部系統(tǒng)全部都準備就緒后才能開展,可以獨立進行。
好了,就這么多??赡苡械男』锇闀X得,要實現(xiàn)這么多能力,得多大工作量啊。
我覺得這個問題不能這么考慮,我們還要考慮這個工具可以節(jié)省多少時間。節(jié)約的這個時間不僅僅是你自己做自測的時間,還有團隊中其他人的時間。而且這個工具可以長期反復(fù)使用,時間拉得越長,它所發(fā)揮的價值也越大。
慣例總結(jié)一下。
這篇呢,Z哥和你分享了一個我認為很有價值的工具,一個需要我們自行開發(fā)的mock工具,它可以提升整個團隊的長期效能。
這個工具需要實現(xiàn)以下7個能力:
自動生成mock數(shù)據(jù)
清除數(shù)據(jù)
導(dǎo)入數(shù)據(jù)
導(dǎo)出數(shù)據(jù)
mock開關(guān)
mock數(shù)據(jù)的條件匹配
mock外部依賴數(shù)據(jù)
我相信,一旦你提供了這個工具,在團隊中你將擁有很好的人緣和口碑~
不知道你是如何看待類似的mock工具的?歡迎和大家一起聊聊你的看法~
推薦閱讀:
原創(chuàng)不易,如果你覺得這篇文章還不錯,就「點贊」或者「在看」一下吧,鼓勵我的創(chuàng)作 :)
也可以分享我的公眾號名片給有需要的朋友們。
如果你有關(guān)于軟件架構(gòu)、分布式系統(tǒng)、產(chǎn)品、運營的困惑
可以試試點擊「閱讀原文」
