摘要:隨著信息技術的飛速發展,軟件產品已應用到社會各個領域,因而其質量成為人們共同關注的焦點。質量不佳的系統不僅使開發商的維護費用和用戶的使用成本大幅增加,甚至可能造成災難性的后果。軟件測試是根據被測試對象設計測試用例,組織測試數據,或者說測試是為了發現程序中的錯誤而執行程序的過程。測試應是盡一切可能查出程序錯誤的測試,而一個成功的測試是發現至今為止尚未發現的錯誤的測試。
關鍵詞:軟件;系統測試;錯誤
中圖分類號:TP33 文獻標志碼:A 文章編號:1673-291X(2011)14-0311-02
一、測試前的準備
計算機軟件是基于計算機系統的一個重要組成部分,影響軟件產品質量的原因主要有:(1)龐大的系統規模,使得軟件及系統的復雜性呈指數增長;(2)需求變化引發的項目各部分之間已知或未知的依賴性可能會相互影響導致更多錯誤的出現;(3)代碼文檔的貧乏,導致出錯率增加;(4)軟件開發工具自身的錯誤帶到了軟件中;(4)程序設計人員的經驗不足引發錯誤;(6)項目工期緊張,導致出錯率增加。
軟件開發完畢后應與系統其他合集在一起,此時須要進行一系列系統集成和確認測試。對這些測試的詳細討論已超出軟件工程的范圍,這些測試也不可能僅由軟件開發人員完成。在軟件測試之前,軟件工程師應完成以下工作:(1)為測試軟件系統的輸入信息設計出錯誤處理通路;(2)設計測試用例,模擬錯誤數據和軟件界面可能發生的錯誤,記錄測試結果,為系統測試提供經驗和幫助;(3)參與軟件測試的規劃和設計,保證軟件測試的合理性。
二、軟件測試的目標
測試的目標是什么?G. Myers給出了關于測試的一些規則,這些規則可以看做是測試的目標和意義。(1)測試是為了發現程序中的錯誤而執行程序的過程;(2)好的測試方案是極可能發現迄今為止尚未發現的錯誤的測試方案;(3)成功的測試是發現了至今為止尚未發現的錯誤和測試。
從上述規則可以看出,測試的正確定義是“為了發現程序中的錯誤而執行程序的過程”。這和某些人通常想象的“測試是為了表明程序是正確的”、“成功的測試是沒有發現錯誤的測試”等等是完全相反的。正確認識測試目標是十分重要的,測試目標決定了測試方案的設計。如果為了表明程序的正確而進行測試,就會設計一些不易暴露錯誤的測試方案。由于測試的目標是暴露程序中的錯誤,從心理學角度來看,由程序的編寫者自己測試是不恰當的。因此,在綜合測試階段通常由其他人員組成測試小組來完成測試工作。
三、軟件測試準則
怎樣才能達到軟件測試的目標呢?為了能設計出有效的測試方案,軟件工程師必須深入理解并正確運用指導軟件測試的基本準則。主要的測試準則包括:(1)所有發現測試都應能追溯到用戶需求。正如軟件測試的目標是發現錯誤。從用戶角度來看,最嚴重的錯誤是導致程序不能滿足用戶需求的那些錯誤。(2)應該遠在測試之前就制訂出測試計劃。實際上,一旦完成了需求模型就可以著手制訂測試計劃,在建立了模型之后就可以立即開始設計詳細的測試方案。因此,在編碼之前就可以對所測試的工作進行計劃和設計。(3)應該從“小規模”測試開始,并逐步進行“大規模”測試。通常,首先重點測試單個程序模塊,然后把測試重點轉向在集成的模塊中尋找錯誤,最后在整個系統中尋找錯誤。(4)窮舉測試是不可能的。所謂窮舉測試就是把程序所有可能的執行路徑都檢查一遍的測試。即使是一個中等規模的程序,其執行路徑的排列數也十分龐大,由于受時間、人力和資源的限制,在測試過程中不可能執行每個可能的路徑。因此,測試只能證明程序中有錯誤,不能證明程序中沒有錯誤。但是,精心地測試方案,有可能充分覆蓋程序邏輯并使程序達到所要求的可靠性。(5)為了達到最佳的測試效果,應該由獨立的第三方從事測試工作。所謂“最佳效果”是指有最大可能性發現錯誤的測試。
四、以白盒測試技術為例的測試步驟
除非是測試一個小程序,否則一開始就把整個系統作為一個單獨的實體來測試是不現實的。測試過程也必須分步驟進行,后一個步驟在邏輯上是前一個步驟的繼續。大型軟件系統通常由若干個子系統組成,每個子系統又由許多模塊組成。因此,本系統設計的測試過程有下述幾個步驟組成:模塊測試;子系統測試;系統測試;驗收測試;平行運行。測試任何產品都有兩種方法:如果已經知道了產品應該具有的功能,可以通過測試檢驗是否每個功能都能正常使用;如果知道產品的內部過程,可以通過測試來檢驗產品內部動作是否按照規格說明書正常進行。前一種稱為黑盒測試,后一種方法稱為白盒測試。本系統重點研究后種技術。
白盒測試的前提是可以把程序看成裝在一個透明的白盒子里,測試者完全知道程序的結構和處理算法。這種方法按照程序內部的邏輯測試程序,檢測程序中的主要執行通路是否能按照預定要求正確工作。白盒測試又稱結構測試。下例說明本系統模塊所應用兩種常用白盒測試技術。
(一)邏輯覆蓋測試技術
有選擇地執行程序中某些最有代表性的通路是對窮盡測試的唯一可行的替代辦法。所謂邏輯覆蓋是對一系列測試過程的總稱,這組測試過程逐漸進行越來越完整的通路測試。例如本系統中某模塊在測試中所應用的幾種覆蓋技術。
1.語句覆蓋。為了暴露程序中的錯誤,至少每個語句執行一次。語句覆蓋的含義是,選擇足夠多的測試數據,使被測程序中每個語句至少執行一次。如1圖所示的程序流程圖描繪了一個被測模塊的處理算法。為了使每個語句都執行一次,程序的執行路徑應該是sabced,為此只需要輸入下面的測試數據(實際上X可以是任意實數)。
本系統某模塊測試流程圖如圖1所示。
A=2,B=0,X=4
2.判定覆蓋。判定覆蓋又叫分支覆蓋,它的含義是,不僅每個語句必須至少執行一次,而且每個判定的每種可能的結果都應該至少執行一次,也就是每個判定的分支都至少執行一次。對于模塊來說,能夠分別覆蓋路徑sacbd和sabd的兩組測試數據,或者可以分別覆蓋路徑sacbd和sabed 的兩組測試數據,都滿足判定覆蓋標準。例如,用下面兩組測試數據就可以做到判定覆蓋:
A=3,B=0,X=3 (覆蓋sacbd)
A=2,B=1,X=1 (覆蓋sabed)
(二)控制結構測試技術
循環測試專注于測試循環結構的有效性。在本系統的程序設計中應用了3種循環,即簡單循環、串接循環、和嵌套循環。下面分別針對這3種循環的測試方法。
1.簡單循環。應該使用下例測試集來測試簡單循環,其中n是允許通過循環的最大次數。
跳過循環。
只通過循環1次。
通過循環2次。
通過循環m次,其中m 通過循環n-1次。 2.嵌套循環。如果把簡單循環的測試方法直接應用到嵌套循環,可能的測試數就會隨嵌套層數的增加按幾何級數增長,這會導致不切實際的測試數目。B.Beizer提出了一種能減少測試數的方法: ●從最內層循環開始測試,把所有其他循環都設置最小值。 ●對最內層循環使用簡單測試方法,而使外層循環的迭代參數(例如,循環計數器)取最小值,并為越界值或非法值增加一些額外的測試。 ●由內向外,對下一個循環進行測試,但保持所有其他外層循環為最小值,其他嵌套循環為“典型”值。 ●繼續進行下去,直到測試完成所有循環。 3.串接循環。如果串接循環的各個循環都彼此獨立,則可以使用前述的測試簡單循環的方法來測試串接循環。但是,如果兩個循環串接,而且第一個循環的循環計數器值是第二個循環的初始值,則這兩個循環并不是獨立的。當循環不成立時,建議使用測試嵌套循環的方法來測試串接循環。 參考文獻: [1] 伍利.ATE軟件測試方法研究及實現[D].成都:電子科技大學,2004. [2] 張永梅,陳立潮,馬禮,郭韶升.軟件測試技術研究[J].測試技術學報,2002,(2). [3] 薛賽男,趙偉.軟件測試技術——計量測試技術的新領域[J].計量技術,2003,(5). [4] 徐巍,譚德榮,文昌俊.測控系統軟件質量模型及評價[J].計算機測量與控制,2005,(8).