可信計算V軟件測試

 

軟件可靠性牽涉到軟件生產的全過程,但最終還是落實到軟件產品上。而保證軟件可靠性的關鍵步驟是軟件測試。

軟件測試是爲了發現故障而執行程序的過程。其目的是以儘可能少的時間和人力發現並改正軟件中潛在的各種故障及缺陷。因此,軟件測試與軟件可靠性緊密相關。軟件中隱藏的故障數目,直接決定軟件的可靠性。所以,在軟件投入運行之前必須進行軟件測試,以儘可能多地發現軟件中的故障,提高軟件可靠性。而在軟件運行過程中,則需要軟件維修測試。

隨着人們對軟件測試重要性認識的加深以及軟件系統的日益複雜,軟件測試在整個軟件開發週期中所佔的比例日益增大。目前,許多軟件開發機構已將研製力量的40%以上花費在軟件測試上。特殊情況下,對於要求高可靠性的軟件,例如飛行控制、核反應堆監控軟件等,其軟件測試費用甚至高達軟件開發其它階段所用費用總和的3-5倍。

 

1.   軟件測試工程

軟件測試的實質是根據軟件開發各階段的規格說明和程序的內部結構精心選取一批測試數據,形成測試用例,並用這些測試用例去驅動被測程序,觀察程序的執行結果,驗證所得結果與預期結果是否一致,然後做相應的調整。所以,軟件測試本身是一個工程。軟件測試的團隊必須不同於該軟件的設計團隊,它必須獨立地確定軟件測試規範、生成測試數據、進行測試結果分析、寫出測試報告。這一過程可能要反覆進行多次,以達到預定的可靠性。在此過程中,測試數據生成是軟件測試的核心與關鍵。不同測試數據對發現軟件故障的能力差別很大。某些測試數據能夠有效地發現故障,而其他一些測試數據也可能完全是徒勞。爲了節約時間和資源,提高測試效率,必須從大量的輸入數據中精心挑選出少數有代表性的測試數據,使得采用這些測試數據能夠達到最佳的測試效果,高效地把隱藏的故障揭露出來。爲此,探討如何生成高質高效的測試數據,至關重要。而軟件測試生成與被測軟件的性質、功能和可靠性要求緊密相關。

 

2.基於程序結構的測試生成

 

基於規範的功能測試又稱黑盒測試,是以檢查程序功能來檢測程序是否按照規格說明書的規定正確地運行,它以規範說明爲依據,選擇和設計測試用例。基於程序的結構測試又稱白盒測試,則根據程序的內部結構設計測試用例,檢測程序在各種不同的情況下是否都按預定的要求正確地運行。基於規範的測試數據生成和基於程序的測試數據生成是兩類常用的軟件測試數據生成方法。

結構測試要求對被測程序的結構特性作到一定程度的覆蓋。覆蓋準則一般有以下幾種:

    語句覆蓋

希望用測試數據運行被測程序時,被測程序的每一個語句都能被執行。至少說明每一個語句都是可達的,在該測試條件下,程序是正確的。當然我們並不能保證在其他條件下,程序執行該語句時是否也能正確。

    分支覆蓋

If … then … else …語句中,條件語句測試執行一次是不夠的。因爲必須讓條件爲真和爲假,至少執行兩次。而在Case語句中必須運行所有的情況,而且,還要運行不屬於所列情況的default情況。所以,對這些分支語句,必須覆蓋所有可能的分支。分支覆蓋率就是考察測試數據覆蓋了百分之多少的分支。

③路徑覆蓋

由於程序中有分支、循環、遞歸、調用、跳變等語句,一個程序可以用一個控制流或數據流圖來表示。程序的每一次運行都是沿着某一條路徑走的。程序在運行這些測試數據時,沿着許多路徑都運行過。如果能沿着所有路徑都運行一遍,當然很好。如果能做到完全的路徑覆蓋,就必然達到100%的分支覆蓋和語句覆蓋。但是,對於較大的程序,基本上不可能沿着所有路徑都運行一遍,因爲路徑數太多了。運行過的路徑數對所有路徑數的百分比就是路徑覆蓋率。

測試數據生成的過程就是在輸入域中,尋找滿足測試準則(如語句覆蓋、分支覆蓋或路徑覆蓋)的輸入數據的過程。

關於結構測試,有三種測試數據生成方法:隨機測試數據生成方法、面向目標的測試數據生成方法以及面向路徑的測試數據生成方法。

n        對於給定的語句(分支或路徑),隨機測試數據生成方法是在輸入域內隨機選取測試數據,使得給定語句被執行。

n        面向目標的測試數據生成方法,依據程序控制流信息,將程序中所有的分支分成兩類:一類是影響目標結點的分支,另一類是不影響目標結點的分支。測試數據生成時,根據影響目標結點的那些分支,生成相應的測試數據,使得給定語句被執行。爲了能按照預定的分支,走向給定語句,數據依賴分析是必要的。分析數據依賴關係,識別影響給定語句執行的那些語句,即先於給定結點執行的結點序列,再考慮影響目標結點的那些分支,可以提高測試數據生成效率。面向目標的測試數據生成方法,與路徑選擇無關,雖然可以達到語句覆蓋、分支覆蓋,但在結構測試覆蓋準則中,路徑覆蓋率是較低的,只有當程序中每一條路徑都被測試了,才能說程序得到了全面的檢驗。

n        面向路徑的測試數據生成方法,首先確定一條經過給定語句的程序路徑,這條路徑可以自動生成,也可以人爲指定。然後在輸入域中尋找輸入數據,使得在此輸入之下,程序沿該路徑運行,從而使得給定語句被執行。面向路徑的測試數據生成又分爲符號執行和實際程序執行兩類。符號執行允許程序輸入常量、符號值、符號表達式等,以符號計算代替實際執行的數值計算,產生一個符號輸入值的代數表達式,即路徑約束,它是選定路徑的謂詞系統。實際上是對輸入數據的限制要求,由多個不等式(等式)組成。通過求解不等式,求取滿足路徑上各限制謂詞的測試數據。若系統無解,則相應的路徑爲不可行路徑。與邏輯電路測試類似,軟件測試也可以基於故障來產生。用代數約束來描述檢測特定類型故障的測試數據。符號執行能夠判定路徑的可行性,一次符號測試的結果代表了一類普通測試的運行結果,因此測試成本較低。但在遇到循環、過程調用、動態數據結構、數組和指針處理時,符號執行實現困難。基於程序實際執行的測試數據生成方法可以對選定路徑上的分支謂詞,寫出一個邏輯表達式,再進行布爾函數極小化,以確定輸入數據,使程序執行沿選定路徑進行。也可以利用迭代逼近法,求取滿足選定路徑上所有謂詞的輸入值。每次迭代中,執行與選定路徑謂詞有關的語句,得到一個線性約束集,求解該線性約束集,獲得一個輸入增量,進而得到下次迭代的輸入值,最終產生選定路徑的測試數據。也可以用約束求解的方法生成測試數據,將被測程序轉化成一個約束系統,然後尋找經過給定語句的路徑,生成相應的測試數據。基於程序實際執行的測試數據生成方法,在程序執行的每一步,數組下標、指針值都是確定的。因此,對數組和指針的處理方便,但其測試數據生成與路徑選擇有關,而判定所選路徑是否爲可行路徑是一件非常困難的事情。

隨機測試數據生成、面向目標的測試數據生成和麪向路徑的測試數據生成方法大多隻利用控制流信息生成測試數據。而利用數據流信息生成測試則是另一類測試生成方法。該方法將數據流信息應用到路徑選擇中,並定義了相應的測試覆蓋準則。例如,所有定義引用路徑覆蓋準則是指在一個變量被定義之後,所有引用該變量的語句都必須被覆蓋。而所有定義覆蓋準則則要求所有定義變量的語句都必須被覆蓋。所有計算引用覆蓋準則要求所有計算出來的變量被引用的通路都必須被覆蓋。數據流測試已經開發了一些軟件測試工具,例如ATAC,能夠評估測試集的覆蓋率,識別未被覆蓋的程序範圍等,有利於指導選擇測試用例,提高測試覆蓋率。但是,無論哪一種結構測試,即使其覆蓋率達到百分之百,也不能保證把所有隱藏的程序缺陷都揭露出來。

 

3.面向對象軟件的測試

 

面向對象的方法(Object-oriented method, OO)是軟件工程方法的一次飛躍。對象是一個具有一組狀態的實體,並封裝了附加於這些狀態的操作。狀態描述了對象的屬性或特徵,操作描述了對象改變其狀態的方法以及該對象爲其他對象所提供的服務。面向對象方法認爲,人類生活在一個由對象組成的世界中。對象可以被歸類、描述、組織、組合、創建和操縱。面向對象方法是一種模型化世界的抽象方法,結構上具有良好的高內聚低耦合特性。採用面向對象技術設計和開發的軟件系統更易於維護,在對系統進行修改時,能夠產生較少的副作用。同時,面向對象技術提出了類、繼承、接口等概念,從而爲對象的複用提供了良好的支持機制。因而採用面向對象技術對軟件產品進行設計與開發,能夠有效地提高軟件組織的開發效率。

隨着面向對象分析和麪向對象設計技術的日漸成熟,面向對象的軟件開發技術得到了軟件界的普遍認可。但是,由於面向對象的程序設計語言提供了數據抽象、繼承、多態和動態綁定等機制,傳統的軟件測試方法以及測試工具已不能爲面向對象的軟件提供良好的支持。

面向對象的程序中,對象是封裝了描述其屬性的數據及可以施加在這些數據上的操作的封裝體。屬性表示對象的狀態,操作表示對象的行爲,消息描述了對象執行操作的規格說明。對象之間通過發送消息啓動相應的操作,通過修改對象的狀態,實現系統狀態間的相互轉換。類是對具有相同屬性和行爲的一組相似對象的描述,它描述了該類對象所具有的共同特徵。面向對象軟件的測試與傳統的軟件測試有所不同。從面向對象單元測試開始,要考慮類間的繼承測試。可以根據類間繼承關係的層次特性對類進行增量測試,即通過複用和增量更新父類的測試信息去指導子類的測試。有人根據類是抽象數據類型的實現這一原理,引入了一種和麪向對象語言語法相似的代數規範描述語言LOBAS,作爲類的測試模型。通過分析軟件的需求和功能規範來選擇和產生測試數據,重點測試一個作用於被測類對象的消息序列能否使該對象處於正確的狀態。也可以採用黑盒測試和白盒測試相結合的方法,用黑盒測試法選取測試用例,用白盒測試來檢測程序執行一個測試用例產生的兩個對象是否觀測等價(即處於相同的抽象狀態),並補充一些測試用例,對類進行測試。

對傳統軟件,測試人員普遍認爲可以分爲四個級別的測試:單元測試、集成測試、確認測試和系統測試。面向對象的程序測試應當分爲幾個級別,目前尚未達成共識。一種意見認爲,從面向對象程序的結構出發,面向對象的程序測試應當分爲四個級別:

1). 行爲級:測試類中定義的每個操作;

2). 類級:測試封裝在一個類中的操作和數據之間的相互作用;

3). 簇級:測試一組協同工作的類之間的相互作用;

4). 系統級:考察由所有類和主程序構成的整個系統。

而另一種意見則認爲面向對象的程序執行實際上是執行一個由外部事件驅動的操作序列。根據這一特徵,應將面向對象的測試分爲五個層次:

1). 行爲測試;

2). 消息路徑測試;

3). 系統基本功能測試;

4). 線程測試;

5). 線程間相互作用測試。

 

繼承是指子類自動共享父類中定義的數據和操作的機制,多態是指當同一個消息被不同的對象接受時,可以導致完全不同的行爲。繼承與多態機制,是面向對象程序實現重用的主要手段,同時也給面向對象軟件的測試提出了一些新的問題。目前關於面向對象軟件測試的研究,大多集中在類和對象狀態的測試方面。雖有文獻提及繼承及動態綁定對軟件測試的影響,但現有的面向對象軟件測試方法大都忽略了動態綁定的作用和影響,而且尚無普遍接受的面向對象軟件測試的充分性準則。對這些問題的深入研究將會對軟件測試的理論與實踐起到積極的指導作用。

 

4.軟件測試工具

 

爲了提高軟件測試效率,加快軟件開發過程,許多公司和大學、科研機構開發了軟件測試工具。我國在軟件測試工具研發方面也做了大量工作。它們大致可分爲靜態分析工具、測試數據生成工具、測試評估工具以及將多種測試工具融爲一體的集成化測試系統等。

· 靜態分析工具

靜態分析工具是在不執行程序的情況下,分析軟件的特性。靜態分析主要集中在需求文檔、設計文檔以及程序結構上,可以進行類型分析、接口分析、輸入輸出規格說明分析等。

· 測試數據生成工具

測試數據生成工具可以爲被測程序自動生成測試數據,減輕人們在生成大量測試數據時付出的勞動,同時還可避免測試人員對一部分測試數據的偏見。

· 測試評估工具

測試評估工具用來評估程序結構元素被覆蓋的程度,從而確定測試運行的充分性。這是使用測試數據生成工具生成測試數據之後必須使用的工具。

· 集成化測試系統

集成化測試系統將多種測試工具融爲一體,是一種功能較強的測試工具。

一般地說,針對一類特定軟件的測試工具,可以是相當有效的。而要想開發對所有軟件系統都有效的軟件測試工具,幾乎是不可能的。並且,經驗表明,走查,即由測試工程師認真閱讀源程序以發現錯誤,仍不失爲一種靠得住的測試方法,雖然這不屬於自動測試方法。

 

5.程序切片技術

 

對於大型的複雜軟件系統的測試,應該提到程序切片技術。它是一種分析和理解程序的技術,廣泛應用於程序調試、測試、逆向工程及軟件維護中。它以切片標準爲準則,從被測程序中抽取滿足切片標準要求的有關語句,忽略許多與此無關的語句,有利於故障原因的定位分析。

程序切片是一個可執行的程序部分,由可能影響程序某個興趣點處變量值的所有語句和謂詞組成。

程序切片分爲靜態切片和動態切片。

靜態切片考慮了程序所有可能的執行路徑。通過分析源程序代碼,獲得有關信息,可以計算程序的靜態切片。對於程序的某個變量而言,靜態切片計算出的該變量值與源程序計算出的該變量值在任何輸入下都是相同的。

動態切片只考慮某個具體輸入下程序的執行路徑,由路徑上影響或間接影響程序某個興趣點處變量值的所有語句和謂詞組成。根據實際輸入執行產生的精確數據流信息,即在特定執行過程中產生的數據依賴,計算程序的動態切片。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章