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