嚴漪敏 曹斌 陳琦
[摘 要]借助代碼規(guī)則檢查問題單來逐一排查動態(tài)驗證,通過邏輯覆蓋測試來設(shè)計用例到達每一條,以驗證故障的方法。在編碼規(guī)則檢查時,存在規(guī)則問題,在用例設(shè)計后,進行動態(tài)驗證。緩存隊列在加入指令時,未考慮隊列滿時需要釋放隊列,導致,在間接指令隊列滿后,繼續(xù)插入指令時,因隊列未釋放導致軟件復位。
[關(guān)鍵詞]嵌入式軟件 測試工具 TESTBED 緩存隊列 未釋放 編碼規(guī)則 ada語言
中圖分類號:TS339 文獻標識碼:A 文章編號:1009-914X(2018)32-0112-02
1 引言
編碼規(guī)則是程序編碼所要遵循的規(guī)則,首先就要注意代碼的正確性、穩(wěn)定性和可讀性。遵照代碼規(guī)則也是一種良好的編碼習慣。作為測試人員可以依據(jù)代碼規(guī)則檢查工具來檢測代碼是否遵循規(guī)則來編寫,還可以借助代碼規(guī)則檢查問題單來逐一排查動態(tài)測試問題。
2 編碼規(guī)則檢查
某嵌入式大型軟件,具有實行多任務(wù)、實時控制特點。
軟件通過接收遙控指令進行數(shù)據(jù)解析,若遙控包數(shù)據(jù)內(nèi)容為間接指令,將間接指令插入間接指令隊列,然后再通過周期調(diào)用發(fā)送間接指令函數(shù)依次將隊列中間接指令按照時間順序發(fā)送至遙控終端。
在規(guī)則檢查時,利用TESTBED工具進行編譯,選取最重要強制項代碼形成LDRA Testbed Code Review Report。如表1所示。
其中在函數(shù)JinsertQueue里發(fā)現(xiàn)了一個規(guī)則錯誤:
Violation Number : 7 - Procedure has more than one exit point(一個函數(shù)最好只包含一個return語句,且位于函數(shù)的最后。)
Location : INDIRCMDQUE.JINSERTQUEUE
在代碼審查時,根據(jù)TESTBED提示的規(guī)則錯誤進行排查,發(fā)現(xiàn)當間接隊列滿時,程序直接RETUEN返回,并沒有釋放隊列“Queue_Mux.Release;”。
3 動態(tài)驗證方法
根據(jù)指令數(shù)據(jù)的格式表2,指令數(shù)據(jù)分為2種,一種是立即指令,時間碼全填充為0x00,另一種是延遲指令,時間碼填充為需要發(fā)送指令的時間。
嵌入式軟件先讀取指令數(shù)據(jù)包緩存區(qū)指令進行處理,如果是立即指令的就直接串口發(fā)送,如果是延遲指令的存入指令隊列緩存區(qū)。在另一任務(wù)中,實時讀取指令隊列緩存區(qū),如果基準時間等于指令時間,則立即進行串口發(fā)送,如果基準時間小于指令時間,則不作處理。
根據(jù)隊列的結(jié)構(gòu)特點和發(fā)送隊列指令的時序考慮,如果需要動態(tài)驗證以上錯誤分支,必須通過邏輯覆蓋遍歷。判定覆蓋或分支覆蓋時較強的邏輯覆蓋準則。該準側(cè)要求必須編寫出足夠的測試用例,使得每一個判斷都至少有一個為真或為假的輸出結(jié)果。換句話說,也就是每條分支路徑都必須至少遍歷一次。
圖1中有N1、N2、N3、N4四個節(jié)點,如果都要遍歷到,其路徑如下:
所以要測試所有分支,必須滿足五種情況:
1、隊列滿時
2、當前隊列中未有指令
3、當插入指令為最后一條指令
4、當插入指令指令不為最后一條指令,需要將指令隊列中指令向后挪一個空間
5、當插入指令指令不為最后一條指令,不需要將指令隊列中指令向后挪一個空間
如果要走入錯誤分支,則必須遍歷ab分支。對指令隊列進行測試,在時間碼處填上時間,嵌入式軟件在運行時,會根據(jù)基準時間進行判斷,晚于基準時間的指令會存入指令隊列,當基準時間與發(fā)送指令時間一致時,會從隊列中讀取指令并發(fā)送。持續(xù)不斷向嵌入式軟件發(fā)送延遲指令,使指令發(fā)送時間晚于當前時間,持續(xù)發(fā)送511條,將緩存區(qū)填滿,遙測下傳的間接指令隊列深度為1FF。然后,再發(fā)送一條間接延遲指令給嵌入式軟件,預(yù)期結(jié)果是,間接指令隊列深度不變,隊列內(nèi)容不變,此間接延遲指令丟棄。
實際結(jié)果時,軟件復位,間接指令隊列深度清零。
4 故障排查分析
當進入模塊是指令的隊列進行鎖定操作,然后根據(jù)當前指令的插入時間進行順序插入隊列,最后進行隊列釋放操作。當隊列未滿時,流程未出現(xiàn)錯誤。當隊列滿時,流程直接退出模塊,導致指令隊列鎖定后未釋放。當再次發(fā)送指令給嵌入式軟件,就會發(fā)生因隊列未釋放導致緩存區(qū)錯誤引起軟件復位問題。
5 故障糾正措施
基于編碼規(guī)則,鎖定和釋放操作是要成對出現(xiàn)?,F(xiàn)在只要將隊列鎖定和隊列釋放操作在整個判斷隊列滿的條件之外,確保不論隊列滿還是隊列不滿時,鎖定和釋放操作時成對出現(xiàn)的。將隊列滿的條件加在整個插入隊列。
6 總結(jié)
閱讀代碼對于構(gòu)成完善的軟件測試和調(diào)試手段的價值是非常大的,人工測試技術(shù)結(jié)合代碼規(guī)則檢查,在查找錯誤方面非常有效。同樣在測試用例設(shè)計時,通過不同的測試要素組合起來得到一種合理的測試策略也是非常關(guān)鍵的。
參考文獻
[1] 姜靜波,Ada程序設(shè)計語言高級編程,解放軍出版社,1999.
[2] Tucker S.Taft,綜合ADA參考手冊,Oversea Publishing House,2002.
[3] GlenFord J.Myers,軟件測試的藝術(shù),機械工業(yè)出版社,2007.
作者簡介
嚴漪敏,上海航天電子技術(shù)研究所,工程師。
曹斌,上海航天控制技術(shù)研究所,高級工程師。
陳琦,上海航天電子技術(shù)研究所,工程師。