高復(fù)用性自動(dòng)化腳本設(shè)計(jì)實(shí)踐
作者:京東物流 劉紅妍
導(dǎo)讀:
在自動(dòng)化測(cè)試實(shí)踐中,為了更好的契合被測(cè)業(yè)務(wù)場(chǎng)景,需要不斷優(yōu)化框架分層結(jié)構(gòu)。本文結(jié)合產(chǎn)品模塊化思路,意在介紹通過(guò)策略模式改造原本復(fù)雜分支語(yǔ)句代碼,通過(guò)理論講解、思路分析、方案設(shè)計(jì)、及代碼演示,提供自動(dòng)化腳本重構(gòu)的落地方案。
在今年的敏捷團(tuán)隊(duì)建設(shè)中,我通過(guò)Suite執(zhí)行器實(shí)現(xiàn)了一鍵自動(dòng)化單元測(cè)試。Juint除了Suite執(zhí)行器還有哪些執(zhí)行器呢?由此我的Runner探索之旅開始了!
1 痛點(diǎn)
隨著運(yùn)輸業(yè)務(wù)場(chǎng)景的不斷豐富和自動(dòng)化腳本量的不斷累積,日常在review用例時(shí)發(fā)現(xiàn),目前大家仍停留在針對(duì)需求定制化用例編寫,無(wú)法提高用例可復(fù)用性和可編排性。當(dāng)業(yè)務(wù)流程中間某一環(huán)節(jié)發(fā)生變化時(shí),不但需要重新修改腳本,還會(huì)影響當(dāng)前應(yīng)用其他用例執(zhí)行結(jié)果。所以,如何設(shè)計(jì)高復(fù)用性腳本成為目前自動(dòng)化建設(shè)的關(guān)鍵節(jié)點(diǎn)。
設(shè)計(jì)理論
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過(guò)表達(dá)式引擎解析表達(dá)式并取得正確的值,通過(guò)事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁(yè)面展示到屏幕。從設(shè)計(jì)稿出發(fā),提升頁(yè)面搭建效率,亟需解決的核心問(wèn)題有:
2.1 設(shè)計(jì)理念
根據(jù)面向?qū)ο蟪绦蛟O(shè)計(jì)理念,設(shè)計(jì)者應(yīng)遵循高內(nèi)聚與低耦合原則,通常程序結(jié)構(gòu)中各模塊的內(nèi)聚程度越高,模塊間的耦合程度就越低。高內(nèi)聚意味著一個(gè)類所能提供的功能應(yīng)該是相關(guān)的,即一個(gè)類不要設(shè)計(jì)得包括很多互不相干的功能,低耦合代表要合理規(guī)劃模塊的顆粒度,即要保證一個(gè)模塊可獨(dú)立存在,降低模塊之間復(fù)雜依賴關(guān)系。
2.2 策略模式
策略模式定義了一系列的算法,將每一組相關(guān)的算法封裝起各個(gè)策略分支,從而將分支相關(guān)的代碼隱藏起來(lái),并且使它們之間可以相互替換。策略模式讓算法的變化不會(huì)影響到使用算法的客戶,希望可以提高程序的可擴(kuò)展性。
解決思路
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過(guò)表達(dá)式引擎解析表達(dá)式并取得正確的值,通過(guò)事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁(yè)面展示到屏幕。從設(shè)計(jì)稿出發(fā),提升頁(yè)面搭建效率,亟需解決的核心問(wèn)題有:
3.1 基本思路
根據(jù)運(yùn)輸業(yè)務(wù)同一個(gè)流程存在不同場(chǎng)景,如詢價(jià)服務(wù)接上游下發(fā)詢價(jià)單節(jié)點(diǎn),需要區(qū)分來(lái)源執(zhí)行不同邏輯,目前設(shè)計(jì)五個(gè)算法能力,根據(jù)后期業(yè)務(wù)不斷擴(kuò)展,還會(huì)有更多算法加入進(jìn)來(lái),這個(gè)時(shí)候需要考慮一個(gè)好的結(jié)構(gòu)對(duì)代碼進(jìn)行優(yōu)化??赡芮捌诖蠹彝ㄟ^(guò)if...elif...else 分支語(yǔ)句就可實(shí)現(xiàn),但在考慮系統(tǒng)的健壯性和可維護(hù)性,這里就不能大量使用if分支語(yǔ)句。因?yàn)槊恳环N算法能力的代碼量極大且算法參數(shù)幾十個(gè),在隨著更多上游接入可能存在十幾個(gè)甚至更多else分支,很容易顧此失彼,牽一發(fā)而動(dòng)全身。所以,利用策略模式設(shè)計(jì)一系列算法,再供用例拼裝調(diào)用,提高代碼的可讀性和可復(fù)用性。
3.2 方案分析
優(yōu)點(diǎn):
1. 代碼解耦,便于維護(hù);
2. 避免使用難以維護(hù)的多重條件選擇語(yǔ)句;
3. 可以運(yùn)行時(shí)動(dòng)態(tài)切換算法;
4. 開閉原則。無(wú)須對(duì)上下文代碼進(jìn)行修改,就可以添加新的代碼。
缺點(diǎn):
1. 如果算法邏輯,較為固定,不經(jīng)常修改,使用策略模式只會(huì)增加代碼量
2. 必須知道所有的具體策略類及它們的區(qū)別。
方案概述
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過(guò)表達(dá)式引擎解析表達(dá)式并取得正確的值,通過(guò)事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁(yè)面展示到屏幕。
4.1 環(huán)境依賴
Laputa框架簡(jiǎn)介:
Laputa框架基于 Pytest 集成了對(duì)API接口自動(dòng)化, 以及對(duì) Web應(yīng)用, 移動(dòng)端應(yīng)用和 Windows 桌面應(yīng)用 UI 等自動(dòng)化的能力。具有可視化的Web界面工具, 便于配置執(zhí)行規(guī)則,關(guān)聯(lián)執(zhí)行腳本, 觸發(fā)用例執(zhí)行,查看執(zhí)行結(jié)果。提供CI集成服務(wù),調(diào)用Jenkins API跟蹤持續(xù)集成結(jié)果,開放接口,實(shí)現(xiàn)流水線自動(dòng)化測(cè)試。
圖1 自動(dòng)化框架架構(gòu)圖
4.2 分層改造
圖2 自動(dòng)化用例分層圖
4.3 策略設(shè)計(jì)
圖3 策略模式設(shè)計(jì)圖
4.4 操作步驟
1. 將頻繁修改的算法進(jìn)行抽取,獨(dú)立為具體的算法類;
2.創(chuàng)建抽象基類,實(shí)現(xiàn)一個(gè)約定的抽象策略方法;
3. 所有獨(dú)立的算法類,必須實(shí)現(xiàn)基類中的抽象策略接口;
4. 建立上下類,該類可以動(dòng)態(tài)的對(duì)算法進(jìn)行setter,創(chuàng)建調(diào)用具體算法的方法,上下文可通過(guò)該方法與具體的策略交互;
5. 客戶端進(jìn)行調(diào)用,傳入具體的算法類,上下文動(dòng)態(tài)執(zhí)行具體的算法任務(wù)。
設(shè)計(jì)實(shí)踐
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過(guò)表達(dá)式引擎解析表達(dá)式并取得正確的值,通過(guò)事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁(yè)面展示到屏幕。
5.1 詢價(jià)接單接口改造
如源代碼結(jié)構(gòu),根據(jù)不同業(yè)務(wù)來(lái)源,寫在一個(gè)方法里通過(guò)if...else...分別組裝場(chǎng)景,一旦上游任一系統(tǒng)存在需求變動(dòng),當(dāng)前接單接口調(diào)用邏輯需要變動(dòng):
改造結(jié)構(gòu):
上下文類
算法基類:
不同算法:
算法注入使用:
當(dāng)有需求變動(dòng),只需修改其一策略規(guī)則內(nèi)部代碼,如【分單策略需求】,除運(yùn)輸內(nèi)部系統(tǒng)TFC下發(fā)詢價(jià)指定個(gè)體標(biāo)簽,其他上游沒(méi)有增加標(biāo)簽下發(fā)功能,則只需修改CreateTFCEnquiryBill()代碼即可。
5.2 Common用例組裝
拼接task客戶端方法組成case,利用feature組裝測(cè)試數(shù)據(jù),數(shù)據(jù)驅(qū)動(dòng)測(cè)試方法執(zhí)行。
總結(jié)
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過(guò)表達(dá)式引擎解析表達(dá)式并取得正確的值,通過(guò)事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁(yè)面展示到屏幕。
隨著運(yùn)輸八大產(chǎn)品建設(shè)方向逐步明確,自動(dòng)化平臺(tái)需要從應(yīng)用維度重構(gòu)到產(chǎn)品維度,在腳本不斷融合和解耦過(guò)程,如何在新的分層模式設(shè)計(jì)高復(fù)用性腳本,需要大家結(jié)合各自業(yè)務(wù)條線不斷優(yōu)化改進(jìn)。