李海海,陳曉軒,劉心田,沈 悅
安全控制單元VCU(Vital Control Unit)是一套二取二架構(gòu)的嵌入式實(shí)時(shí)安全平臺(tái)[1],目前已經(jīng)被廣泛應(yīng)用于鐵路道岔控制單元、輸入/輸出控制單元、信號(hào)燈控制單元等系統(tǒng)[2]。這些系統(tǒng)的上層應(yīng)用軟件可以通過調(diào)用VCU 平臺(tái)提供的接口進(jìn)行二次開發(fā),而整個(gè)系統(tǒng)的安全性、冗余性以及數(shù)據(jù)的正確讀取則依靠VCU平臺(tái)保證。
在對(duì)VCU 平臺(tái)軟件進(jìn)行測(cè)試時(shí),需要在源代碼中插入大量的測(cè)試樁代碼[3],如果采用固定樁代碼,完成一個(gè)用例測(cè)試后就需要改變代碼,關(guān)掉已執(zhí)行的用例樁,打開新的用例樁代碼,并重新編譯和燒錄,而編譯和燒錄過程比較耗時(shí),嚴(yán)重影響測(cè)試效率[4],因此需要開發(fā)自動(dòng)化測(cè)試平臺(tái)[5-6]。
VCU 平臺(tái)分為主安全控制單元(Master Vital Control Unit,MVCU)和從安全控制單元(Slaver Vital Control Unit,SVCU),MVCU 和 SVCU之間采用TFTP協(xié)議[7-10]進(jìn)行通信。
測(cè)試平臺(tái)框架如圖1 所示,分為PC 端和嵌入式端。其中,MVCU 可以通過網(wǎng)線與PC 端相連,PC端通過TFTP協(xié)議發(fā)送命令給MVCU,由MVCU 執(zhí)行相應(yīng)的操作;PC 端向SVCU 嵌入式端發(fā)送命令時(shí),由MVCU 嵌入式端將該命令轉(zhuǎn)發(fā)至SVCU 嵌入式端[9]。

圖1 測(cè)試平臺(tái)框架
嵌入式端包含4 部分,分別為樁代碼解析模塊,解析上位機(jī)發(fā)送的命令;樁代碼模塊,用于用戶自定義實(shí)現(xiàn)其所需功能;重啟模塊,接收PC 端重啟命令,復(fù)位單個(gè)軟件,實(shí)現(xiàn)軟件的重新啟動(dòng);配置&鏡像更新模塊,接收到配置和鏡像文件后,寫入內(nèi)存,更新系統(tǒng)配置或者鏡像。嵌入式端軟件需要分別與MVCU 和SVCU 一起編譯生成可執(zhí)行文件,可執(zhí)行文件運(yùn)行后,測(cè)試平臺(tái)嵌入式端跟隨MVCU和SVCU軟件運(yùn)行。
PC 端主要包含3 部分,分別為用例管理模塊,按照不同的用例,發(fā)送命令給嵌入式端;電源管理模塊,控制整個(gè)系統(tǒng)的電源,可實(shí)現(xiàn)自動(dòng)上電和斷電;日志管理模塊,接收嵌入式端發(fā)送的日志,并記錄在相應(yīng)的測(cè)試用例下。
1) 用戶自定義功能。用戶可根據(jù)需求,自定義PC 端命令和嵌入式端命令,從而實(shí)現(xiàn)特定測(cè)試。PC 機(jī)端發(fā)送控制命令,嵌入式端收到命令后進(jìn)行解析,打開已有的樁,實(shí)現(xiàn)某些用例特定功能,如發(fā)送變量值、改變某個(gè)變量值等。
2)自動(dòng)記錄日志。PC 端發(fā)送控制腳本命令后,將嵌入式軟件發(fā)送的測(cè)試日志記錄在相應(yīng)的測(cè)試用例文件夾下,方便自動(dòng)化測(cè)試結(jié)果的查看。
3)發(fā)送重啟命令。通過PC 端測(cè)試腳本的編寫,控制整個(gè)系統(tǒng)電源周期性或隨機(jī)性開關(guān),以及單個(gè)軟件周期性或隨機(jī)性重新啟動(dòng)。
4)自動(dòng)更新配置。在測(cè)試過程中,每個(gè)測(cè)試用例需要對(duì)應(yīng)不同的配置,可以先更新用例所需要的配置,再執(zhí)行測(cè)試用例,從而實(shí)現(xiàn)多用例的自動(dòng)化測(cè)試。
5)自動(dòng)更新鏡像。對(duì)于某些特定的用例,需要特定的嵌入式軟件鏡像,在執(zhí)行用例前,PC 端首先發(fā)送更新鏡像的命令以及鏡像,當(dāng)嵌入式端收到鏡像更新命令后,再將收到的鏡像更新到指定的內(nèi)存地址,重啟后就可以運(yùn)行新的鏡像。
測(cè)試平臺(tái)實(shí)現(xiàn)了動(dòng)態(tài)樁注入,相比固定樁重復(fù)地編譯燒寫節(jié)約了時(shí)間;相比使用仿真器改變變量值,節(jié)約了仿真器成本,而且平臺(tái)可實(shí)現(xiàn)多個(gè)用例順序執(zhí)行,提高了自動(dòng)化測(cè)試水平,節(jié)省了手動(dòng)執(zhí)行的時(shí)間;平臺(tái)可擴(kuò)展性強(qiáng),PC 端和嵌入式端可由用戶自定義,適用于帶網(wǎng)絡(luò)通信的嵌入式系統(tǒng)。
測(cè)試前,需要編寫嵌入式端樁代碼。嵌入式端樁代碼以枚舉的方式列出,以測(cè)試用例號(hào)和步驟號(hào)為標(biāo)識(shí)。打開樁代碼后,樁代碼執(zhí)行的命令可根據(jù)用戶需要自定義,如改變SVCU 變量值,控制外部繼電器的輸出命令等。嵌入式端樁代碼示例見圖2,用例SwRTC_0001 的第2 步為改變系統(tǒng)的運(yùn)行模式,通過動(dòng)態(tài)改變系統(tǒng)的運(yùn)行模式,可影響SVCU 的輸出命令,例如在運(yùn)行模式為1 時(shí),SVCU對(duì)外輸出數(shù)據(jù)為全0。

圖2 嵌入式端樁代碼示例
PC 端編寫相應(yīng)的樁腳本文件后,通過TFTP協(xié)議傳給MVCU 板卡,由其轉(zhuǎn)發(fā)至SVCU 板卡。當(dāng)SVCU 板卡收到命令后,打開SwRTC_000101和SwRTC_000102,SwRTC_000101 將輸出端口的狀態(tài)發(fā)送給MVCU,MVCU 再轉(zhuǎn)發(fā)給PC 端,PC 端將日志記錄在此用例的文件夾下,方便人工查看;SwRTC_000102 樁改變SVCU 的運(yùn)行狀態(tài)。一個(gè)用例執(zhí)行多個(gè)樁命令時(shí),可以通過延時(shí)來控制發(fā)送2個(gè)樁命令的時(shí)間間隔。PC端命令行見圖3。
為了節(jié)約測(cè)試時(shí)間,提高測(cè)試效率,平臺(tái)自動(dòng)執(zhí)行所有的測(cè)試用例。在PC端,將要執(zhí)行的用例寫入Python腳本中,腳本運(yùn)行后可順序執(zhí)行用例,當(dāng)PC端捕捉到用例執(zhí)行完成后,再發(fā)送下一個(gè)用例的樁;在嵌入式端,當(dāng)用例的最后一個(gè)樁執(zhí)行完成后,發(fā)送用例執(zhí)行結(jié)束命令。具體執(zhí)行流程見圖4。

圖4 平臺(tái)自動(dòng)化測(cè)試執(zhí)行流程
測(cè)試平臺(tái)適用于帶有網(wǎng)絡(luò),且采用TFTP 協(xié)議進(jìn)行通信的嵌入式系統(tǒng)。對(duì)于不能優(yōu)先啟動(dòng)TFTP協(xié)議的嵌入式系統(tǒng),在TFTP任務(wù)掛起前的任務(wù)不能使用此平臺(tái)進(jìn)行測(cè)試;如果被測(cè)軟件對(duì)任務(wù)啟動(dòng)順序沒有定義,可先啟動(dòng)測(cè)試平臺(tái)的嵌入式端軟件,待嵌入式端與PC 端通信正常后,再啟動(dòng)被測(cè)試軟件的其他相應(yīng)任務(wù)。
采用該測(cè)試平臺(tái)時(shí),需要將測(cè)試平臺(tái)嵌入式端與被測(cè)對(duì)象一起編譯生成可執(zhí)行文件,可執(zhí)行文件運(yùn)行后,測(cè)試平臺(tái)嵌入式端跟隨被測(cè)軟件運(yùn)行。該測(cè)試平臺(tái)支持自動(dòng)執(zhí)行模式,可大大提高測(cè)試效率。
對(duì)于安全的嵌入式軟件來說,通過插樁來模擬軟件運(yùn)行時(shí)遇到的各種故障,是驗(yàn)證軟件功能的重要手段[11],基于TFTP 協(xié)議的測(cè)試平臺(tái),不僅能夠?qū)崿F(xiàn)被測(cè)軟件動(dòng)態(tài)故障模擬,全面驗(yàn)證嵌入式軟件的安全性,還可以實(shí)現(xiàn)自動(dòng)配置以及鏡像更新、日志自動(dòng)記錄,減少了人工燒錄鏡像的步驟,提高了測(cè)試效率。