軟件質量概述
信息技術的飛速發展,使軟件產品應用到社會的各個領域,軟件產品的質量自然成為人們共同關注的焦點。不論軟件的生產者還是軟件的使用者,均生存在競爭的環境中,軟件開發商為了占有市場,必須把軟件質量作為企業的重要目標之一,以免在激烈的競爭中被淘汰出局。用戶為了保證自己業務的順利完成,當然希望選用優質的軟件。質量不佳的軟件產品不僅會使開發商的維護費用和用戶的使用成本大幅增加,還可能產生其他的責任風險。在一些關鍵應用 (如民航訂票系統、銀行結算系統、證券交易系統等)中使用質量有問題的軟件,還可能造成災難性的后果。
軟件質量是指與軟件產品滿足規定的和隱含的需求的能力有關的特征和特性的全體。通常來說,軟件質量應該包含六方面的特性:
(1)功能性:軟件所實現的功能達到它的設計規范和滿足用戶需求的程度;
(2)可靠性:在規定的時間和條件下,軟件所能維持其性能水平的程度;
(3)易使用性:對于一個軟件,用戶學習、操作、準備輸入和理解輸出所作努力的程度;
(4)效率:在指定條件下,用軟件實現某種功能所需的計算機資源(包括時間)的有效程度;
(5)可維護性:在一個運行軟件中,當環境改變或軟件發生錯誤時,進行相應修改所做努力的程度;
(6)可移植性:軟件從一個計算機系統或環境移植到另一個系統或環境的容易程度。
軟件質量是一個軟件企業成功的必要條件,其重要性無論怎樣強調都不過分。軟件質量與傳統意義上的質量概念并無本質差別,只是針對軟件的某些特性進行了調整。
軟件測試的意義
軟件危機曾經是軟件界甚至整個計算機界最熱門的話題。為了解決這場危機,軟件從業人員、專家和學者做出了大量的努力?,F在人們已經逐步認識到所謂的軟件危機實際上僅是一種狀況,那就是軟件中有錯誤,正是這些錯誤導致了軟件開發在成本、進度和質量上的失控。有錯是軟件的屬性,而且是無法改變的,因為軟件是由人來完成的,所有由人做的工作都不會是完美無缺的。問題在于我們如何去避免錯誤的產生和消除已經產生的錯誤,使程序中的錯誤密度達到盡可能低的程度。
1.軟件測試的概念
軟件測試的定義有許多種,其中比較權威的是IEEE在1983年提出的:“使用人工或自動手段來運行或測定某個系統的過程,其目的在于檢驗它是否滿足規定的需求或是弄清預期結果與實際結果之間的差別?!?/P>
2.軟件測試的重要性
軟件測試在軟件生命周期中占據重要的地位,在傳統的瀑布模型中,軟件測試學僅處于運行維護階段之前,是軟件產品交付用戶使用之前保證軟件質量的重要手段。近來,軟件工程界趨向于一種新的觀點,即認為軟件生命周期每一階段中都應包含測試,從而檢驗本階段的成果是否接近預期的目標,盡可能早的發現錯誤并加以修正,如果不在早期階段進行測試,錯誤的延時擴散常常會導致最后成品測試的巨大困難。
事實上,對于軟件來講,不論采用什么技術和什么方法,軟件中仍然會有錯。采用新的語言、先進的開發方式、完善的開發過程,可以減少錯誤的引入,但是不可能完全杜絕軟件中的錯誤,這些引入的錯誤需要測試來找出,軟件中的錯誤密度也需要測試來進行估計。測試是所有工程學科的基本組成單元,是軟件開發的重要部分。自有程序設計的那天起測試就一直伴隨著。統計表明,在典型的軟件開發項目中,軟件測試工作量往往占軟件開發總工作量的40%以上。而在軟件開發的總成本中,用在測試上的開銷要占30%到50%。如果把維護階段也考慮在內,討論整個軟件生存期時,測試的成本比例也許會有所降低,但實際上維護工作相當于二次開發,乃至多次開發,其中必定還包含有許多測試工作。
在實踐中,軟件測試的困難常常使人望而卻步或敷衍了事,這是由于對測試仍然存在一些不正確的看法和錯誤的態度,這包括:
(1)認為測試工作不如設計和編碼那樣容易取得進展難以給測試人員某種成就感;
(2)以發現軟件錯誤為目標的測試是非建設性的,甚至是破壞性的,測試中發現錯位是對責任者工作的一種否定;
(3)測試工作枯燥無味,不能引起人們的興趣;
(4)測試工作是艱苦而細致的工作;
(5)對自己編寫的程序盲目自信,在發現錯誤后,顧慮別人對自己的開發能力的看法。
這些觀點對軟件測試工作是極為不利的,必須澄清認識、端正態度,才可能提高軟件產品的質量。
3.軟件測試的目的
如果測試的目的是為了盡可能多地找出錯誤,那么測試就應該直接針對軟件比較復雜的部分或是以前出錯比較多的位置。如果測試目的是為了給最終用戶提供具有一定可信度的質量評價,那么測試就應該直接針對在實際應用中會經常用到的商業假設。
在談到軟件測試時,許多人都引用Grenford J. Myers在《The Art of Software Testing》一書中的觀點:
(1)軟件測試是為了發現錯誤而執行程序的過程;
(2)測試是為了證明程序有錯,而不是證明程序無錯誤;
(3)一個好的測試用例是在于它能發現至今未發現的錯誤;
(4)一個成功的測試是發現了至今未發現的錯誤的測試。
這種觀點可以提醒人們測試要以查找錯誤為中心,而不是為了演示軟件的正確功能。但是僅憑字面意思理解這一觀點可能會產生誤導,認為發現錯誤是軟件測試的唯一目,查找不出錯誤的測試就是沒有價值的,事實并非如此。
首先,測試并不僅僅是為了要找出錯誤。通過分析錯誤產生的原因和錯誤的分布特征,可以幫助項目管理者發現當前所采用的軟件過程的缺陷,以便改進。同時,這種分析也能幫助我們設計出有針對性地檢測方法,改善測試的有效性。其次,沒有發現錯誤的測試也是有價值的,完整的測試是評定測試質量的一種方法。
軟件測試的組織與管理
隨著軟件開發規模的增大、復雜程度的增加,以尋找軟件中的錯誤為目的的測試工作就顯得更加困難。然而,為了盡可能多地找出程序中的錯誤,生產出高質量的軟件產品,加強對測試工作的組織和管理就顯得尤為重要。
從軟件的生存周期看,測試往往指對程序的測試,這樣做的優點是被測對像明確,測試的可操作性相對較強。但是,由于測試的依據是規格說明書、設計文檔和使用說明書,如果設計有錯誤,測試的質量就難以保證。即使測試后發現是設計的錯誤,這時,修改的代價是相當昂貴的。因此,較理想的做法應該是對軟件的開發過程,按軟件工程各階段形成的結果,分別進行嚴格的審查。
1.測試的過程及組織
當設計工作完成以后,就應該著手測試的準備工作了,一般來講,由一位對整個系統設計熟悉的設計人員編寫測試大綱,明確測試的內容和測試通過的準則,設計完整合理的測試用例,以便系統實現后進行全面測試。
在實現組將所開發的程序經驗證后,提交測試組,由測試負責人組織測試,測試一般可按下列方式組織:
(1)首先,測試人員要仔細閱讀有關資料,包括規格說明、設計文檔、使用說明書及在設計過程中形成的測試大綱、測試內容及測試的通過準則,全面熟悉系統,編寫測試計劃,設計測試用例,作好測試前的準備工作。
(2)為了保證測試的質量,將測試過程分成幾個階段,即:代碼審查、單元測試、集成測試、確認測試和系統測試。
(3)代碼會審
代碼會審是由一組人通過閱讀、討論和爭議對程序進行靜態分析的過程。會審小組在充分閱讀待審程序文本、控制流程圖及有關要求、規范等文件基礎上,召開代碼會審會,程序員逐句講解程序的邏輯,并展開熱烈的討論甚至爭議,以揭示錯誤的關鍵所在。實踐表明,程序員在講解過程中能發現許多自己原來沒有發現的錯誤,而討論和爭議則進一步促使了問題的暴露。
(4)單元測試
單元測試集中在檢查軟件設計的最小單位—模塊上,通過測試發現實現該模塊的實際功能與定義該模塊的功能說明不符合的情況,以及編碼的錯誤。
(5)集成測試
集成測試是將模塊按照設計要求組裝起來同時進行測試,主要目標是發現與接口有關的問題。如數據穿過接口時可能丟失;一個模塊與另一個模塊可能有由于疏忽的問題而造成有害影響;把子功能組合起來可能不產生預期的主功能;個別看起來是可以接受的誤差可能積累到不能接受的程度;全程數據結構可能有錯誤等。
(6)確認測試
確認測試的目的是向未來的用戶表明系統能夠像預定要求那樣工作。經集成測試后,已經按照設計把所有的模塊組裝成一個完整的軟件系統,接口錯誤也已經基本排除了,接著就應該進一步驗證軟件的有效性,這就是確認測試的任務,即軟件的功能和性能如同用戶所合理期待的那樣。
(7)系統測試
軟件開發完成以后,最終還要與系統中其他部分配套運行,進行系統測試。包括恢復測試、安全測試、強度測試和性能測試等。
經過上述的測試過程對軟件進行測試后,軟件基本滿足開發的要求,測試宣告結束,經驗收后,將軟件提交用戶。
2.測試的人員組織
為了保證軟件的開發質量,軟件測試應貫穿于軟件定義與開發的整個過程。因此,對分析、設計和實現等各階段所得到的結果,包括需求規格說明、設計規格說明及源程序都應進行軟件測試?;诖?,測試人員的組織也應是分階段的。
(1)軟件的設計和實現都是基于需求分析規格說明進行的。
需求分析規格說明是否完整、正確、清晰是軟件開發成敗的關鍵。為了保證需求定義的質量,應對其進行嚴格的審查。
(2)設計評審
軟件設計是將軟件需求轉換成軟件表示的過程。主要描繪出系統結構、詳細的處理過程和數據庫模式。按照需求的規格說明對系統結構的合理性、處理過程的正確性進行評價,同時利用關系數據庫的規范化理論對數據庫模式進行審查。
(3)程序的測試
是指軟件測試。是整個軟件開發過程中交付用戶使用前的最后階段,是軟件質量保證的關鍵。軟件測試在軟件生存周期中橫跨兩個階段:通常在編寫出每一個模塊之后,就對它進行必要的測試(稱為單元測試)。編碼與單元測試屬于軟件生存周期中的同一階段。該階段的測試工作,由編程組內部人員進行交叉測試(避免編程人員測試自己的程序)。這一階段結束后,進入軟件生存周期的測試階段,對軟件系統進行各種綜合的測試。測試工作由專門的測試組完成,負責整個測試的計劃、組織工作。測試組的其他成員由具有一定的分析、設計和編程經驗的專業人員組成,人數根據具體情況可多可少,一般3~5人為宜。
3.軟件測試文件
軟件測試文件描述要執行的軟件測試及測試的結果。由于軟件測試是一個很復雜的過程,同時也是設計軟件開發其他一些階段的工作,對于保證軟件的質量和它的運行有著重要意義,必須把對它們的要求、過程及測試結果以正式的文件形式寫出。測試文件的編寫是測試工作規范化的一個組成部分。
測試文件不只在測試階段才考慮,它在軟件開發的需求分析階段就開始著手,因為測試文件與用戶有著密切的關系。在設計階段的一些設計方案也應在測試文件中得到反映,以利于設計的檢驗。測試文件對于測試階段工作的指導與評價作用更是非常明顯的。需要特別指出的是,在已開發的軟件投入運行的維護階段,常常還要進行再測試或回歸測試,這時仍須用到測試文件。
(1)測試文件的類型
根據測試文件所起的作用不同,通常把測試文件分成兩類,即測試計劃和測試分析報告。測試計劃詳細規定測試的要求,包括測試的目的和內容、方法和步驟,以及測試的準則等。由于要測試的內容可能涉及到軟件的需求和軟件的設計,因此必須及早開始測試計劃的編寫工作。不應在著手測試時,才開始考慮測試計劃。通常,測試計劃的編寫從需求分析階段開始,到軟件設計階段結束時完成。測試報告用來對測試結果的分析說明,經過測試后,證實了軟件具有的能力,以及它的缺陷和限制,并給出評價的結論性意見,這些意見即是對軟件質量的評價,又是決定該軟件能否交付用戶使用的依據。由于要反映測試工作的情況,自然要在測試階段內編寫。
(2)測試文件的使用
測試文件的重要性表現在以下幾個方面:
a.驗證需求的正確性:測試文件中規定了用以驗證軟件需求的測試條件,研究這些測試條件對弄清用戶需求的意圖是十分有益的;
b.檢驗測試資源:測試計劃不僅要用文件的形式把測試過程規定下來,還應說明測試工作必不可少的資源,進而檢驗這些資源是否可以得到,即它的可用性如何。如果某個測試計劃已經編寫出來,但所需資源仍未落實,那就必須及早解決;
c.明確任務的風險:有了測試計劃,就可以弄清楚測試可以做什么,不能做什么。了解測試任務的風險有助于對潛伏的可能出現的問題事先作好思想上和物質上的準備;
d.生成測試用例:測試用例的好壞決定著測試工作的效率,選擇合適的測試用例是作好測試工作的關鍵。在測試文件編制過程中,按規定的要求精心設計測試用例有重要的意義;
e.評價測試結果:測試文件包括測試用例,即若干測試數據及對應的預期測試結果。完成測試后,將測試結果與預期的結果進行比較,便可對已進行的測試提出評價意見;
f.再測試:測試文件規定的和說明的內容對維護階段由于各種原因的需求進行再測試時,是非常有用的;
g.決定測試的有效性:完成測試后,把測試結果寫入文件,這對分析測試的有效性,甚至整個軟件的可用性提供了依據。同時還可以證實有關方面的結論。
(3)測試文件的編制
在軟件的需求分析階段,就開始測試文件的編制工作,各種測試文件的編寫應按一定的格式進行。