吳惠妍
(北京全路通信信號(hào)研究設(shè)計(jì)院集團(tuán)有限公司,北京 100070)
隨著軟件復(fù)雜度的增加,傳統(tǒng)的軟件開發(fā)方法已不能滿足效率和安全性的需求。為解決這一不足,高安全應(yīng)用開發(fā)環(huán)境SCADE應(yīng)運(yùn)而生,SCADE已普遍應(yīng)用于航空航天、國防、軌道交通等對安全性要求極高的領(lǐng)域。SCADE開發(fā)的模型在經(jīng)過模型仿真以及模型測試后可直接生成高安全性的代碼。
SCADE模型仿真和測試普遍采用人工編輯輸入數(shù)據(jù)測試的方式,這使得大多數(shù)的測試只能手動(dòng)進(jìn)行,沒有測試輔助工具或者測試腳本支持?jǐn)?shù)據(jù)生成。而且人工編輯的數(shù)據(jù)由于其與真實(shí)數(shù)據(jù)存在差異,測試環(huán)境的保真度差,這也會(huì)導(dǎo)致不確定或者不正確的測試結(jié)果(假陽性和假陰性結(jié)果)。此外,在與外部實(shí)物環(huán)境進(jìn)行聯(lián)合測試時(shí),需要編譯并裝載(load)到目標(biāo)平臺(tái)上,如果發(fā)現(xiàn)新的缺陷(bug),則需要返回模型再次修改,如圖1所示,開發(fā)、仿真、測試效率亟待提高。
圖1 傳統(tǒng)仿真流程Fig.1 Traditional simulation process
如果在模型設(shè)計(jì)階段就能將模型與外部實(shí)物環(huán)境進(jìn)行互聯(lián),測試環(huán)境的仿真度得以提高,進(jìn)而減少模型生成代碼編譯后裝載到平臺(tái)上產(chǎn)生的錯(cuò)誤,這樣測試也不會(huì)被視作發(fā)生在瀑布開發(fā)周期后期的一個(gè)階段,而是不斷發(fā)生在迭代、增量和并發(fā)開發(fā)周期的持續(xù)性活動(dòng)完成快速迭代。實(shí)物接入在線仿真環(huán)境如圖2所示。關(guān)鍵技術(shù)在于模型如何與外部實(shí)物通信。
圖2 實(shí)物在線仿真Fig.2 Online physical simulation
SCADE自帶的模型庫不包含與外界進(jìn)行通信的模塊,需要進(jìn)行單獨(dú)開發(fā)。與外界通信有多種方式,如基于以太網(wǎng)的UDP、TCP通信、串行通信等,本文以最常用的通信為例,闡述SCADE與外界通信的實(shí)現(xiàn)方式。
UDP發(fā)送模塊中包含數(shù)據(jù)拷貝模塊,該模塊用于將變長的數(shù)據(jù)格式化為固定長度的數(shù)據(jù),UDP發(fā)送模塊是導(dǎo)入代碼模塊,是由人工編寫代碼的方式采用C語言實(shí)現(xiàn)的socket通信,實(shí)現(xiàn)根據(jù)socket句柄、IP地址及端口號(hào)完成UDP數(shù)據(jù)的發(fā)送。
該UDP通信模塊實(shí)現(xiàn)與外部實(shí)物互聯(lián),其特點(diǎn)在于:1)支持?jǐn)?shù)據(jù)錄播及回放功能,可以提高回歸測試自動(dòng)化的程度;2)UDP通信IP地址和端口號(hào)可配置;3)UDP通信模塊支持多路鏈接,且鏈路之間相互獨(dú)立,沒有任何依賴及干擾。
UDP通信接收子模塊共有3個(gè)分支,其中,第1個(gè)分支由UDP信息接收(updRecvElt)操作符、數(shù)據(jù)錄入(dataSava)操作符構(gòu)成,該分支用于實(shí)物環(huán)境下的仿真,并同時(shí)錄制數(shù)據(jù);第2個(gè)分支由數(shù)據(jù)下載(dataLoad)操作符構(gòu)成,該分支用于離線環(huán)境的實(shí)現(xiàn)數(shù)據(jù)回放;第3個(gè)分支由UDP信息接收(updRecvElt)操作符構(gòu)成,該分支用于僅在實(shí)物環(huán)境下的仿真,不需要錄制數(shù)據(jù)的場景。
關(guān)鍵部分包含UDP信息接收操作符、數(shù)據(jù)錄入操作符、數(shù)據(jù)下載操作符,這3個(gè)操作符均為導(dǎo)入代碼模塊(Imported Operator),是由人工編寫C代碼導(dǎo)入實(shí)現(xiàn)的。其中,UDP信息接收操作符用于根據(jù)socket句柄及端口號(hào)完成UDP數(shù)據(jù)的接收;數(shù)據(jù)錄入操作符用于完成每個(gè)測試用例中測試數(shù)據(jù)的記錄,每一次記錄形成一個(gè)以"testcase*"命名的文件夾,各端口收集的數(shù)據(jù)分別存儲(chǔ)到不同的命名為"data*.csv"的文件中,如圖3所示,數(shù)據(jù)下載操作符用于完成數(shù)據(jù)的回放,當(dāng)選擇回放記錄條目后,該模塊會(huì)讀取對應(yīng)的"data*.csv"的數(shù)據(jù)并載入仿真環(huán)境中。
圖3 數(shù)據(jù)記錄格式Fig.3 Data record format
接口設(shè)計(jì)時(shí)采用參數(shù)配置的方式。配置參數(shù)包括端口"port",IP地址"add*",數(shù)據(jù)長度"dataLen",如圖4所示,使用相關(guān)模塊時(shí),僅需在模塊屬性對話框中進(jìn)行參數(shù)設(shè)置即可。
圖4 接口設(shè)計(jì)Fig.4 Interface design
被測模型可能同時(shí)存在多個(gè)與外界通信的接口,且各通信之間需要相互獨(dú)立,不能相互依賴及干擾,因此UDP通信模塊將socket句柄交由外部模型來管理。UDP通信模塊申請socket句柄之后將套接字句柄(socketHander)交由SCADE的"last"變量保存,如圖5所示中的"last’socketHandler"。這樣多個(gè)UDP連接可以通過同一個(gè)UDP信息接收模塊分時(shí)復(fù)用,在不同時(shí)刻通過輸入不同的套接字句柄來實(shí)現(xiàn),UDP通信由模型的輸入?yún)?shù)(socketHanderIn)決定。
圖5 socketHandler處理Fig.5 socketHandler processing
SCADE有數(shù)據(jù)流圖和安全狀態(tài)機(jī)兩套建模機(jī)制,分別適合于連續(xù)系統(tǒng)和離散系統(tǒng)建模。本文提供的模型與實(shí)物聯(lián)合仿真測試框架采用狀態(tài)機(jī)來實(shí)現(xiàn),狀態(tài)機(jī)中有4個(gè)狀態(tài)。
1)初始(init)狀態(tài)包含索引(indexPlus)操作符。在實(shí)物環(huán)境下仿真測試時(shí)會(huì)記錄多個(gè)測試用例(testcase*)。索引操作符用于選定仿真過程從哪個(gè)測試用例開始載入數(shù)據(jù)。
2)數(shù)據(jù)回放狀態(tài)(dataReplay)包含無數(shù)據(jù)(noData)模塊和被測模塊環(huán)境(testEnv)。無數(shù)據(jù)模塊用于判定所選取的數(shù)據(jù)包(一個(gè)測試用例中可能有多個(gè)數(shù)據(jù)包)是否已讀完,只在有數(shù)據(jù)的時(shí)候才能激活。而被測模塊環(huán)境是對被仿真模塊搭建的仿真環(huán)境,被仿真測試模型SystemUT有6個(gè)通信連接,因此為其搭建了對應(yīng)的仿真測試環(huán)境模塊。被仿真測試模型環(huán)境內(nèi)嵌到一個(gè)初始化操作符中,切換到新的測試用例之前要先初始化被測對象的仿真環(huán)境。
3)新用例(newCase)狀態(tài)用于在本測試用例的數(shù)據(jù)包數(shù)據(jù)讀完之后切換至下一個(gè)測試用例,當(dāng)測試用例全部讀完并仿真后,進(jìn)入終止(finish)狀態(tài)。
4)終止(finish)狀態(tài),仿真結(jié)束。
整個(gè)仿真測試流程如圖6所示。從第一個(gè)測試用例開始測試過程,遍歷測試用例中所有數(shù)據(jù)包中的數(shù)據(jù)并發(fā)送給被測對象,在每個(gè)測試用例測試結(jié)束后,需要進(jìn)行測試仿真環(huán)境的初始化,以便準(zhǔn)備下一個(gè)測試用例。這樣迭代直至所有測試用例執(zhí)行完畢,測試結(jié)束。
圖6 測試框架工作流程Fig.6 Test framework workflow
相比僅在SCADE內(nèi)部做模型仿真測試,與外部實(shí)物環(huán)境的聯(lián)合仿真有更多優(yōu)勢:
1)模型測試能夠獲得更真實(shí)的測試數(shù)據(jù)輸入;
2)省去了繁重的手工編輯測試數(shù)據(jù)的工作,保證數(shù)據(jù)的有效性,測試變得更加便捷快速;
3)數(shù)據(jù)記錄和回放功能使得仿真測試可以脫離外部實(shí)物環(huán)境也能進(jìn)行同樣真實(shí)度的仿真測試;
4)在數(shù)據(jù)記錄完之后的回歸測試更加方便,可實(shí)現(xiàn)自動(dòng)化。