摘 要:在實踐的基礎(chǔ)上總結(jié)了測試用例生成中的前置條件,進行了分類和參數(shù)化,并將研究結(jié)果應(yīng)用于測試用例自動生成工具,生成了軟件可靠性測試用例。結(jié)果表明對前置條件的研究能夠促進測試用例的自動化生成過程。
關(guān)鍵詞: 前置條件; 測試用例; 測試用例生成; 測試用例自動生成
中圖分類號:TP311文獻標(biāo)志碼:A
文章編號:1001—3695(2007)03—0103—03
前置條件(Precondition)描述這樣一些狀態(tài),由這些狀態(tài),可以成功地執(zhí)行一個操作[1]。在一些系統(tǒng)測試用例的自動生成過程中,自動化工具根據(jù)前置條件的滿足情況選擇不同的路徑自動產(chǎn)生測試用例。前置條件還是測試用例的一個組成部分,它和由某種測試方法所標(biāo)志的實際輸入一起構(gòu)成了測試用例的完整輸入[2]。在測試過程中,測試人員或自動化工具根據(jù)前置條件決定是否執(zhí)行測試用例,因此對前置條件的分類和參數(shù)化有助于提高軟件測試的自動化過程。
當(dāng)前存在的測試用例開發(fā)方法很少涉及前置條件,如實時軟件測試用例開發(fā)方法主要講述如何根據(jù)實時軟件的特點生成測試輸入,沒有提過前置條件[3];部分基于Z規(guī)格說明或UML規(guī)格說明的測試用例自動生成技術(shù),為了實現(xiàn)自動生成測試用例而在其形式化規(guī)格說明中描述了前置條件,但也存在諸多不足[4—7]。
形式化規(guī)格說明是對軟件系統(tǒng)或構(gòu)件的接口,即對程序輸入與輸出之間約束關(guān)系進行的形式化描述[8]。目前使用最為廣泛的一種形式化規(guī)格說明語言是Z語言,但Z語言描述的前置條件不但隱晦而且煩瑣,需要進行一定的變換和簡化[1,9]。Anuradha Sridhar等人使用C—Expressions來表達頂層設(shè)計轉(zhuǎn)換的前置條件[10],但C—Expressions只能描述控制流圖中的并發(fā)、條件和循環(huán)控制 [11]。無論是Z語言、C—Expressions,還是面向?qū)ο蟮腢ML語言,均無法描述本文后面提到的前置約束和時間約束等前置條件。
1 前置條件分析
軟件功能和使用方式的復(fù)雜性決定了前置條件的多樣性。在測試用例的生成過程中,前置條件可能涉及時間、資源、輸入數(shù)據(jù)和輸出數(shù)據(jù)等諸多方面。有的前置條件比較單一,僅包含其中的一個方面;有的比較復(fù)雜,是其中多個方面的組合。假設(shè)前置條件是由若干個最基本的前置條件組合而成的,本文將這種最基本的前置條件稱為約束,只要整理出約束的不同類型和相互之間的關(guān)系就不難分析出前置條件。從實踐中總結(jié)出前置條件的約束類型包括前置約束、環(huán)境約束、時間約束和值約束。
1.1 前置約束
軟件的某項操作可能要求必須在其他某項或某幾項的操作執(zhí)行完成之后才能進行。以數(shù)據(jù)庫為例,只有完成打開數(shù)據(jù)庫的操作之后才能進行數(shù)據(jù)庫的添加、修改和刪除。前置約束就是用來標(biāo)志這種基本前置條件的約束。
1.2 環(huán)境約束
軟件的使用離不開運行環(huán)境,軟件的運行環(huán)境除了運行軟件本身需要的硬件支持(如主頻、內(nèi)存、硬盤空間要求等)外,還包括為實現(xiàn)軟件功能而交聯(lián)的其他硬件設(shè)備(如掃描儀、打印機等)。軟件測試時還可能需要某些特定的軟硬件來模擬測試輸入,捕獲測試輸出,構(gòu)成軟件的測試環(huán)境。本文通過環(huán)境約束來表征軟件的運行環(huán)境和測試環(huán)境狀態(tài)。
定義2 如果軟件在執(zhí)行某項操作O之前要求環(huán)境(運行環(huán)境、測試環(huán)境)的某硬件或軟件指標(biāo)必須在一定的范圍之內(nèi),那么就稱此指標(biāo)及其必須滿足的范圍是操作O的環(huán)境約束,邏輯表達式為
以打印功能為例,軟件在執(zhí)行打印功能時要求至少一臺打印機空閑,用環(huán)境變量SpareComputerNum表示空閑的打印機數(shù)量,打印功能的環(huán)境約束就可以用SpareComputerNum{(0,∞)}表示。
1.3 時間約束
軟件有的操作可能不僅要求在此之前必須執(zhí)行過某項操作,還要求必須在某項操作開始執(zhí)行或執(zhí)行完畢后的某段時間內(nèi)才能執(zhí)行。在實時嵌入式系統(tǒng)中這類要求比較常見,如飛機的SMP要求在發(fā)出投彈命令的x秒內(nèi)發(fā)射導(dǎo)彈,否則將認(rèn)為導(dǎo)彈故障。在前置條件分析過程中將這類條件歸為時間約束。
定義3 如果操作O必須在前面某項操作PreO開始執(zhí)行或執(zhí)行完畢之后的某段時間之內(nèi)才能成功執(zhí)行,那么稱操作PreO開始執(zhí)行或執(zhí)行完畢之后的這段時間為操作O的時間約束。時間約束根據(jù)相對PreO時間點的不同分成相對啟動時刻約束和相對終止時刻約束。相對啟動時刻約束是相對于PreO開始執(zhí)行時刻的時間范圍,邏輯表達式為
以為無窮,在實際使用中表示時間的默認(rèn)邊界。
如果操作O在操作PreO開始執(zhí)行或執(zhí)行完畢后的規(guī)定時間范圍內(nèi)執(zhí)行,則約束滿足,表達式的值為真;反之則約束不滿足,表達式的值為假。
上述SMP統(tǒng)計導(dǎo)彈故障的時間約束可以表示為STOP_TIME{FireMissile,[x, ∞]},其中FireMissile表示投彈操作,x表示時間。
1.4 值約束
值約束是前置條件中最復(fù)雜的一類約束,它以系統(tǒng)的輸入/輸出變量作為約束對象,而輸入/輸出變量與時間之間、輸入/輸出變量與環(huán)境變量之間、輸入變量與輸出變量相互之間以及輸入/輸出變量自身之間均可能存在約束。
定義4 如果軟件的某個輸入/輸出變量必須滿足一定的范圍,該范圍由其他變量或值進行約束,操作O才能夠成功地執(zhí)行,那么稱該變量及其范圍為操作O的值約束。值約束的邏輯表達式為
如果Variable的值等于列出的某個表達式Expi的值或落在列出的某個范圍Rangej之內(nèi),則約束滿足,表達式的值為真;反之則約束不滿足,表達式的值為假。
假設(shè)某飛機要求進入巡航的高度是6 000—10 000m,如果用Height表示高度,那么該飛機進入巡航的值約束是Height{(6 000,10 000)}。
1.5 約束之間的關(guān)系
前置條件的四類約束之間不是相互孤立的,而是存在著聯(lián)系的。深入了解約束之間的相互關(guān)系,有助于在軟件測試過程中更好地分析和描述前置條件。各類約束之間的關(guān)系如下:
(1)時間約束隱含前置約束
從定義3不難看出所有時間約束均包含前置約束Cove rage{PreO}。
(2)值約束隱含前置約束
當(dāng)值約束中的Expi和Rangej是由其他輸入/輸出變量組成時,為了達到當(dāng)前的狀態(tài)就必然要求執(zhí)行包含有相應(yīng)輸入/輸出變量的操作,這恰好滿足前置約束的定義,所以說值約束隱含著前置約束。
(3)環(huán)境約束與值約束表達式的相似性
環(huán)境約束表達式與值約束表達式在形式上具有相似性。如果值約束的Expi和Rangej都是由常數(shù)組成的,則可以發(fā)現(xiàn)此時值約束的表達式與環(huán)境約束的表達式相同。
1.6 約束組合
約束是最基本的前置條件,約束之間可以通過邏輯組合形成其他前置條件。前置條件表達式就是用邏輯運算符連接不同的約束表達式而成,考慮約束之間的相互關(guān)系和邏輯表達式自身的特點,前置條件表達式最終可以簡化,轉(zhuǎn)換成由∧、∨、「和約束組成的邏輯表達式[12],如
2 實現(xiàn)與實例
2.1 實現(xiàn)
以上研究內(nèi)容在本單位開發(fā)的測試用例自動生成工具TCS中已經(jīng)得到實現(xiàn),在TCS中可以直接配置前置約束和時間約束。由于環(huán)境約束和值約束表達式存在形式上的相似,TCS使用變量約束的方法將兩者統(tǒng)一起來進行配置。約束配置完成后再進行約束組合就能表達出要求的前置條件,如圖1所示。在測試用例自動生成過程中,TCS首先分析前置條件表達式中包含哪些約束和邏輯關(guān)系,接著確定單個約束的取值,最后根據(jù)邏輯關(guān)系得到前置條件的取值。如果前置條件滿足,TCS繼續(xù)為當(dāng)前測試用例生成輸入;否則,TCS根據(jù)不同情況決定是中止當(dāng)前測試用例生成還是選擇其他路徑繼續(xù)生成。
2.2 一個實例
以對本單位開發(fā)的軟件可靠性評估工具SRET進行的軟件可靠性測試為例來說明如何分析和表示前置條件。
無失效驗證方案參數(shù)確定是SRET的一項功能,為了使用SRET確定出無失效驗證方案的參數(shù),就要求輸入變量測試類別的取值必須是無失效運行測試,同時輸入變量對話框狀態(tài)的取值必須是關(guān)閉狀態(tài)。
上述分析表明,無失效驗證方案參數(shù)確定的前置條件包括兩個變量約束:如果用TestType表示變量測試類別,用NoFai ̄lureTest表示TestType的取值無失效運行測試,用DialogState表示變量對話框狀態(tài),用Closed表示DialogState的取值關(guān)閉狀態(tài),那么這兩個變量約束就可以表示為TestType{NoFailure ̄Test}和DialogState{Closed};又由于只有當(dāng)這兩個約束同時滿足時才能進行參數(shù)確定,兩者之間存在邏輯與的關(guān)系,所以無失效驗證方案參數(shù)確定的前置條件可以表示成TestType{NoFailureTest}∧DialogState{Closed}。
同理分析SRET其他功能的前置條件,最后根據(jù)分析結(jié)果自動生成軟件可靠性測試用例。限于篇幅,生成的測試用例不在此處列出。
3 結(jié)束語
本文在工程實踐的基礎(chǔ)上較為系統(tǒng)地分析了測試用例生成過程中的前置條件,并對前置條件進行了分類和參數(shù)化。研究結(jié)果既適用于在形式化規(guī)格說明中描述前置條件,又適用于描述測試用例中的前置條件。實踐表明,本文的研究結(jié)果能夠準(zhǔn)確方便地描述前置條件,進而提高了軟件測試用例的自動生成過程。本文主要基于對嵌入式軟件的分析和研究,研究結(jié)果是否適用于其他類型的軟件還有待驗證。
長期以來,前置條件在軟件測試中處于被忽略的地位,本文的撰寫希望引起有關(guān)人員的注意,將這方面的研究工作深入開展下去。
本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。