李莉 張青





摘要:軟件的安全性和可靠性在今天越來越受到重視,由于軟件邊界值處理不當引起的問題層出不窮,該文結合若干邊界測試的典型案例,從循環邊界、數據值邊界、數據量邊界、狀態轉換邊界等多個角度闡述軟件相關邊界問題產生原因,總結軟件中的邊界處理要點,為軟件設計提供參考。
關鍵詞:軟件測試;邊界測試
中圖分類號:TP311 ? ? ?文獻標識碼:A
文章編號:1009-3044(2021)31-0132-03
1 邊界測試概述
隨著大數據和人工智能時代的來臨,各種軟件在人們的工作和生活中承擔的任務越來越重要,隨之而來,對軟件的可靠性要求也越來越高。軟件測試是保障軟件安全可靠性的一種重要手段,測試類型從最初的功能測試,擴展和細化到現在的功能、性能測試、數據測試、接口測試、邊界測試、余量測試、安全性、可靠性測試等等眾多類型。
由測試數據統計得知,大量的軟件錯誤是發生在輸入或輸出的邊界上,而不是發生在輸入輸出范圍的內部[1-2],但是在軟件設計和程序編寫過程中,設計師常常對需求中的輸入或輸出邊界重視不夠,導致出現各種錯誤,因此針對各種邊界情況開展測試,我們可以查找出更多的軟件錯誤[3]。
2 邊界測試方法
邊界值分析是邊界測試的主要測試方法,它是對等價類分析方法的一種補充。開展軟件邊界測試首先需要確定邊界情況,然后選取正好等于、剛剛大于或剛剛小于邊界的值作為測試數據,而不是選取等價類中的典型值或任意值作為測試數據[4]。常用的邊界值分析方法有三點法、五點法、七點法等等,分別針對一至多個邊界點,選取相應邊界值開展測試,原理比較簡單。
3 邊界測試點選取
一旦邊界點選定,相應的邊界值也隨之確定,測試數據也順利生成,看上去非常簡單。但是實際操作中,邊界問題還是層出不窮,其原因就在于:
1)設計師并未意識到當前數據是有邊界要求的;
2)有些邊界要求不體現在軟件文檔要求中,而是隨著設計師的程序編寫過程不斷產生的;
3)需求隱含了一些功能邊界要求,但是這些要求需要設計師在領會整個系統流程的基礎上總結概括得出,如果對系統理解不全面,可能會漏掉對相關邊界的處理。
綜上所述,對于軟件測試人員來說,邊界測試的重點在于尋找被設計師忽略或理解錯誤的數據點。因此,邊界測試的難點不在于測試執行,而在于測試對象即測試點的發現和選取。
通常,軟件邊界測試分為數據值邊界和數據量邊界:數據值邊界是指有明確邊界要求的數據,這些數據有些在軟件需求規格說明或者詳細設計中特別提出,有些是程序內部自定義數據,需要根據其含義自行界定其邊界;數據量邊界包括數據長度邊界、數據容量邊界(存儲區容量、堆棧容量等)、通信通道容量邊界等等,這些邊界要求通常隱含在接口說明或硬件說明中;還有一些邊界要求并沒有在文檔中出現,需要測試人員結合軟件文檔和程序上下文推導得出。
在這些顯性或隱性的邊界點的處理上出現了不少軟件問題,下面我們結合具體案例介紹。
4 邊界測試典型案例分析
4.1 循環邊界
循環邊界是比較常見的測試邊界,通常包括:
1)有明確要求的循環次數;
2)與時序有關的循環。
案例1:
需求要求某個操作循環執行3次。
循環變量初始值times=0,軟件實現如下圖:
從圖中代碼可見,由于while判斷times終止值為3,顯然循環次數已達到4次,超過3次循環的要求。
這種循環數據邊界的問題在單元測試中是頻發問題,設計師在編寫循環處理語句的時候需要嚴格對照需求的要求,特別注意循環的起始值和結束值的處理,以避免循環次數超限。
案例2:
需求要求每20ms執行子程序Calu_20(),采用前一拍引力進行當前拍位置計算,程序初始值Gx0,Gx1的值均為0。子程序實現如下圖所示:
由以上程序可得:
第1拍20ms當前位置PX1計算,使用的Gx0值為初始值0;
第2拍20ms當前位置PX1計算,使用的Gx0值為第1拍中Gx1賦予它的值,也是0;
第3拍20ms 當前位置PX1計算,使用的Gx0值為第2拍中Gx1賦予它的值,即Gx0=Gx0_1_Step;
由分析可知,由于語句②的位置錯誤,導致當前位置PX1計算時使用的其實是前2拍的引力值,程序應將語句②放在語句①之前執行,才能保證時序的正確。修改后的程序如下圖所示:
在嵌入式軟件中,常常用中斷去執行一些與時序有關的計算或控制,定時中斷由于定期不斷執行,因此我們可以把它看作是一種特殊的循環。此時,我們需要格外注意從上一次中斷到下一次中斷的切換執行,通常時序錯誤都發生在切換的邊界。例如上面這個例子,如果2拍引力值的偏差較小,這種錯誤很難在動態測試中發現,通常只有通過代碼走讀才能分析得出。
4.2 數據域邊界
數據域的邊界一般包括:
1)數組范圍的邊界;
2)數據類型的邊界。
案例3:
軟件需求要求程序采集每20ms電壓測量值,通過累積每20ms的電壓差值,計算得出2s電壓差值,程序實現如下:
由以上程序可知,數組DY[]中存放的是每20ms的電壓差值,程序需要計算的是2s累計的電壓差值,共100個差值就應該涉及到101個電壓測量值。但是由于程序將電壓測量值數組DY[]大小定義為100,所以該數組大小不夠,應定義為101個元素。此外,程序循環到i=99時,DY[]數組下標已引用到100,而數組的下標最大應該比數組大小小1,因此,此處對數組的引用已溢出。
在數組的應用上,出錯頻率較高的是數組下標邊界,特別是當下標用作循環變量時,設計人員經常容易忽略其范圍要求而超范圍使用下標。
案例4:
軟件運行環境為TMS320C5416,是16位的定點DSP,其中一段程序實現門限的計算,具體見圖5:
在16位定點DSP中,Unsigned int類型數據表示范圍為0~65535,這段程序用到的三個變量都是Unsigned int類型。
設置PRI=90,Δd=50,則程序運行計算時,算到20*PRI*Δd時,中間結果20*PRI*Δd的計算值已達到90000,超過了Unsigned int表示的最大范圍,數據溢出,中間結果由90000變成了24464,再經過/200的運算,最后計算結果為122,程序實現錯誤。
這是一個典型的白盒數據邊界測試問題,此處進行計算的代碼運算執行順序是從左到右,因此導致中間結果溢出。對于不同的編譯器,程序的運算順序可能有所不同,因此無論是軟件設計人員還是測試人員,都應當深入了解程序運行環境,深刻理解每種數據類型的表示范圍,避免數據超出類型表示范圍邊界。
4.3 數據量邊界
數據量邊界通常與硬件相關,一般包括:
1)存儲區容量邊界;
2)堆棧容量邊界;
3)通信通道容量邊界;
4)信號有效范圍邊界。
案例5:
這是一個非常著名的案例,豐田汽車不響應剎車而失控爆沖,該事件后有軟件專家對其控制軟件進行了測試,以下是其中部分軟件缺陷描述:
豐田的軟件系統有兩塊相鄰的內存塊。第一塊內存區域存儲所有任務以及任務的運行狀態,稱為“堆棧(Stack)”,大小為4KB。與“堆棧”相鄰的內存中儲存了操作系統進行任務分配的記錄。在某些情境下,如果任務及任務的運行狀態數據很多,那么會往堆棧里寫入太多東西,如果大小超過4KB,那么就會錯誤地寫入相鄰的內存塊,即任務分配表,這種錯誤被稱為“堆棧溢出”??梢韵胂?,一旦出現堆棧溢出,任務分配表內容會被改寫,系統就會錯誤地分配任務,造成任務內容、執行次數的錯亂,甚至某些任務直接被忽略[5]。
這是一個典型的堆棧使用超邊界問題,這些問題的產生通常是在軟件的系統規劃和設計階段沒有對后期使用作充分評估,導致內存分配不夠引起的。類似的存儲容量、通信通道容量等也應當在系統設計初期就做好規劃,否則一旦使用中超出其容量邊界,會引起整個系統癱瘓等致命故障。
4.4 狀態轉換邊界
在軟件運行過程中從一個狀態切換到另一個狀態也是一個重要的邊界。例如:有些軟件分階段運行,包括測試態和正式狀態,兩者會調用一些相同的函數,靠外部信號來進行狀態轉換。還有一些軟件,執行時有明確的運行狀態,各狀態分工清楚,切換時機明確。
案例6:
某飛行軟件所控制的飛行階段明確分為一、二、三級,一級關機后進入二級飛行段,二級關機后進入三級飛行段。在程序中,每級關機會讀取三次關機信號,分別存儲于三塊不同地址的內存中,程序需要對這三個地址中存放的關機信號進行三取二的可靠性判斷。由于一、二、三級飛行按順序進行,不會并行,因此設計師復用了三個地址存放三個級別飛行時段的關機信號。
需求要求一級關機的條件是收到0xA信號;二級關機的條件是收到0xB信號;三級關機的條件是收到0xC信號。
測試人員在一級關機時給出三個值為0xA,0xB,0xA,一級順利關機,進入二級飛行階段。一級轉二級時,程序沒有將三個地址的數據清零,因此轉二級飛行時,內存中三個值為0xA,0xB,0xA,進入二級后,測試人員給只給第一個地址賦值0xB,內存中三個值為0xB,0xB,0xA,經過三取二,得出當前已收到0xB信號的結論,因此二級關機——但此時實際上程序剛收到一次關機信號,另兩次關機信號還未發出。由于狀態轉換邊界處理不當,程序發生誤判,導致提早關機。
狀態轉換時涉及到的信息處理工作很多,一不小心就會有遺漏,導致程序出錯。因此,設計師應關注狀態轉換邊界,查看程序狀態轉換時涉及到的數據和控制信息,避免發生錯誤。
4.5 輸出邊界
軟件的邊界測試不僅關注輸入邊界和硬件使用邊界,還應結合外部接口要求,考慮輸出數據和信號的邊界。
例如:
1)DSP和FPGA交互時,向對方輸出的數據是否有值域要求。
2)軟件向硬件發出一些信號信息時,考慮硬件是否有特殊要求,比如限幅等。
5 結束語
軟件在計算機系統中所占比重越來越大,相應的軟件面臨的風險也越來越多,本文結合典型案例將軟件測試過程中發現的各種邊界問題進行了總結和歸納,為軟件設計和測試人員提供參考,以避免軟件邊界問題,增強軟件的可靠性。
參考文獻:
[1] 王軼辰,殷永峰,劉斌.航電設備軟件系統測試過程研究[J].測控技術,2004,23(8):53-55,64.
[2] Jorgensen P C.軟件測試[M].韓柯,杜旭濤,譯.北京:機械工業出版社,2003.
[3] MOLLY_CICI.邊界值分析法--測試用例設計方法[EB/OL].[2020-10-18].https://blog.csdn.net/molly_cici/article/details/102626757.
[4] 劉暢,王軼辰,劉斌,等.軟件邊界組合測試的典型案例分析[J].計算機工程與應用,2009,45(20):74-77.
[5] SCHWARZ.豐田栽了的原因[EB/OL].(2013-11-03)[2021-09-27].http://www.amobbs.com/thread-5557598-1-1.html.
【通聯編輯:謝媛媛】
收稿日期:2021-06-20
作者簡介:李莉(1978—),女,江蘇啟東人,高級工程師,碩士,研究方向為軟件工程、軟件測試、軟件開發技術;張青(1979—),男,江蘇啟東人,高級工程師,碩士,研究方向為軟件工程、軟件研發。