軟件測試中的心理學
作者:網絡轉載 發布時間:[ 2012/5/17 9:10:09 ] 推薦標簽:
軟件測試是一項技術性工作,但同時也涉及經濟學和人類心理學的一些重要因素。
在理想情況下,我們會測試程序的所有可能執行情況,而在大多數情況下,這幾乎是不可能的。即使一個看起來非常簡單的程序,其可能的輸入與輸出組合可達到數百種甚至數千種,對所有的可能情況都設計測試用例是不切合實際的。對一個復雜的應用程序進行完全的測試,將耗費大量的時間和人力資源,這樣在經濟上是不可行的。
另外,要成功地測試一個軟件應用程序,測試人員也需要有正確的態度(也許用“愿景”(vision)這個詞會更好一些)。在某些情況下,測試人員的態度可能比實際的測試過程本身還要重要。因此,在深入探討軟件測試的本質之前(指技術層面),我們先探討一下軟件測試的心理學問題。
測試執行得差,其中一個主要原因在于大多數的程序員一開始把“測試”這個術語的定義搞錯了。
他們可能會認為:
“軟件測試是證明軟件不存在錯誤的過程。”
“軟件測試的目的在于證明軟件能夠正確完成其預定的功能。”
“軟件測試是建立一個‘軟件做了其應該做的’信心的過程。”
這些定義都是本末倒置的。
每當測試一個程序時,應當想到要為程序增加一些價值。通過測試來增加程序的價值,是指測試提高了程序的可靠性或質量。提高了程序的可靠性,是指找出并終修改了程序的錯誤。
因此,不要只是為了證明程序能夠正確運行而去測試程序;相反,應該一開始假設程序中隱藏著錯誤(這種假設對于幾乎所有的程序都成立),然后測試程序,發現盡可能多的錯誤。
那么,對于測試,更為合適的定義應該是:“測試是為發現錯誤而執行程序的過程”。
雖然這看起來像是個微妙的文字游戲,但確實有重要的區別。理解軟件測試的真正定義,會對成功地進行軟件測試有很大的影響。
人類行為總是傾向于具有高度目標性,確立一個正確的目標有著重要的心理學影響。如果我們的目的是證明程序中不存在錯誤,那會在潛意識中傾向于實現這個目標;也是說,我們會傾向于選擇可能較少導致程序失效的測試數據。另一方面,如果我們的目標在于證明程序中存在錯誤,我們設計的測試數據有可能更多地發現問題。與前一種方法相比,后一種方法會更多地增加程序的價值。
這種對軟件測試的定義,包含著無窮的內蘊,其中的很多都蘊涵在本書各處。舉例來說,它暗示了軟件測試是一個破壞性的過程,甚至是一個“施虐”的過程,這說明為什么大多數人都覺得它困難。這種定義可能是違反我們愿望的;所幸的是,我們大多數人總是對生活充滿建設性而不是破壞性的愿景。大多數人都本能地傾向于創造事物,而不是將事物破壞。這個定義還暗示了對于一個特定的程序,應該如何設計測試用例(測試數據)、哪些人應該而哪些人又不應該執行測試。
為增進對軟件測試正確定義的理解,另一條途徑是分析一下對“成功的”和“不成功的”這兩個詞的使用。當項目經理在歸納測試用例的結果時,尤其會用到這兩個詞。大多數的項目經理將沒發現錯誤的測試用例稱為一次“成功的測試”,而將發現了某個新錯誤的測試稱為“不成功的測試”。
這又是一次本末倒置。“不成功的”表示事情不遂人意或令人失望。我們認為,如果在測試某段程序時發現了錯誤,而且這些錯誤是可以修復的,將這次合理設計并得到有效執行的測試稱做是“成功的”。如果本次測試可以終確定再無其他可查出的錯誤,同樣也被稱做是“成功的”。所謂“不成功的”測試,僅指未能適當地對程序進行檢查,在大多數情況下,未能找出錯誤的測試被認為是“不成功的”,這是因為認為軟件中不包含錯誤的觀點基本上是不切實際的。
能發現新錯誤的測試用例不太可能被認為是“不成功的”,也是說,能發現錯誤證明它是值得設計的。“不成功的”測試用例,會看到程序輸出正確的結果而沒發現任何錯誤。
我們可以類比一下病人看醫生的情況,病人因為身體不舒服而去看醫生。如果醫生對病人進行了一些檢查和化驗,卻沒有診斷出任何病因,我們不會認為這些檢查和化驗是“成功的”,因為病人支付了昂貴的檢查和化驗費用,而病狀卻依然如故。病人會因此而質疑醫生的診斷能力。但是,如果醫生診斷出病人是胃潰瘍,那么這次檢測是“成功的”,醫生可以開始進行相應的治療。因此,醫療行業會使用“成功的”或“不成功的”來表達診斷結果。我們當然可以類推到軟件測試中來,當我們開始測試某個程序時,它好似我們的病人。
“軟件測試是證明軟件不存在錯誤的過程”,這個定義會帶來第二個問題。對于幾乎所有的程序而言,甚至是非常小的程序,這個目標實際上也是無法達到的。
另外,心理學研究表明,當人們開始一項工作時,如果已經知道它是不可行的或無法實現時,人的表現會相當糟糕。舉例來說,如果要求人們在15分鐘之內完成星期日《紐約時報》里的縱橫填字游戲,那么我們會觀察到10分鐘之后的進展非常小,因為大多數人都會卻步于這個現實,即這個任務似乎是不可能完成的。但是如果要求在四個小時之內完成填字游戲,我們很可能有理由期望在初10分鐘之內的進展會比前一種情況下的大。將軟件測試定義為發現程序錯誤的過程,使得測試是個可以完成的任務,從而克服了這個心理障礙。
諸如“軟件測試是證明‘軟件做了其應該做的’的過程”此類的定義所帶來的第三個問題是,程序即使能夠完成預定的功能,也仍然可能隱藏錯誤。也是說,當程序沒有實現預期功能時,錯誤是清晰地顯現出來的;如果程序做了其不應該做的,這同樣是一個錯誤。如果我們將軟件測試視作發現錯誤的過程,而不是將其視為證明“軟件做了其應該做的”的過程,我們發現后一類錯誤的可能性會大很多。
總結一下,軟件測試更適宜被視為試圖發現程序中錯誤(假設其存在)的破壞性的過程。一個成功的測試用例,通過誘發程序發生錯誤,可以在這個方向上促進軟件質量的改進。當然,終我們還是要通過軟件測試來建立某種程度的信心:軟件做了其應該做的,未做其不應該做的。但是通過對錯誤的不斷研究是實現這個目的的佳途徑。
有人可能會聲稱“本人的程序完美無缺”(不存在錯誤),針對這種情況建立起信心的好辦法是盡量反駁他,即努力發現不完美之處,而不只是確認程序在某些輸入情況下能夠正確地工作。
相關推薦

最新發布
性能測試之測試環境搭建的方法
2020/7/21 15:39:32軟件測試是從什么時候開始被企業所重視的呢?
2020/7/17 9:09:11Android自動化測試框架有哪些?有什么用途?
2020/7/17 9:03:50什么樣的項目適合做自動化?自動化測試人員應具備怎樣的能力?
2020/7/17 8:57:06幾大市面主流性能測試工具測評
2020/7/17 8:52:11RPA機器人能夠快速響應企業需求,是怎么做到的?
2020/7/17 8:48:05Bug可以真正消滅嗎?為什么?
2020/7/17 8:43:03軟件測試基本概念是怎么來的?軟件測試生命周期的形成歷經了什么?
2020/7/16 9:11:10