自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

高復(fù)用性自動(dòng)化腳本設(shè)計(jì)實(shí)踐

開發(fā) 項(xiàng)目管理
首先 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è)面展示到屏幕。

作者:京東物流 劉紅妍

導(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):

【python】
def receive_enquiry_bill(**kwargs):
params=[{}]
params[0].update(kwargs)
if params[0].get("enquirySource") == 8:
pass
elif params[0].get("enquiryWay") == 2 and params[0].get("payMode") == 2:
pass
elif params[0].get("enquiryWay") == 2 and params[0].get("payMode") == 3:
pass
if params[0].get("enquirySource") == 46:
pass
if params[0].get("enquirySource") == 20:
pass

改造結(jié)構(gòu):

上下文類

【python】
class AlgorithmStrategy(object):
def __init__(self, algorithm_name):
self.algorithm_name = algorithm_name


@property
def algorithm(self):
return self.algorithm_name


@algorithm.setter
def algorithm(self, name):
self.algorithm_name = name


def execute_algorithm(self, params):
return self.algorithm_name.execute(params)

算法基類:

【python】
class CreateEnquiryBillBaseAlgorithm(ABC):# 算法能力基類
@abstractmethod
def read_params(self, **kwargs):
scenario=kwargs['scenario'] if "scenario" in kwargs and kwargs['scenario'] else 'base'
return resource_custom_data[self.__class__.__name__][scenario][0].update(kwargs)


@abstractmethod
def execute(self, params):
return jsf_receive_enquiry_bill(data=json.dumps(params)

不同算法:

【python】
class CreateTFCEnquiryBill(CreateEnquiryBillBaseAlgorithm):
def read_params(self, **kwargs):
params = super().read_params(**kwargs)
params[0].update({"businessCode": kwargs['businessCode'] if 'businessCode' in kwargs else f"TJ{laputa_util.date_time_str(fmt='%y%m%d')}{laputa_util.get_random_num(8)}","receiveBeginTime": tms_util.data_time_str(minutes=100),"deliveryBeginTime": tms_util.data_time_str(minutes=180)})
return params


def execute(self, params):
return super().execute(params)


class CreateECLPClodEnquiryBill(CreateEnquiryBillBaseAlgorithm):


def read_params(self, **kwargs):
# 若當(dāng)前場(chǎng)景參數(shù)與基礎(chǔ)參數(shù)改動(dòng)較大建議直接在Yaml里另寫Key
params = super().read_params(**kwargs)
params[0].update({"businessCode": kwargs['businessCode'] if 'businessCode' in kwargs else f"ECO{laputa_util.date_time_str(fmt='%y%m%d')}{laputa_util.get_random_num(8)}","receiveBeginTime": tms_util.data_time_str(minutes=100),"deliveryBeginTime": tms_util.data_time_str(minutes=180)})
return params


def execute(self, params):
super().execute(params)
return jsf_do_assign(data=json.dumps(params))

算法注入使用:

【python】
def receive_enquiry_bill(algOne=None, sceOne=None, **kwargs):
"""
Args:
algorithm: 業(yè)務(wù)類型
scenario: 測(cè)試場(chǎng)景:執(zhí)行步驟,執(zhí)行數(shù)據(jù)
Returns:
"""
if algorithm:
# 采用字典形式進(jìn)行手動(dòng)注冊(cè)算法,由python動(dòng)態(tài)查找
st = {"TFC": CreateTFCEnquiryBill(), "ECLP冷鏈": CreateECLPClodEnquiryBill(), "TC": CreateTCEnquiryBill(),"終端用車": CreateTerminalEnquiryBill()}
query_algorithm = st.get(algOne)
return query_algorithm.execute(query_algorithm.read_params(scenario=sceOne, **kwargs))
else:
pass

當(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í)行。

【python】
@pytest.mark.parametrize("params", test_data('test_enquiry_core'), indirect=True)
def test_enquiry_core(params):
enquiry_code = receive_enquiry_bill_core(**params).get("data")
return quote_enquiry_bill_core(enquiry_code=enquiry_code, **params)

總結(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)。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-09-03 09:56:18

鴻蒙HarmonyOS應(yīng)用

2023-03-29 08:33:03

倉(cāng)儲(chǔ)自動(dòng)化系統(tǒng)

2021-02-09 08:43:18

云原生服務(wù)自動(dòng)化

2011-08-25 09:33:25

MySQL運(yùn)維

2014-03-11 11:10:10

PowerShell自動(dòng)化腳本

2023-06-30 09:46:00

服務(wù)物理機(jī)自動(dòng)化

2015-05-25 19:34:06

KickstartCentOS

2013-11-27 11:34:43

自動(dòng)化部署Python

2015-10-08 10:55:23

云服務(wù)自動(dòng)化運(yùn)維 ANSIBLE

2024-05-13 16:29:56

Python自動(dòng)化

2022-09-12 16:02:32

測(cè)試企業(yè)工具

2022-04-08 09:05:53

Arch LinuxLinux

2011-05-31 17:35:45

測(cè)試自動(dòng)化QTP

2017-10-31 15:19:24

支付通道自動(dòng)化

2014-03-11 11:03:17

自動(dòng)化腳本PowerShell

2017-03-03 09:10:09

2016-09-27 23:31:23

2016-12-20 16:47:25

Hadoop部署腳本

2009-12-15 17:28:11

Ruby自動(dòng)化腳本框架

2017-12-17 21:58:18

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)