軟件可靠性牽涉到軟件生產的全過程,但最終還是落實到軟件產品上。而保證軟件可靠性的關鍵步驟是軟件測試。
軟件測試是為了發現故障而執行程序的過程。其目的是以盡可能少的時間和人力發現并改正軟件中潛在的各種故障及缺陷。因此,軟件測試與軟件可靠性緊密相關。軟件中隱藏的故障數目,直接決定軟件的可靠性。所以,在軟件投入運行之前必須進行軟件測試,以盡可能多地發現軟件中的故障,提高軟件可靠性。而在軟件運行過程中,則需要軟件維修測試。
隨著人們對軟件測試重要性認識的加深以及軟件系統的日益復雜,軟件測試在整個軟件開發周期中所占的比例日益增大。目前,許多軟件開發機構已將研制力量的40%以上花費在軟件測試上。特殊情況下,對于要求高可靠性的軟件,例如飛行控制、核反應堆監控軟件等,其軟件測試費用甚至高達軟件開發其它階段所用費用總和的3-5倍。
1. 軟件測試工程
軟件測試的實質是根據軟件開發各階段的規格說明和程序的內部結構精心選取一批測試數據,形成測試用例,并用這些測試用例去驅動被測程序,觀察程序的執行結果,驗證所得結果與預期結果是否一致,然后做相應的調整。所以,軟件測試本身是一個工程。軟件測試的團隊必須不同于該軟件的設計團隊,它必須獨立地確定軟件測試規范、生成測試數據、進行測試結果分析、寫出測試報告。這一過程可能要反復進行多次,以達到預定的可靠性。在此過程中,測試數據生成是軟件測試的核心與關鍵。不同測試數據對發現軟件故障的能力差別很大。某些測試數據能夠有效地發現故障,而其他一些測試數據也可能完全是徒勞。為了節約時間和資源,提高測試效率,必須從大量的輸入數據中精心挑選出少數有代表性的測試數據,使得采用這些測試數據能夠達到最佳的測試效果,高效地把隱藏的故障揭露出來。為此,探討如何生成高質高效的測試數據,至關重要。而軟件測試生成與被測軟件的性質、功能和可靠性要求緊密相關。
2.基于程序結構的測試生成
基于規范的功能測試又稱黑盒測試,是以檢查程序功能來檢測程序是否按照規格說明書的規定正確地運行,它以規范說明為依據,選擇和設計測試用例;诔绦虻慕Y構測試又稱白盒測試,則根據程序的內部結構設計測試用例,檢測程序在各種不同的情況下是否都按預定的要求正確地運行;谝幏兜臏y試數據生成和基于程序的測試數據生成是兩類常用的軟件測試數據生成方法。
結構測試要求對被測程序的結構特性作到一定程度的覆蓋。覆蓋準則一般有以下幾種:
① 語句覆蓋
希望用測試數據運行被測程序時,被測程序的每一個語句都能被執行。至少說明每一個語句都是可達的,在該測試條件下,程序是正確的。當然我們并不能保證在其他條件下,程序執行該語句時是否也能正確。
② 分支覆蓋
在If … then … else …語句中,條件語句測試執行一次是不夠的。因為必須讓條件為真和為假,至少執行兩次。而在Case語句中必須運行所有的情況,而且,還要運行不屬于所列情況的default情況。所以,對這些分支語句,必須覆蓋所有可能的分支。分支覆蓋率就是考察測試數據覆蓋了百分之多少的分支。 [Page]
③路徑覆蓋
由于程序中有分支、循環、遞歸、調用、跳變等語句,一個程序可以用一個控制流或數據流圖來表示。程序的每一次運行都是沿著某一條路徑走的。程序在運行這些測試數據時,沿著許多路徑都運行過。如果能沿著所有路徑都運行一遍,當然很好。如果能做到完全的路徑覆蓋,就必然達到100%的分支覆蓋和語句覆蓋。但是,對于較大的程序,基本上不可能沿著所有路徑都運行一遍,因為路徑數太多了。運行過的路徑數對所有路徑數的百分比就是路徑覆蓋率。
測試數據生成的過程就是在輸入域中,尋找滿足測試準則(如語句覆蓋、分支覆蓋或路徑覆蓋)的輸入數據的過程。
關于結構測試,有三種測試數據生成方法:隨機測試數據生成方法、面向目標的測試數據生成方法以及面向路徑的測試數據生成方法。
對于給定的語句(分支或路徑),隨機測試數據生成方法是在輸入域內隨機選取測試數據,使得給定語句被執行。
面向目標的測試數據生成方法,依據程序控制流信息,將程序中所有的分支分成兩類:一類是影響目標結點的分支,另一類是不影響目標結點的分支。測試數據生成時,根據影響目標結點的那些分支,生成相應的測試數據,使得給定語句被執行。為了能按照預定的分支,走向給定語句,數據依賴分析是必要的。分析數據依賴關系,識別影響給定語句執行的那些語句,即先于給定結點執行的結點序列,再考慮影響目標結點的那些分支,可以提高測試數據生成效率。面向目標的測試數據生成方法,與路徑選擇無關,雖然可以達到語句覆蓋、分支覆蓋,但在結構測試覆蓋準則中,路徑覆蓋率是較低的,只有當程序中每一條路徑都被測試了,才能說程序得到了全面的檢驗。
面向路徑的測試數據生成方法,首先確定一條經過給定語句的程序路徑,這條路徑可以自動生成,也可以人為指定。然后在輸入域中尋找輸入數據,使得在此輸入之下,程序沿該路徑運行,從而使得給定語句被執行。面向路徑的測試數據生成又分為符號執行和實際程序執行兩類。符號執行允許程序輸入常量、符號值、符號表達式等,以符號計算代替實際執行的數值計算,產生一個符號輸入值的代數表達式,即路徑約束,它是選定路徑的謂詞系統。實際上是對輸入數據的限制要求,由多個不等式(等式)組成。通過求解不等式,求取滿足路徑上各限制謂詞的測試數據。若系統無解,則相應的路徑為不可行路徑。與邏輯電路測試類似,軟件測試也可以基于故障來產生。用代數約束來描述檢測特定類型故障的測試數據。符號執行能夠判定路徑的可行性,一次符號測試的結果代表了一類普通測試的運行結果,因此測試成本較低。但在遇到循環、過程調用、動態數據結構、數組和指針處理時,符號執行實現困難;诔绦驅嶋H執行的測試數據生成方法可以對選定路徑上的分支謂詞,寫出一個邏輯表達式,再進行布爾函數極小化,以確定輸入數據,使程序執行沿選定路徑進行。也可以利用迭代逼近法,求取滿足選定路徑上所有謂詞的輸入值。每次迭代中,執行與選定路徑謂詞有關的語句,得到一個線性約束集,求解該線性約束集,獲得一個輸入增量,進而得到下次迭代的輸入值,最終產生選定路徑的測試數據。也可以用約束求解的方法生成測試數據,將被測程序轉化成一個約束系統,然后尋找經過給定語句的路徑,生成相應的測試數據;诔绦驅嶋H執行的測試數據生成方法,在程序執行的每一步,數組下標、指針值都是確定的。因此,對數組和指針的處理方便,但其測試數據生成與路徑選擇有關,而判定所選路徑是否為可行路徑是一件非常困難的事情。 [Page] 隨機測試數據生成、面向目標的測試數據生成和面向路徑的測試數據生成方法大多只利用控制流信息生成測試數據。而利用數據流信息生成測試則是另一類測試生成方法。該方法將數據流信息應用到路徑選擇中,并定義了相應的測試覆蓋準則。例如,所有定義引用路徑覆蓋準則是指在一個變量被定義之后,所有引用該變量的語句都必須被覆蓋。而所有定義覆蓋準則則要求所有定義變量的語句都必須被覆蓋。所有計算引用覆蓋準則要求所有計算出來的變量被引用的通路都必須被覆蓋。數據流測試已經開發了一些軟件測試工具,例如ATAC,能夠評估測試集的覆蓋率,識別未被覆蓋的程序范圍等,有利于指導選擇測試用例,提高測試覆蓋率。但是,無論哪一種結構測試,即使其覆蓋率達到百分之百,也不能保證把所有隱藏的程序缺陷都揭露出來。
文章來源于領測軟件測試網 http://www.kjueaiud.com/