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