眾所周知,日益復(fù)雜的系統(tǒng)和日漸嚴(yán)格的用戶體驗(yàn),使得軟件測(cè)試人員的任務(wù)愈發(fā)繁重,人工測(cè)試投入隨之增加,也由于測(cè)試技能水平差異,導(dǎo)致軟件質(zhì)量輸出不穩(wěn),故而,在實(shí)際工作中,我們經(jīng)常會(huì)考慮如何把人為驅(qū)動(dòng)的測(cè)試行為轉(zhuǎn)化為機(jī)器自動(dòng)執(zhí)行,做到一定程度上的節(jié)流提效,保障測(cè)試覆蓋度和質(zhì)量。
蘇寧一直致力于自動(dòng)化測(cè)試能力建設(shè),蘇寧自動(dòng)化測(cè)試工具(Suning Automation Tester),簡(jiǎn)稱“SAT”,基于 JAVA 語(yǔ)言實(shí)現(xiàn),采用自動(dòng)化測(cè)試架構(gòu)中的關(guān)鍵字驅(qū)動(dòng)(Keyword)思想,使測(cè)試設(shè)計(jì)和測(cè)試實(shí)現(xiàn)分離,將實(shí)現(xiàn)不同公共組件類、業(yè)務(wù)類 Keyword 集成到一個(gè)用例中運(yùn)行,也最大限度地實(shí)現(xiàn) Keyword 共享,降低測(cè)試組重復(fù)開(kāi)發(fā)的工作量;從 13 年開(kāi)始逐步實(shí)現(xiàn)集 WEB 頁(yè)面、HTTP 協(xié)議、手機(jī)終端應(yīng)用、數(shù)據(jù)庫(kù)操作、LINUX 操作等方面的測(cè)試能力支持,產(chǎn)品已相當(dāng)成熟。
本文涉及到的技術(shù)實(shí)現(xiàn)不再依賴 SAT 工具,而是基于 Python 語(yǔ)言實(shí)現(xiàn)的 Web 應(yīng)用與 Client 應(yīng)用的交互,主要結(jié)合數(shù)據(jù)驅(qū)動(dòng)、結(jié)構(gòu)化、關(guān)鍵字驅(qū)動(dòng)等腳本技術(shù)思想,進(jìn)而設(shè)計(jì)的完整交互方案。
該方案根據(jù)我們實(shí)際產(chǎn)品框架的情況定制設(shè)計(jì)了自動(dòng)化測(cè)試框架,主要實(shí)現(xiàn)了業(yè)務(wù)數(shù)據(jù)交互,執(zhí)行指令交互,任務(wù)執(zhí)行交互,終端調(diào)用管理,腳本版本管理等,在腳本復(fù)用、迭代及代碼健壯性上都有極大提升;除實(shí)際業(yè)務(wù)數(shù)據(jù)外,其他均實(shí)現(xiàn)配置化,更容易維護(hù),也可根據(jù)業(yè)務(wù)變化自由配置規(guī)則。以下就具體闡述我們的實(shí)現(xiàn)過(guò)程。
一、我們的目標(biāo)及現(xiàn)狀分析
1.1 我們的現(xiàn)狀和目標(biāo)
在介紹我們的目標(biāo)之前,先通過(guò)圖 1 了解簡(jiǎn)化版產(chǎn)品應(yīng)用框架(實(shí)際產(chǎn)品框架遠(yuǎn)比此圖呈現(xiàn)的復(fù)雜)、人工測(cè)試及自動(dòng)化測(cè)試平臺(tái)之間的關(guān)系,特別說(shuō)明 SYSTEM-A 和 B 均是無(wú) UI 界面的底層應(yīng)用系統(tǒng)。
因?yàn)楫a(chǎn)品應(yīng)用架構(gòu)中存在一些系統(tǒng)是屬于 B 端底層應(yīng)用服務(wù)器的應(yīng)用和 C 端的 SAP 系統(tǒng),根本無(wú)可視化 UI 界面提供,測(cè)試人員只能被動(dòng)接收這種無(wú) UI 界面的底層應(yīng)用和 C 端的測(cè)試,測(cè)試的入口是某個(gè)數(shù)據(jù)接收的接口,但測(cè)試結(jié)果檢查過(guò)程復(fù)雜且繁瑣,人工測(cè)試要花費(fèi)大量的時(shí)間在底層應(yīng)用上測(cè)試。
所以,我們的目標(biāo)是要實(shí)現(xiàn) B 端 Web 應(yīng)用系統(tǒng)與 C 端客戶端應(yīng)用兩套系統(tǒng)之間的交互,以解決底層應(yīng)用檢查繁瑣以及與 C 端交互數(shù)據(jù)的處理等問(wèn)題,實(shí)時(shí)監(jiān)控測(cè)試數(shù)據(jù)處理過(guò)程和結(jié)果,具體來(lái)說(shuō),Web 應(yīng)用與 SAP 系統(tǒng)之間自動(dòng)化調(diào)用和檢查。
1.2 我們?cè)谟玫南到y(tǒng)
自動(dòng)化測(cè)試平臺(tái)系統(tǒng)(testingland),是測(cè)試開(kāi)發(fā)團(tuán)隊(duì)完全自研的 Python 語(yǔ)言編碼實(shí)現(xiàn)的 B/S 架構(gòu)系統(tǒng),為重要產(chǎn)品線提供定制的自動(dòng)化測(cè)試框架及服務(wù),為 B 端和 C 端系統(tǒng)間自動(dòng)調(diào)用交互搭建了橋梁,也作為測(cè)試入口進(jìn)行自動(dòng)化測(cè)試實(shí)施。
SAP,眾所周知,既是全球企業(yè)管理軟件與解決方案的技術(shù)領(lǐng)袖的公司名稱,又是其產(chǎn)品—企業(yè)管理解決方案的軟件名稱;而我們團(tuán)隊(duì)所對(duì)接的是 SAP R/3 系統(tǒng),涉及財(cái)務(wù) FI、CO 模塊的賬務(wù)處理。
1.3 我們的調(diào)研結(jié)果、驗(yàn)證和分析
現(xiàn)將 C 端 SAP 系統(tǒng)部署在 OS 為 Windows 系統(tǒng)上,如何實(shí)現(xiàn) B 端 Web 應(yīng)用調(diào)用 C 端客戶端的自動(dòng)化操作呢?
調(diào)研結(jié)果
基于 1.1 提出的目標(biāo),經(jīng)過(guò)調(diào)研,當(dāng)前業(yè)內(nèi)有兩種常用的方案:
- 方案一:通過(guò) IE 的 ActiveX 直接調(diào)用本地客戶端,無(wú)需配置注冊(cè)表,但只僅限支持 IE;
- 方案二:通過(guò) Url Protocal 協(xié)議調(diào)用本地客戶端,支持大多數(shù)常用瀏覽器 (Chrome,IE,F(xiàn)ireFox 等),但需要配置一系列的注冊(cè)表信息;
驗(yàn)證經(jīng)驗(yàn)證,這兩種方案進(jìn)行直接調(diào)用客戶端軟件,都只是簡(jiǎn)單的打開(kāi)本地軟件而已,是不能讓軟件自動(dòng)執(zhí)行后續(xù)操作的,例如:讓 SAP 自動(dòng)記個(gè)賬,并把結(jié)果返回給 Web 端。除非 SAP“成精”,否則單單是打開(kāi) SAP,它是不知道你要干什么并自動(dòng)操作自己的。
分析
從以上兩種方案來(lái)看存在的一些問(wèn)題,首先,缺乏可持續(xù)性的執(zhí)行,其次,不靈活,只支持本地,不支持遠(yuǎn)程 Agent 終端,也就是說(shuō),要打開(kāi)客戶端,必須先在同一臺(tái)機(jī)器上打開(kāi)某個(gè)瀏覽器。
針對(duì)以上分析結(jié)果,我們需要設(shè)計(jì)新的方案去解決以下問(wèn)題:如何在 Web 端自動(dòng)化操作 Windows 客戶端,而不是單一啟動(dòng)?如何自動(dòng)操作本地或遠(yuǎn)程 Agent 終端?
二、我們的解決方案
針對(duì)上述問(wèn)題,設(shè)計(jì)了一個(gè)自動(dòng)化應(yīng)用框架(見(jiàn)下圖),作為 Web 應(yīng)用與 SAP 系統(tǒng)定制的自動(dòng)化實(shí)現(xiàn)解決方案。
該方案不僅解決了自動(dòng)啟動(dòng) SAP 系統(tǒng)、后續(xù)的關(guān)聯(lián)系統(tǒng)操作和檢查,而且實(shí)現(xiàn)了用戶自主配置 Agent 信息以及自主選擇本地或遠(yuǎn)程操作 Agent 終端,還增加實(shí)現(xiàn)了持續(xù)迭代、管理、應(yīng)用以及執(zhí)行自動(dòng)化腳本,同時(shí)也做到了對(duì)結(jié)果實(shí)現(xiàn)閉環(huán)檢查和展示。
2.1 該方案具體實(shí)現(xiàn)過(guò)程:
- 用戶從 Web 端選擇執(zhí)行終端,發(fā)起入?yún)⒒驍?shù)據(jù)處理請(qǐng)求作為開(kāi)始;
- Web 應(yīng)用服務(wù)器接到請(qǐng)求后,判斷終端類型:公共遠(yuǎn)程的 Agent 還是本地個(gè)人 PC 終端,并檢查是否空閑,連接并鎖定空閑終端;
- 按步驟 2 鎖定終端后,從服務(wù)數(shù)據(jù)庫(kù)的指令庫(kù)里獲取執(zhí)行指令,通過(guò) Socket 協(xié)議進(jìn)行指令傳輸;
- 根據(jù)指令檢查基礎(chǔ)環(huán)境和待執(zhí)行腳本 / 程序版本檢測(cè)是否是最新,若不是,執(zhí)行自動(dòng)更新指令獲取最新版本,更新后進(jìn)入下一步驟;
- 在步驟 4 就緒后,執(zhí)行傳入待執(zhí)行數(shù)據(jù)指令傳輸給 C 端并開(kāi)始調(diào)用 SAP 自動(dòng)化腳本;
- 將執(zhí)行結(jié)果通過(guò) Socket 服務(wù)傳輸給 Web 服務(wù)器和前端展示。
2.2 具體問(wèn)題的解決方案
首先,解決 SAP 客戶端啟動(dòng)和后續(xù)操作的問(wèn)題。
在 Python 中,我們可以通過(guò) selenium 操作瀏覽器,可以通過(guò) win32,SAP-API 操作 SAP(值得一提的是,SAP 對(duì)自動(dòng)化操作支持非常友好,比如 session.findById 的使用),也能通過(guò) pywinauto 操作常規(guī)的客戶端。
在本方案里,通過(guò) Python 腳本代碼實(shí)現(xiàn)對(duì)客戶端的具體操作:使用 Python os 模塊執(zhí)行 cmd 命令和 win32 模塊的方式打開(kāi)并連接 SAP,當(dāng)獲取到 SAP 窗口的 session 并進(jìn)行連接后, 使用 SAP 提供的 API 進(jìn)行組件的定位、操作 (對(duì)于未提供 API 的程序, 可以使用 Python 的 pywinatuo 模塊,通過(guò) title、control 等方式定位其組件進(jìn)行操作),這些操作是在 OS 為 Windows 系統(tǒng)上是可運(yùn)行的,進(jìn)而形成相應(yīng)的腳本和執(zhí)行指令。這些腳本代碼 (或已封裝的可執(zhí)行程序) 也會(huì)自動(dòng)部署到在腳本 / 程序版本庫(kù)中進(jìn)行管理和使用。
其次,解決遠(yuǎn)程操作 Agent 終端的客戶端。
先準(zhǔn)備若干臺(tái) OS 為 Windows 的機(jī)器作為專用的 Agent 終端,啟動(dòng) Windows 代理機(jī)器上的 Python Socket 服務(wù),根據(jù) Web 下發(fā)的指令自動(dòng)下載、更新、部署自動(dòng)化執(zhí)行程序或腳本代碼到 Agent 機(jī)器本地,之后 Socket 服務(wù)繼續(xù)監(jiān)聽(tīng)后續(xù)指令的到來(lái),根據(jù)不同的指令,自動(dòng)執(zhí)行后續(xù)的步驟,并將執(zhí)行結(jié)果返回服務(wù)器直至在 Web 頁(yè)面展示執(zhí)行結(jié)果。
第三,遠(yuǎn)程 Agent 終端機(jī)器太少或太忙無(wú)空閑,怎么辦?
在解決方案中完全支持個(gè)人本地 PC 來(lái)作為單體終端,只需要提前做一些初始環(huán)境準(zhǔn)備工作,比如部署相應(yīng)版本的 Python 軟件及模塊等。
有人就會(huì)有以下疑問(wèn):那不就和 C/S 架構(gòu)沒(méi)什么區(qū)別了嗎?不還是要人工把代碼 / 打包好的軟件部署在本機(jī)上嗎?項(xiàng)目的改動(dòng)導(dǎo)致用戶頻繁變更自動(dòng)化程序帶來(lái)的弊端不還是存在嗎?放在個(gè)人 PC 本地的不是 C 端運(yùn)行程序,而是一個(gè)已封裝的 Socket 服務(wù)端,與遠(yuǎn)程 Agent 終端同理不同端而已??傊?,無(wú)論是公共的遠(yuǎn)程 Agent 終端還是個(gè)人 PC 終端都是支持自動(dòng)調(diào)用的,服務(wù)調(diào)用內(nèi)容和過(guò)程參照下圖:
三、我們用哪些主要核心技術(shù)
3.1 Socket 服務(wù)
利用 Python socket 模塊實(shí)現(xiàn) Socket 兩端服務(wù)啟動(dòng)和定制功能,并連接 B 端 Web 應(yīng)用與 C 端 SAP 系統(tǒng),使用 pyinstaller 進(jìn)行打包封裝。
Socket 服務(wù)提供方(也稱服務(wù)端)功能: 1. 監(jiān)聽(tīng)客戶端請(qǐng)求并接收請(qǐng)求數(shù)據(jù) / 指令;2. 檢測(cè) / 下載 / 更新自動(dòng)化執(zhí)行腳本 / 程序;3. 執(zhí)行自動(dòng)化腳本 / 程序并獲取執(zhí)行結(jié)果;4. 返回執(zhí)行結(jié)果給客戶端;
Socket 服務(wù)消費(fèi)方(也稱客戶端)功能: 1. 發(fā)送待執(zhí)行數(shù)據(jù) / 指令給服務(wù)端;2. 接收服務(wù)端返回的執(zhí)行結(jié)果;
通過(guò)上圖交互方案中可以看出,在連接時(shí)只要滿足服務(wù)提供方與服務(wù)消費(fèi)方是一致的 ip 和 port,再設(shè)置接發(fā)數(shù)據(jù)格式,就可以啟動(dòng)相應(yīng)的消費(fèi)方服務(wù),最終實(shí)現(xiàn) B 端的 Web 應(yīng)用與 C 端 SAP 系統(tǒng)的連接。
3.2 進(jìn)程指令調(diào)用
利用 subprocess 調(diào)用指令執(zhí)行腳本,保證 Socket 服務(wù)與腳本相互獨(dú)立;通過(guò) subprocess 的 PIPE 管道進(jìn)行傳參以及結(jié)果 / 異常的獲取。
3.3 適當(dāng)運(yùn)用終端系統(tǒng)的 cmd 或 dos 命令
利用 Windows 系統(tǒng)的 cmd 命令自動(dòng)獲取 SAP 安裝路徑 / 登錄等操作,安裝路徑獲取具體代碼如下:
# 獲取 sap 安裝路徑os.system("start saplogon.exe") # 打開(kāi)進(jìn)程cmd = 'wmic process where name="saplogon.exe" get executablepath' # cmd 命令sb = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 執(zhí)行命令
3.4 SAP 腳本編寫
使用 win32 進(jìn)行連接 SAP 并調(diào)用 SAP GUI Scripting API 進(jìn)行相關(guān)自動(dòng)化腳本編寫;SAP 控件的定位路徑可使用 SAP 錄制的腳本查看,也可使用 Scripting Tracker 工具(Development Tool for SAP GUI Scripting 工具)進(jìn)行查看。
3.5 整體技術(shù)方案
可見(jiàn)下圖,不再詳細(xì)贅述。
四、我們對(duì)實(shí)際場(chǎng)景應(yīng)用及分析
針對(duì)某記賬場(chǎng)景進(jìn)行實(shí)際對(duì)比。
4.1 人工測(cè)試所需工時(shí)
測(cè)試人員從打開(kāi) SAP 客戶端并登陸開(kāi)始生成 1 個(gè)憑證約 2min,憑證結(jié)果檢查約 1min,生成多個(gè)憑證會(huì)按系統(tǒng)按訂單成倍數(shù)增長(zhǎng),截圖并保存整理成 word 文檔約 2min。
4.2 自動(dòng)化實(shí)操
我們先看結(jié)果,實(shí)操部分日志如下:
通過(guò)日志可以看到:
- 從開(kāi)始連接 SAP 到執(zhí)行生成 5 個(gè)憑證共耗時(shí) 97 秒;
- 分別執(zhí)行 GXQ、TXQ 兩套 SAP 系統(tǒng);
- 涉及 SAP 操作有:數(shù)據(jù)接入檢查、生成憑證操作、憑證結(jié)果校驗(yàn)、返回 Web 頁(yè)面展示、憑證截圖、過(guò)程 log 展示等。
以下是我們對(duì)該記賬場(chǎng)景的實(shí)踐過(guò)程的展示,如圖 1 是涉及的前臺(tái) WEB 頁(yè)面,發(fā)起執(zhí)行請(qǐng)求,圖 2 是實(shí)現(xiàn)過(guò)程動(dòng)態(tài)效果。
圖 1
圖 2
4.3 結(jié)果分析
- 以上操作均可做到系統(tǒng)自動(dòng)檢查校驗(yàn)準(zhǔn)確且完整,實(shí)際人力投入減少近 10 倍。
- SAP 自動(dòng)化執(zhí)行效率比人員手工執(zhí)行檢查提升 5 倍以上。
- 測(cè)試人員操作更簡(jiǎn)單直接,執(zhí)行效率高;執(zhí)行結(jié)果無(wú)需切換系統(tǒng)查看,查詢更直觀;讓機(jī)器替代測(cè)試人員檢查及整理執(zhí)行結(jié)果,問(wèn)題定位和反饋精準(zhǔn),人力資源消耗成本降低。
五、總結(jié)
不得不說(shuō),自動(dòng)化的初始成本非常高,從開(kāi)始決定要解決這個(gè)交互問(wèn)題,到實(shí)際框架落地和產(chǎn)品設(shè)計(jì),再到最后代碼實(shí)現(xiàn)和項(xiàng)目應(yīng)用,我們測(cè)試開(kāi)發(fā)團(tuán)隊(duì)共耗費(fèi) 60 多人天,歷時(shí) 2 個(gè)多月,但隨之帶來(lái)的收益也相當(dāng)可觀,經(jīng)初步測(cè)算,近一年為我們團(tuán)隊(duì)節(jié)省近 5000 個(gè)工時(shí)。
從技術(shù)上來(lái)講,單純的通過(guò) Python 代碼實(shí)現(xiàn) SAP 自動(dòng)化并非難事,困難的是如何將 B 端與 C 端實(shí)現(xiàn)自動(dòng)交互,并將 Web 應(yīng)用的執(zhí)行指令正確傳達(dá)給 SAP 系統(tǒng)執(zhí)行。在我們實(shí)現(xiàn)解決方案中,通過(guò)依賴 socket 通信自建接口和服務(wù)功能解決了最直接的交互調(diào)用問(wèn)題,解決了本地或遠(yuǎn)程 Agent 終端調(diào)用問(wèn)題,實(shí)現(xiàn)了建立指令庫(kù)進(jìn)行模塊化管理,實(shí)現(xiàn)了持續(xù)迭代、自動(dòng)部署腳本功能。
作者介紹:
仲崇瑞,蘇寧科技集團(tuán)員工平臺(tái)研發(fā)中心高級(jí)測(cè)試經(jīng)理,有多年的業(yè)務(wù)及產(chǎn)品設(shè)計(jì)經(jīng)驗(yàn)和測(cè)試管理經(jīng)驗(yàn),負(fù)責(zé)蘇寧財(cái)務(wù)核算、財(cái)務(wù)共享、稅務(wù)會(huì)計(jì)及智能應(yīng)用等產(chǎn)品的測(cè)試及管理工作,涉及功能、性能、自動(dòng)化、安全等測(cè)試領(lǐng)域,帶領(lǐng)團(tuán)隊(duì)多次出色完成財(cái)務(wù)系統(tǒng)變革和切換的測(cè)試工作,致力于構(gòu)建蘇寧財(cái)務(wù)類自動(dòng)化測(cè)試產(chǎn)品解決方案,打造高效便捷的測(cè)試應(yīng)用產(chǎn)品。
關(guān)注我并轉(zhuǎn)發(fā)此篇文章,私信InfoQ“領(lǐng)取資料”,即可免費(fèi)獲得 InfoQ 價(jià)值4999元迷你書資料包!
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。