測試不是挑毛病
然而,對測試領域先行者Glenford Myers先生“測試的目的是證偽”這一概念理解也不能過于片面。在很多軟件工程學、軟件測試方面的書籍中都提到一個概念:“測試的目的是尋找錯誤,并且是盡最大可能找出最多的錯誤”。這很容易讓人們認為測試人員就是“挑毛病”的,而由此帶來諸多問題。
我們可以假想在一個軟件開發公司內,軟件測試人員專注于“挑毛病”,開發人員和公司管理層每天會得到這樣“簡潔”的測試報告:“在今天的測試過程中,系統出現10次宕機現象”。
從“挑毛病”的角度看,測試人員已經很好的完成了自己的工作,但其工作成果對開發人員和公司管理層幾乎沒有任何幫助。開發人員面對這樣的測試報告是無法對軟件進行任何修改的;而公司管理層也會疑惑軟件質量到底如何,系統能否如期發布。
長此以往,必然會造成開發人員和測試人員之間無法調和的矛盾;而公司管理層也會認為,測試團隊只是“帶來壞消息的人”,對公司產品沒有提供任何幫助,不如取消為好。
這樣的例子看似比較極端,業內普遍認為類似的問題僅出現在一個初創測試團隊的公司內,但實際的情況遠沒有這樣樂觀,這類現象甚至還蔓延到近年來蓬勃興起的部分第三方測試機構之中。
一個軟件開發公司的管理者,拿到一份剛由某第三方測試機構完成的測試報告,報告結論是該公司開發的軟件無法完成預定的需求,在500個用戶并發交易的情況下會發生大量交易失敗。應該說這樣的報告確實挑出了軟件的“毛病”,但報告中并未提及造成交易失敗的原因,是硬件資源不足、支撐軟件參數設置錯誤還是應用開發問題。這樣的報告會使得委托測試單位置疑自己投資進行第三方測試的是否有實際幫助。
造成這些問題的原因歸根結底就是對“測試的目的是證偽”這一概念的片面理解。那么,一次成功的測試是如何對問題進行闡述的呢?質量工程學中軟件失效的機理給出了很好的答案。
軟件錯誤是人為錯誤
質量工程學中對于軟件失效是這樣分析的:由于軟件內部邏輯復雜,運行環境動態變化,且不同的軟件差異可能很大,因而軟件失效機理可能有不同的表現形式。
譬如有的失效過程比較簡單,易于追蹤分析,而有的失效過程可能非常復雜,難于甚至不可能加以詳盡描述和分析,尤其是運行于高度復雜實時環境中的大型軟件。
但總的說來,軟件失效機理可描述為:軟件錯誤,軟件缺陷,軟件故障,軟件失效。
軟件錯誤 軟件錯誤是指在軟件生存期內的不希望或不可接受的人為錯誤,其結果是導致軟件缺陷的產生??梢娷浖e誤是一種人為過程,相對于軟件本身,是一種外部行為。
軟件缺陷 軟件缺陷是存在于軟件(文檔、數據、程序)之中的那些不希望或不可接受的偏差,如少一逗點、多一語句等。其結果是軟件運行于某一特定條件時出現軟件故障,這時稱軟件缺陷被激活。
軟件故障 軟件故障是指軟件運行過程中出現的一種不希望或不可接受的內部狀態。譬如軟件處于執行一個多余循環過程時,我們說軟件出現故障。此時若無適當措施(容錯)加以及時處理,便產生軟件失效。顯然,軟件故障是一種動態行為。
軟件失效 軟件失效是指軟件運行時產生的一種不希望或不可接受的外部行為結果。
因此,軟件錯誤是一種人為錯誤。
逆流而上解決問題
我們了解了軟件失效的機理后,就可以逆流而上,沿著軟件失效,軟件故障,軟件缺陷,軟件錯誤的方向對問題進行闡述和分析。
首先,測試人員會說明軟件出現了問題,在此對軟件失效現象進行了描述;
其次,測試人員會詳細闡明是在哪個測試用例的作用下(包括輸入數值、處理過程和預期輸出結果),軟件產生了何種異常輸出,問題的類型、嚴重程度、修改的緊急程度如何,這樣就明晰了軟件故障的情況;
第三,測試人員會根據測試經驗和實際情況,幫助開發人員進行故障定位,找到軟件缺陷所在;
第四,測試人員在對問題情況進行統計的基礎上,會指出共性問題并分析其產生的原因,發現軟件錯誤。
在這樣對問題進行充分分析的基礎上,對問題提出修改意見,這樣一份問題報告會是一份對開發人員和管理層有意義的報告。
我們可以按照這樣的分析方法,對前面企業內部和第三方的兩個測試失敗的情況進行修正。
軟件失效現象:發生宕機/不能承擔500個用戶的并發交易;軟件故障情況:在使用非法數據輸入的情況下發生宕機/在進行用戶交納月通話費的情況下交易失敗;軟件缺陷:軟件中缺少合法性校驗/服務器CPU占用率達到98%;軟件錯誤:詳細設計環節缺少合法性校驗內容,且文檔評審工作不到位/概要設計環節未進行關鍵技術驗證與仿真;修改建議:增加合法性校驗,加強文檔評審工作/重新選擇服務器(重點是CPU),加強對關鍵技術的驗證與仿真工作。
對于所有問題,都應該對軟件的失效現象和故障情況做清晰的表述。除了嚴重程度會影響外,人員差異也對問題分析的程度有著較大影響。不同的測試人員需要承擔不同的職責。
軟件測試需三方協調
通過上面的分析可以看到,軟件測試的目的決不僅僅是“尋找錯誤”,今天的軟件測試需要在三個方面和開發協調工作。
測試的目的是想以最少的人力、物力和時間找出軟件中潛在的各種錯誤和缺陷,通過修正種錯誤和缺陷提高軟件質量,回避軟件發布后由于潛在的軟件缺陷和錯誤造成的隱患帶來的商業風險。這一工作靠對軟件失效現象記錄、軟件故障表示、軟件缺陷的分析完成。
通過分析錯誤產生的原因還可以幫助發現當前開發工作所采用的軟件過程的缺陷,以便進行軟件過程改進;同時通過對測試結果的分析整理,還可以修正軟件開發規則,并為軟件可靠性分析提供依據。這一工作靠對軟件錯誤的分析完成。
測試是以評價一個程序或者系統屬性為目標的一種活動,測試是對軟件質量的度量與評估,以驗證軟件的質量滿足用戶的需求,為用戶選擇與接受軟件提供有力的依據。這一工作是軟件測試的最終目標,在前兩項工作的基礎上,自然可以很好的完成此部分工作的內容。
在對測試的目的有了更準確認識的基礎上,我們才能夠很好的完成測試工作,在和開發團隊、管理者共同的努力下,更好的提升軟件產品的質量,滿足用戶的需求。