網(wǎng)上有很多關(guān)于pos機(jī)圖標(biāo)設(shè)計(jì)ui,高復(fù)用性自動(dòng)化腳本設(shè)計(jì)實(shí)踐的知識(shí),也有很多人為大家解答關(guān)于pos機(jī)圖標(biāo)設(shè)計(jì)ui的問題,今天pos機(jī)之家(www.rcqwhg.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
1、pos機(jī)圖標(biāo)設(shè)計(jì)ui
pos機(jī)圖標(biāo)設(shè)計(jì)ui
Tech導(dǎo)讀 在自動(dòng)化測試實(shí)踐中,為了更好的契合被測業(yè)務(wù)場景,需要不斷優(yōu)化框架分層結(jié)構(gòu)。本文結(jié)合產(chǎn)品模塊化思路,意在介紹通過策略模式改造原本復(fù)雜分支語句代碼,通過理論講解、思路分析、方案設(shè)計(jì)、及代碼演示,提供自動(dòng)化腳本重構(gòu)的落地方案。01
痛點(diǎn)
在今年的敏捷團(tuán)隊(duì)建設(shè)中,我通過Suite執(zhí)行器實(shí)現(xiàn)了一鍵自動(dòng)化單元測試。Juint除了Suite執(zhí)行器還有哪些執(zhí)行器呢?由此我的Runner探索之旅開始了!
隨著運(yùn)輸業(yè)務(wù)場景的不斷豐富和自動(dòng)化腳本量的不斷累積,日常在review用例時(shí)發(fā)現(xiàn),目前大家仍停留在針對(duì)需求定制化用例編寫,無法提高用例可復(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)。
02
設(shè)計(jì)理論
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過表達(dá)式引擎解析表達(dá)式并取得正確的值,通過事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁面展示到屏幕。從設(shè)計(jì)稿出發(fā),提升頁面搭建效率,亟需解決的核心問題有:
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)的代碼隱藏起來,并且使它們之間可以相互替換。策略模式讓算法的變化不會(huì)影響到使用算法的客戶,希望可以提高程序的可擴(kuò)展性。
03
解決思路
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過表達(dá)式引擎解析表達(dá)式并取得正確的值,通過事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁面展示到屏幕。從設(shè)計(jì)稿出發(fā),提升頁面搭建效率,亟需解決的核心問題有:
3.1 基本思路
根據(jù)運(yùn)輸業(yè)務(wù)同一個(gè)流程存在不同場景,如詢價(jià)服務(wù)接上游下發(fā)詢價(jià)單節(jié)點(diǎn),需要區(qū)分來源執(zhí)行不同邏輯,目前設(shè)計(jì)五個(gè)算法能力,根據(jù)后期業(yè)務(wù)不斷擴(kuò)展,還會(huì)有更多算法加入進(jìn)來,這個(gè)時(shí)候需要考慮一個(gè)好的結(jié)構(gòu)對(duì)代碼進(jìn)行優(yōu)化。可能前期大家通過if...elif...else 分支語句就可實(shí)現(xiàn),但在考慮系統(tǒng)的健壯性和可維護(hù)性,這里就不能大量使用if分支語句。因?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ù)的多重條件選擇語句;
3. 可以運(yùn)行時(shí)動(dòng)態(tài)切換算法;
4. 開閉原則。無須對(duì)上下文代碼進(jìn)行修改,就可以添加新的代碼。
缺點(diǎn):
1. 如果算法邏輯,較為固定,不經(jīng)常修改,使用策略模式只會(huì)增加代碼量
2. 必須知道所有的具體策略類及它們的區(qū)別。
04
方案概述
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過表達(dá)式引擎解析表達(dá)式并取得正確的值,通過事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁面展示到屏幕。
4.1 環(huán)境依賴
Laputa框架簡介:
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)化測試。
圖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)用具體算法的方法,上下文可通過該方法與具體的策略交互;
5. 客戶端進(jìn)行調(diào)用,傳入具體的算法類,上下文動(dòng)態(tài)執(zhí)行具體的算法任務(wù)。
05
設(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)換完成后將通過表達(dá)式引擎解析表達(dá)式并取得正確的值,通過事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁面展示到屏幕。
5.1 詢價(jià)接單接口改造
如源代碼結(jié)構(gòu),根據(jù)不同業(yè)務(wù)來源,寫在一個(gè)方法里通過if...else...分別組裝場景,一旦上游任一系統(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:passelif params[0].get("enquiryWay") == 2 and params[0].get("payMode") == 2:passelif params[0].get("enquiryWay") == 2 and params[0].get("payMode") == 3:passif params[0].get("enquirySource") == 46:passif 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)前場景參數(shù)與基礎(chǔ)參數(shù)改動(dòng)較大建議直接在Yaml里另寫Keyparams = 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: 測試場景:執(zhí)行步驟,執(zhí)行數(shù)據(jù) Returns: """ if algorithm: # 采用字典形式進(jìn)行手動(dòng)注冊算法,由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)簽,其他上游沒有增加標(biāo)簽下發(fā)功能,則只需修改CreateTFCEnquiryBill()代碼即可。
5.2 Common用例組裝
拼接task客戶端方法組成case,利用feature組裝測試數(shù)據(jù),數(shù)據(jù)驅(qū)動(dòng)測試方法執(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)
06
總結(jié)
理解,首先 MCube 會(huì)依據(jù)模板緩存狀態(tài)判斷是否需要網(wǎng)絡(luò)獲取最新模板,當(dāng)獲取到模板后進(jìn)行模板加載,加載階段會(huì)將產(chǎn)物轉(zhuǎn)換為視圖樹的結(jié)構(gòu),轉(zhuǎn)換完成后將通過表達(dá)式引擎解析表達(dá)式并取得正確的值,通過事件解析引擎解析用戶自定義事件并完成事件的綁定,完成解析賦值以及事件綁定后進(jìn)行視圖的渲染,最終將目標(biāo)頁面展示到屏幕。
隨著運(yùn)輸八大產(chǎn)品建設(shè)方向逐步明確,自動(dòng)化平臺(tái)需要從應(yīng)用維度重構(gòu)到產(chǎn)品維度,在腳本不斷融合和解耦過程,如何在新的分層模式設(shè)計(jì)高復(fù)用性腳本,需要大家結(jié)合各自業(yè)務(wù)條線不斷優(yōu)化改進(jìn)。
作者:劉紅妍
來源:微信公眾號(hào):京東技術(shù)
出處:https://mp.weixin.qq.com/s/iDWtkOqGposBv9kklHbl_A
以上就是關(guān)于pos機(jī)圖標(biāo)設(shè)計(jì)ui,高復(fù)用性自動(dòng)化腳本設(shè)計(jì)實(shí)踐的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)圖標(biāo)設(shè)計(jì)ui的知識(shí),希望能夠幫助到大家!