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