測試數據生成的過程就是在輸入域中,尋找滿足測試準則(如語句覆蓋、分支覆蓋或路徑覆蓋)的輸入數據的過程。
關于結構測試,有三種測試數據生成方法:隨機測試數據生成方法、面向目標的測試數據生成方法以及面向路徑的測試數據生成方法。
對于給定的語句(分支或路徑),隨機測試數據生成方法是在輸入域內隨機選取測試數據,使得給定語句被執行。
面向目標的測試數據生成方法,依據程序控制流信息,將程序中所有的分支分成兩類:一類是影響目標結點的分支,另一類是不影響目標結點的分支。測試數據生成時,根據影響目標結點的那些分支,生成相應的測試數據,使得給定語句被執行。為了能按照預定的分支,走向給定語句,數據依賴分析是必要的。分析數據依賴關系,識別影響給定語句執行的那些語句,即先于給定結點執行的結點序列,再考慮影響目標結點的那些分支,可以提高測試數據生成效率。面向目標的測試數據生成方法,與路徑選擇無關,雖然可以達到語句覆蓋、分支覆蓋,但在結構測試覆蓋準則中,路徑覆蓋率是較低的,只有當程序中每一條路徑都被測試了,才能說程序得到了全面的檢驗。
面向路徑的測試數據生成方法,首先確定一條經過給定語句的程序路徑,這條路徑可以自動生成,也可以人為指定。然后在輸入域中尋找輸入數據,使得在此輸入之下,程序沿該路徑運行,從而使得給定語句被執行。面向路徑的測試數據生成又分為符號執行和實際程序執行兩類。符號執行允許程序輸入常量、符號值、符號表達式等,以符號計算代替實際執行的數值計算,產生一個符號輸入值的代數表達式,即路徑約束,它是選定路徑的謂詞系統。實際上是對輸入數據的限制要求,由多個不等式(等式)組成。通過求解不等式,求取滿足路徑上各限制謂詞的測試數據。若系統無解,則相應的路徑為不可行路徑。與邏輯電路測試類似,軟件測試也可以基于故障來產生。用代數約束來描述檢測特定類型故障的測試數據。符號執行能夠判定路徑的可行性,一次符號測試的結果代表了一類普通測試的運行結果,因此測試成本較低。但在遇到循環、過程調用、動態數據結構、數組和指針處理時,符號執行實現困難;诔绦驅嶋H執行的測試數據生成方法可以對選定路徑上的分支謂詞,寫出一個邏輯表達式,再進行布爾函數極小化,以確定輸入數據,使程序執行沿選定路徑進行。也可以利用迭代逼近法,求取滿足選定路徑上所有謂詞的輸入值。每次迭代中,執行與選定路徑謂詞有關的語句,得到一個線性約束集,求解該線性約束集,獲得一個輸入增量,進而得到下次迭代的輸入值,最終產生選定路徑的測試數據。也可以用約束求解的方法生成測試數據,將被測程序轉化成一個約束系統,然后尋找經過給定語句的路徑,生成相應的測試數據;诔绦驅嶋H執行的測試數據生成方法,在程序執行的每一步,數組下標、指針值都是確定的。因此,對數組和指針的處理方便,但其測試數據生成與路徑選擇有關,而判定所選路徑是否為可行路徑是一件非常困難的事情。
隨機測試數據生成、面向目標的測試數據生成和面向路徑的測試數據生成方法大多只利用控制流信息生成測試數據。而利用數據流信息生成測試則是另一類測試生成方法。該方法將數據流信息應用到路徑選擇中,并定義了相應的測試覆蓋準則。例如,所有定義引用路徑覆蓋準則是指在一個變量被定義之后,所有引用該變量的語句都必須被覆蓋。而所有定義覆蓋準則則要求所有定義變量的語句都必須被覆蓋。所有計算引用覆蓋準則要求所有計算出來的變量被引用的通路都必須被覆蓋。數據流測試已經開發了一些軟件測試工具,例如ATAC,能夠評估測試集的覆蓋率,識別未被覆蓋的程序范圍等,有利于指導選擇測試用例,提高測試覆蓋率。但是,無論哪一種結構測試,即使其覆蓋率達到百分之百,也不能保證把所有隱藏的程序缺陷都揭露出來。
文章來源于領測軟件測試網 http://www.kjueaiud.com/