齊飛,許諾,周含笑,馬剛
(哈爾濱航天恒星數(shù)據(jù)系統(tǒng)科技有限公司,黑龍江 哈爾濱 150028)
水務系統(tǒng)集成了物聯(lián)網(wǎng)、云計算、大數(shù)據(jù)、空間地理信息等新一代信息技術(shù),能夠?qū)崟r感知城鎮(zhèn)地下供排水運行狀態(tài),對水務信息進行及時的分析、處理,提供輔助決策支持。隨著大數(shù)據(jù)、物聯(lián)網(wǎng)、移動互聯(lián)等技術(shù)的蓬勃發(fā)展,對水務系統(tǒng)數(shù)據(jù)并行接入能力和大數(shù)據(jù)處理能力提出了更高的要求。因此,如何驗證系統(tǒng)的數(shù)據(jù)并行接入能力、大數(shù)據(jù)處理能力,提高系統(tǒng)的測試效率,成為水務系統(tǒng)測試的重點和難點。若要解決上述問題,一方面要考慮批量生成各類傳感器模擬數(shù)據(jù),另一方面要利用自動化手段來提高測試效率。近年來眾多學者在數(shù)據(jù)生成技術(shù)和自動化測試技術(shù)領域提出一系列優(yōu)化方案。其中,劉宇等人提出基于用例分析法的數(shù)據(jù)生成技術(shù),該技術(shù)可依據(jù)業(yè)務數(shù)據(jù)的基本屬性生成模擬數(shù)據(jù),且模擬數(shù)據(jù)的業(yè)務覆蓋度得到了有效提升。但并沒有考慮實際應用場景中的諸多情況,不適用于物聯(lián)網(wǎng)相關(guān)的系統(tǒng)測試。在自動化測試方面,現(xiàn)有文獻中對界面和接口兩方面的研究偏多,但對專業(yè)語言與開源測試框架相結(jié)合的技術(shù)研究還比較少。本文提出一種基于Kubernetes 的并行計算測試平臺,用以解決物聯(lián)網(wǎng)測試過程中模擬數(shù)據(jù)不具備物理屬性且測試周期長的問題。經(jīng)實踐驗證,本平臺批量生成的具備物理屬性的測試數(shù)據(jù)可以有效發(fā)現(xiàn)被測系統(tǒng)數(shù)據(jù)接入、處理能力的瓶頸,同時可基于專業(yè)領域語言測試框架有效提升測試效率。
Kubernetes 是Google 開源的容器集群管理生態(tài)系統(tǒng),它可以對容器化的應用服務提供資源監(jiān)控、調(diào)度、負載均衡、擴容等管理功能,已成為平臺管理的主流技術(shù)。Kubernetesk 可以按照預先設計的管理規(guī)則自動對平臺各Docker 容器進行激活、撤銷、重啟等監(jiān)控和調(diào)度,本文利用該技術(shù)設計管理規(guī)則,對實現(xiàn)測試平臺并發(fā)性和可靠性設計起到至關(guān)重要的作用。
將數(shù)據(jù)生成組件按照傳感器數(shù)據(jù)類型劃分為Ⅰ型、Ⅱ型…N 型,組件以容器方式運行,多個容器節(jié)點構(gòu)建數(shù)據(jù)生成模塊。數(shù)據(jù)生成模塊的運行架構(gòu)是基于多節(jié)點分布式和多線程并行計算的雙層并行架構(gòu),利用Kubernetes 技術(shù)實時監(jiān)控節(jié)點吞吐量和資源使用量,將數(shù)據(jù)代入基于Kubernetes 的資源利用率函數(shù)自適應調(diào)整數(shù)據(jù)生成組件的數(shù)量,模擬數(shù)據(jù)的并發(fā)量隨著數(shù)據(jù)生成組件的增加而增加,并通過時間輪進程調(diào)度方式協(xié)調(diào)多組件服務活動,使批量生產(chǎn)的模擬數(shù)據(jù)具備接近實時數(shù)據(jù)的物理屬性,構(gòu)建物聯(lián)網(wǎng)測試的仿真數(shù)據(jù)環(huán)境。同時設計測試用例專用語言,優(yōu)化專業(yè)領域語言和開源測試框架之間的數(shù)據(jù)層通道,合并測試用例設計環(huán)節(jié)和自動化測試編碼環(huán)節(jié),即設計測試用例后無須手動編碼,測試用例可自動提供測試服務并給出測試結(jié)論。綜上,所設計的平臺全面提升了自動化程度,有效保障了軟件的測試效率。并行計算測試平臺架構(gòu)如圖1所示。
圖1 并行計算測試平臺架構(gòu)圖
1.2.1 數(shù)據(jù)生成模塊
為有效提升平臺的并發(fā)能力,本文采用雙層次并行計算架構(gòu)作為平臺核心架構(gòu)。本平臺根據(jù)傳感器類型劃分不同的組件,組件以Docker 鏡像的形式獨立運行。Docker 容器技術(shù)屬于新型虛擬化技術(shù),作為一種輕量化的服務載體,具有快速啟停、快速部署、消耗系統(tǒng)資源小等優(yōu)點。Docker容器技術(shù)保證平臺可在任意時間點掛載或撤銷節(jié)點容器,實現(xiàn)性能穩(wěn)定可靠的分布式系統(tǒng)。不同的組件可生成不同類型的數(shù)據(jù),每個組件包含多個數(shù)據(jù)生成進程,初始狀態(tài)下組件只運行一個數(shù)據(jù)生成進程,平臺自動激活備用數(shù)據(jù)生成進程滿足模擬數(shù)據(jù)實時性的要求。數(shù)據(jù)生成組件通過消息隊列的方式實現(xiàn)模擬數(shù)據(jù)的分布式通信,將模擬數(shù)據(jù)反向注入被測系統(tǒng)。雙層次并行計算架構(gòu)圖如圖2所示。
圖2 雙層次并行計算架構(gòu)圖
吞吐量和CPU 資源使用量之間存在線性關(guān)系,經(jīng)線性擬合可推導出二者的函數(shù)關(guān)系式()。由于CPU 資源使用量和資源利用率采樣點總體分布符合正太分布,構(gòu)建基于Kubernetes 的資源利用率函數(shù)。根據(jù)測試需要試驗得到理想的期望和方差,()函數(shù)是以吞吐量為自變量,CPU資源利用率為因變量的函數(shù)關(guān)系式,CPU 資源利用率函數(shù)公式為:
設定三級啟動閾值控制數(shù)據(jù)生成進程啟動數(shù)量,Kubernetes 中Kubelet 代理技術(shù)實時監(jiān)控組件的吞吐量,將吞吐量代入公式()中得到資源使用量,通過公式()計算得到資源利用率。資源利用率達到閾值時平臺自動激活備用數(shù)據(jù)生成進程,平臺吞吐量隨平臺數(shù)據(jù)生成進程的增多而增大;資源利用率超過最高級別閾值后CPU 利用率會保持在一定范圍內(nèi)活動,平臺吞吐量也會保持在穩(wěn)定狀態(tài);資源利用率超過最高級別閾值后且平臺保持穩(wěn)定狀態(tài)一段時間后,平臺會自動關(guān)閉一定數(shù)量的數(shù)據(jù)生成進程,平臺吞吐量隨平臺數(shù)據(jù)生成進程的減少而降低。通過動態(tài)激活和撤銷數(shù)據(jù)生成進程模擬實時數(shù)據(jù)高速、低速的動態(tài)特征。
數(shù)據(jù)生成服務以進程的方式運行,從理論上來說,隨著進程數(shù)量的增加,系統(tǒng)的數(shù)據(jù)處理能力也會隨之提升,但實際情況是多進程同時運行會增加硬件資源的消耗,導致數(shù)據(jù)處理能力下降。本文考慮多組件同時運行會出現(xiàn)上述資源競爭的情況,設計一種基于時間輪進程的調(diào)度方式,以此保障平臺的數(shù)據(jù)處理能力。假設平臺存在個數(shù)據(jù)生成組件,每個組件內(nèi)包含若干個數(shù)據(jù)生成進程,將進程由高到低設置為不同的優(yōu)先級。系統(tǒng)中存在一個公共定時器,定時器周期性啟動不同進程并控制每個進程的執(zhí)行時間。當定時器歸零啟動時,定時器則開啟當前優(yōu)先級的進程運行,當定時器到達規(guī)定時間為時,定時器終止當前進程,保存過程數(shù)據(jù),然后開啟下一級的進程。如果在進程運行結(jié)束時定時器未到達截止時間,則在進程產(chǎn)生一個實時信號觸發(fā)開啟下一級進程運行,此模型應根據(jù)生成單個數(shù)據(jù)時間重點設計定時器間隔時間,同時還需考慮CPU 核心數(shù)與進程的分配關(guān)系,進程級并行計算架構(gòu)如圖3所示。
圖3 進程級并行計算架構(gòu)圖
1.2.2 用例設計模塊
用例設計模塊主要設計理念:采用領域?qū)S谜Z言作為測試用例的描述語言,平臺自動將用例信息轉(zhuǎn)化、融入自動化測試業(yè)務中,摒棄使用自然語言設計測試用例,通過硬編碼的方式將測試用例信息編譯到測試腳本的流程,采用基于領域的專用語言測試框架可有效提升平臺的自動化程度。
用例設計模塊的設計方案采用內(nèi)、外部領域?qū)S谜Z言相結(jié)合的方式,專用語言可以有效降低自然語言轉(zhuǎn)換為編程語言的門檻,簡化測試流程,提升設計測試用例的效率。外部領域?qū)S谜Z言(External DSL)主要是以XML 語言描述測試用例,其關(guān)鍵字包含被測對象、配置參數(shù)、表單信息、預期值等信息。內(nèi)部領域?qū)S谜Z言(Internal DSL)以Python 作為宿主語言構(gòu)建用于分析測試過程的解釋器。平臺通過解釋器對外部領域?qū)S谜Z言進行分析、重構(gòu),之后將測試數(shù)據(jù)傳遞至自動化測試模塊中。
平臺將獨立的用例自動組合成樹型用例集,利用搜索算法遍歷執(zhí)行用例集中的每個測試用例。被測系統(tǒng)中同級別功能模塊的測試用例形成同層級的用例結(jié)構(gòu),子模塊的測試用例在上級用例基礎上延展形成子層用例結(jié)構(gòu),以此模式發(fā)展最終形成多點位多層級有向樹結(jié)構(gòu)。例如平臺首頁功能作為樹的根節(jié)點,子模塊功能作為下級有序節(jié)點,測試任務從用例樹根節(jié)點開始執(zhí)行,以深度優(yōu)先搜索算法(DFS)為遍歷核心算法,對用例樹每條分支上的每個節(jié)點進行遍歷,當某一節(jié)點被訪問時,則代表該測試用例被執(zhí)行,用例樹全部節(jié)點均被訪問后,即整個測試任務執(zhí)行完畢。測試用例自動化執(zhí)行流程圖如圖4所示。
圖4 測試用例自動化執(zhí)行流程
1.2.3 自動化測試模塊
在自動化開源測試框架的基礎上開發(fā)用例信息的數(shù)據(jù)處理服務,通過數(shù)據(jù)處理服務對解釋器傳遞來的數(shù)據(jù)進行處理,開辟專業(yè)語言與開源框架之間的數(shù)據(jù)通道,增加針對測試異常結(jié)論的分析功能,提升平臺中測試結(jié)論的自動化分析水平。本文提出關(guān)于自動化測試框架Unittest 兩個方面的優(yōu)化措施:(1)引入數(shù)據(jù)驅(qū)動設計模式,形成獨立的數(shù)據(jù)層,自動化測試框架的數(shù)據(jù)層與業(yè)務執(zhí)行層剝離,提升數(shù)據(jù)層與測試業(yè)務執(zhí)行層之間的數(shù)據(jù)交互效率;(2)設計用例異常結(jié)果分析引擎,采用SQLite 數(shù)據(jù)庫作為B/S 架構(gòu)的知識庫,加強測試結(jié)論對異常結(jié)果分析的能力。
以Unittest 框架為基礎,基于AOP 設計理念開發(fā)Parameter 類,包括裝飾器set 函數(shù)、path、read 等方法,以及數(shù)據(jù)驅(qū)動模式下測試數(shù)據(jù)文件的解析方法。根據(jù)測試框架接口需求重構(gòu)結(jié)構(gòu)化數(shù)據(jù)體TestCase 對象,構(gòu)建測試數(shù)據(jù)層與接口控制層之間的數(shù)據(jù)通道;構(gòu)建異常測試結(jié)論分析服務,其中包括異常結(jié)論分析引擎和專家知識庫,異常結(jié)論分析引擎實現(xiàn)對測試服務異常返回值的監(jiān)聽、捕獲、解析、發(fā)送等服務,專家知識庫以Web 研發(fā)團隊的經(jīng)驗為主體,提供測試異常現(xiàn)象的分析結(jié)論。
1.2.4 可靠性模塊
并行計算測試平臺在執(zhí)行測試任務時需要多個數(shù)據(jù)生成組件協(xié)同配合,數(shù)據(jù)層處于高速數(shù)據(jù)通信狀態(tài),此業(yè)務場景下需要考慮對服務器產(chǎn)生的性能抑制,為保證測試平臺的可靠性,采用Kubernetes 的彈性伸縮機制對應用層資源進行自動縮放。在實時數(shù)據(jù)交互頻率較低時,Kubernetes通過對組件使用的資源進行縮容,減少對服務器資源的使用避免浪費;在實時數(shù)據(jù)交互頻率較高時,通過對組件使用的資源進行擴容,使測試平臺的硬件資源一直保持在合理狀態(tài)下。
為強化平臺的可靠性,設計自定義資源狀態(tài)腳本對平臺各節(jié)點狀態(tài)進行監(jiān)控。將腳本動態(tài)注冊至Kubernetes 管理服務中,以Golang 作為腳本語言來編寫服務控制腳本Controller,周期性獲取各節(jié)點的狀態(tài)信息并反饋至GUI界面,處于非健康狀態(tài)的組件Controller會立即重啟該Docker容器,這在一定程度上強化了平臺的可靠性。如果重啟容器仍不能解決平臺故障,GUI 界面會給出故障容器名稱、故障現(xiàn)象等報警信息。
相較于傳統(tǒng)測試平臺的設計方案,本測試平臺在并發(fā)性、可靠性、自動化程度方面均有明顯的提升。并行計算測試平臺與傳統(tǒng)測試平臺架構(gòu)設計信息如表1所示。
表1 并行計算測試平臺和傳統(tǒng)水務測試平臺設計方案對比
為比較本測試平臺與傳統(tǒng)測試平臺的數(shù)據(jù)生成能力,以ANQ 水務系統(tǒng)為實驗對象,設置生成同一類型模擬數(shù)據(jù),測試結(jié)果如表2所示,本測試平臺有效提升了數(shù)據(jù)生成服務吞吐量,相比傳統(tǒng)測試平臺吞吐量峰值提升至1.3 倍,吞吐量提升的主要原因是增加數(shù)據(jù)生成組件數(shù)量和進程調(diào)度方式的共同作用。通過平臺發(fā)現(xiàn)被測系統(tǒng)數(shù)據(jù)處理能力的上限,當吞吐量達到113 MB/s 時,被測系統(tǒng)已出現(xiàn)部分接口無法解析的現(xiàn)象,累計接口解析錯誤率達5.85%。
表2 數(shù)據(jù)生成模塊性能統(tǒng)計
為驗證測試平臺在回歸測試中的測試效率,以ANQ 水務系統(tǒng)為實驗對象,收集不同測試方法的所用時間,時間計量單位為分鐘,測試模塊及測試數(shù)據(jù)如表3所示。
表3 測試用時統(tǒng)計
測試總用時包括測試準備時間、測試執(zhí)行時間和結(jié)果分析時間。傳統(tǒng)測試平臺準備工作主要是使用自然語言設計測試用例和編寫測試腳本,而并行計算測試平臺準備工作主要包括使用領域?qū)S谜Z言設計測試用例。表3是采用ANQ 水務系統(tǒng)中320 個測試用例作為實驗對象,統(tǒng)計測試用例各階段的所用時間,經(jīng)統(tǒng)計分析可知,并行計算測試平臺平均每個模塊用時95 分鐘,而傳統(tǒng)測試平臺平均每個模塊用時127 分鐘,并行計算測試平臺平均用時比傳統(tǒng)測試平臺少32分鐘,主要原因是使用傳統(tǒng)測試平臺時需要將測試用例轉(zhuǎn)換為代碼信息。為進一步驗證不同測試方法的測試效率,將以上實驗數(shù)據(jù)代入以下測試效益公式:
其中,X為并行計算測試平臺檢測的bug 數(shù)量,T為并行計算測試平臺檢測的總用時,X為傳統(tǒng)測試平臺檢測的bug 數(shù)量,T為傳統(tǒng)測試平臺的總用時。經(jīng)計算可知,本次實驗中采用并行計算測試平臺進行回歸測試比傳統(tǒng)測試平臺測試效率提升34%。
本文全面分析測試平臺生成模擬數(shù)據(jù)和自動化測試效率存在的問題,設計一種基于Kubernetes 的并行計算測試平臺,將不同類型數(shù)據(jù)生成組件打包成Docker 鏡像,構(gòu)建雙層次并行計算架構(gòu),通過專用語言自動編譯自動化測試腳本。該平臺可以生成具有物理屬性的模擬數(shù)據(jù)并實現(xiàn)測試效率的提升。實驗結(jié)果表明,基于Kubernetes 的并行計算測試平臺在物聯(lián)網(wǎng)測試中具有良好的應用前景。