嵌入式軟件運行剖面建模及測試用例生成
每一個(gè)運行經(jīng)算法作用后,都表示為一Markov鏈,根據算法,可以看出,該Markov鏈之包含了運行中的帶有輸入的節點(diǎn)以及其中的一些關(guān)鍵節點(diǎn),該Markov鏈綜合了每個(gè)運行的運行圖以及其狀態(tài)細化圖,以下的程序處理都基于此Markov鏈。
測試用例是根據運行剖面隨機生成的。在運行剖面中已經(jīng)規定了每個(gè)輸入變量的取值類(lèi)型以及取值范圍,并且認為變量在取值范圍內均勻分布或分段均勻分布(由于很難確定變量的具體分布,這里假設為均勻分布)。軟件可靠性測試是一種隨機測試,測試用例的選取方式是隨機選取。因此,根據隨機測試的原則,在運行剖面給定的輸入變量的取值區間內任意抽取一個(gè)變量的實(shí)際取值。將各個(gè)變量按順序組合起來(lái)便生成了測試用例。用于軟件可靠性測試的測試用例可以定義為:根據運行剖面生成的、完成對某一功能進(jìn)行測試的、按順序輸入到被測軟件的一系列輸入變量的有序組合。
嵌入式系統中,輸入可能為硬件信號或者人機接口,這就需要在標示測試輸入類(lèi)型時(shí)進(jìn)行特殊標記,這里,可采用兩種方法,一是軟件模擬硬件信號,即當需要硬件信號時(shí),由軟件模擬此硬件信號,來(lái)保證測試的執行。二是對需要的硬件信號進(jìn)行標示,當需要硬件信號時(shí),系統會(huì )提示需要某個(gè)硬件信號的觸發(fā)。
根據運行剖面生成測試用例的過(guò)程為:運行剖面由一系列變量的取值區間和該運行發(fā)生的概率組成。
首先,要隨機抽取一個(gè)運行來(lái)實(shí)現對某一功能的一次測試。抽取運行的過(guò)程如下:
?、?將運行剖面{OPi|OPi=<Oi,Pi>,i=1,2,…,N}中所有運行發(fā)生的概率Pi求前j項和,形成一個(gè)數列{Sj},Sj=∑Pi,其中,i=1,…j,j=1,2,…,N;N為軟件運行剖面中運行總數,規定S0=0,并有S1=P1,Sn=1.0,Sj-Sj-1=Pj。這里運行相互獨立。
?、?任給一個(gè)隨機數η∈(0,1.0),觀(guān)察η落在哪個(gè)區間,若η滿(mǎn)足Sj-1<η≤Sj,則該隨機數η與Pj這個(gè)概率值對應,那么這次隨機抽到的運行為Oj。
?、?確定了抽到的運行為Oi后,就可以確定該運行的輸入情況,假設該運行有m個(gè)輸入,每個(gè)輸入的可選值分別為I1,I2…Im,將其排列為一個(gè)二進(jìn)制串,若I1有m1個(gè)可選輸入,I2有m2個(gè)可選輸入Im有mm個(gè)可選輸入,則二進(jìn)制串為(00…0) (00…0)……(00…0),其中,第一個(gè)括號內的0有m1個(gè),第二個(gè)括號中的0有m2個(gè),第m個(gè)括號中的0有mm個(gè),構造一個(gè)布爾類(lèi)型的數組,數組的大小為2(I1+I2+…+Im),數組的初始值均為false,每次產(chǎn)生一個(gè)測試用例時(shí),從m個(gè)輸入的I1,I2…Im中每一個(gè)輸入的可選值中各選一個(gè),并把二進(jìn)制串中的相應位置1,m個(gè)輸入都選好后,把對應的標記數組置為true。生成一個(gè)測試用例后,首先判斷對應的標記數組,若為true,則需要重新生成一個(gè)用例。
?、?其中,要進(jìn)行第二次抽樣來(lái)確定運行中每個(gè)輸入的取值區間將取到的實(shí)體(即具體取值)。實(shí)體的確定將按照輸入變量的屬性分兩種情況進(jìn)行:
?、?對于連續型輸入變量,運行剖面給出的是該變量的取值區間的上下限[I.down,I.up]。抽樣時(shí)將根據輸入變量的數據類(lèi)型,在區間[I.down,I.up]內隨機抽取一個(gè)滿(mǎn)足輸入變量數據類(lèi)型的具體值,作為該輸入變量的實(shí)體。
?、?對于可選離散型輸入變量,運行剖面給出的是一組離散點(diǎn)Ii,i=1,2,…,mi;mi為離散點(diǎn)的個(gè)數。抽樣時(shí)將在[1,mi]內隨機抽取一個(gè)整數j,以確定選哪一個(gè)離散點(diǎn)作為該輸入變量的實(shí)體,并將該實(shí)體轉化為該輸入變量的數據類(lèi)型。
?、?通過(guò)對運行和各個(gè)實(shí)體兩個(gè)步驟的抽樣,完成一個(gè)測試用例的生成。
應用測試用例可以進(jìn)行軟件可靠性測試: 圖1 測試系統
系統負責根據以上算法策略等產(chǎn)生測試用例,輸入到整個(gè)測試系統中,執行可靠性測試,測試系統根據某種判斷策略,來(lái)決定此用例是否通過(guò)測試,若在規定的時(shí)間內,規定的輸入條件下,所有用例均通過(guò)測試,則測試完成,若其中有測試用例沒(méi)有通過(guò)測試,只需要對被測軟件進(jìn)行修改,消除其中的錯誤,再次進(jìn)行測試,而整個(gè)測試系統不需要任何改動(dòng),大大的提高了測試的效率和靈活性。這種測試是統計測試,測試完全根據各個(gè)運行所發(fā)生的概率以及運行的權重來(lái)進(jìn)行的,在測試中, 優(yōu)先測試那些最重要或最頻繁使用的功能,釋放和緩解最高級別的風(fēng)險,有助于盡早發(fā)現那些對可靠性有最大影響的故障。
4.結束語(yǔ)
本文完全從工程應用的角度出發(fā),根據被測軟件的需求規格說(shuō)明書(shū),通過(guò)和軟件使用人員充分的交流,由測試人員構造出軟件的運行剖面,并用文中定義的運行圖來(lái)描述,經(jīng)過(guò)算法轉化為帶標記的 Markov鏈描述,依據該Markov鏈,可以自動(dòng)生成測試用例。配合相應的測試環(huán)境,進(jìn)行自動(dòng)化的可靠性測試,可以極大的提高測試的效率,被測嵌入式系統的可靠性也可以進(jìn)行更加充分的驗證。
今后的工作主要是輸入模型的提取與識別以及重組,從本文的前面,可以看出,系統的輸入還是比較繁瑣的,如果能夠直接讀取被測軟件的UML圖,從圖中提取各種信息,從而自動(dòng)構造軟件的運行剖面,則可以使整個(gè)過(guò)程更加高效,符合軟件測試的發(fā)展趨勢。此外,支撐測試環(huán)境的搭建,也需要認真的研究。
本文作者創(chuàng )新點(diǎn):
1.傳統的軟件測試都是根據軟件的源代碼進(jìn)行測試,本文則根據軟件的需求規格說(shuō)明書(shū)進(jìn)行測試,大大提高了測試的效率和靈活性。
2.用帶標記的Markov鏈對軟件運行剖面建模,為自動(dòng)產(chǎn)生測試用例打下了基礎。
3.能對產(chǎn)生的測試用例情況進(jìn)行標記,避免產(chǎn)生相同的測試用例,提高了測試的效率。
評論