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