人類行為具有高度目標性,確立一個正確的目標有著重要的心理學影響。軟體測試的心理學問題就是如何擺正測試的兩個目標的關係,使得測試活動更加富有成效。
1.程式測試的過程具有破壞性
每當測試一個程式時,人們總希望為程式增加一些價值。利用測試來增加程式的價值,是指通過測試,找出並修改儘可能多的程式缺陷,從而提高程式的可靠性或品質。
因此,不要只是為了證明程式能夠正確運行而去測試程式。相反,應該一開始就假設程式中隱藏著錯誤(這種假設幾乎對所有的程式都成立),然後測試程式,發現儘可能多的錯誤。
事實上,如果把測試目標定位於要證明程式中沒有缺陷,那麼就會在潛意識中傾向於實現這個目標。也就是說,測試人員會傾向於挑選那些使程式失效的可能性較小的測試資料。另一方面,如果把測試目標定位於要證明程式中存在缺陷,那麼就會選擇一些容易發現程式缺陷的測試資料。而後一種態度會比前者給程式增加更多的價值。
因此,大多數測試專業人員都贊同Myers對測試的定義:“測試是為發現錯誤而執行程式的過程。”這個定義意味著程式測試的過程是具有破壞性的,甚至是一個“施虐”過程。開發人員可能不願意這麼做,因為人們總是傾向於建設而不是破壞。這個定義還暗示了對於一個特定的程式,應該如何設計測試案例(測試資料)、哪些人應該而哪些人又不應該執行測試。
事實上,如果在測試某個程式段時發現了可以糾正的缺陷,或者測試最終確定在沒有其他缺陷,則應將這次合理設計並得到有效執行的測試稱作是“成功的”。而所謂“不成功的”測試,僅指未能適當地對程式進行檢查,未能找出程式中潛藏缺陷的測試。因為軟體中不可能沒有缺陷,沒有找出它們,當然測試是“不成功的”。
“軟體測試就是證明軟體不存在錯誤的過程”。對幾乎所有的程式而言,甚至是非常小的程式,這個目標實際上是無法達到的。因為即使程式完全實現預期要求,仍可能包含有缺陷。也就是說,如果程式不按要求工作,它顯然有缺陷,但如果程式做了不要它做的事,它也有缺陷。
心理學研究告訴我們,當人們在幹一件已經知道是不合適的或不可能做到的事時,往往他們的表現就相當糟糕。把程式測試定義為在程式中找出錯誤的過程,就使測試成了可以做到的任務,從而克服了心理上存在的問題。雖然這看起來像是個微妙的文字遊戲,但對成功地進行軟體測試有很大的影響。
總之,軟體測試更適宜被視為試圖發現程式中錯誤(假設其存在)的破壞性的過程。一個成功的測試,通過誘發程式發生錯誤,可以在這個方向上促進軟體品質的改進。當然最終人們還是要通過軟體測試來建立某種程度的信心:軟體做了其應該做的,而沒有做其不應該做的。
2.程式員應避免測試自己的程式
由開發人員來測試自己的代碼是一件很不妥當的事情。開發與測試生來就是不同的活動。開發是創造或者建立某種事物的行為,如一個功能模組或整個系統。而測試的重要目的是證實一個模組或者一個系統工作不正常。這兩個活動之間有著本質的矛盾。一個人不太可能把兩個截然對立的角色都扮演地很好,因此應當限制開發人員在測試中的參與,給他們比較合適的任務是進行最底層的測試——單元測試。
當一個程式員完成了設計與編寫程式的建設性工作後,要一夜之間突然改變他的觀點,設法對程式形成一個完全否定的態度,那是非常困難的。所以,大部分程式員都由於不能使自己進入必要的精神狀態(不是抱著要揭露出自己程式中錯誤的態度),就不能有效測試自己的程式。除了這個心理學問題之外,還有一個重要的問題:程式中可能包含由於程式員對問題的敘述或說明的誤解而產生了錯誤。如果是這種情況,當程式員測試自己的程式時,往往還會帶著同樣的誤解致使問題難以發現。
3.程式設計組織不應測試自己的程式
在宏觀意義上,一個程式設計組織或一個工程項目是個有生命的有機體,它同樣有心理學問題。在大多數情況下,人們都以“在給定日期內,以一定代價完成程式編製任務的能力”來衡配量序設計組織和專案管理人員的。這樣做的理由是時間和成本指標便于衡量,而程式的品質很難度量。要程式設計組織在測試自己的程式時持客觀態度是很困難的,因為如果用正確的定義看待測試,就不大可能按預定計劃完成測試,也不大可能把耗費的代價限制在要求的範圍以內。
軟體生產的三個最重要的因素是:品質、進度和費用。由於費用和進度的限制,要開發一種高品質、快速交付和低成本的軟體產品並不容易。也就是說要同時達到三個目標是困難的。因此在軟體產品的開發中要權衡它們之間的關係,是軟體的特效能滿足使用者的要求,這意味著軟體產品的特性的度量和預計是必要的。
軟體測試由獨立測試機構承擔有很多好處。獨立測試是指軟體測試工作由在經濟上和管理上獨立於開發機構的組織進行。獨立測試可以避免軟體開發人員測試自己開發的軟體,由於心理學上的問題,軟體開發人員難以客觀、有效測試自己的軟體,要找出那些因為對問題的誤解而產生的錯誤就更加困難。獨立測試還可以避免軟體開發機構測試自己的軟體,軟體產品的開發過程受到時間、成本和品質三者的制約,在軟體開發的過程中,當時間、成本和品質三者發生矛盾時,品質最容易被忽視,如果測試組織與開發組織來自相同的機構,測試過程就會面臨來自於開發組織同一來源的管理方面的壓力,使測試過程受到幹擾。
採用獨立測試方式,無論在技術上還是管理上,對提高軟體測試的有效性都具有重要意義。
客觀性——對軟體測試和軟體中的錯誤抱著客觀的態度,這種客觀的態度可以解決測試中的心理學問題,既能以揭露軟體中錯誤的態度工作,也能不受發現的錯誤的影響。經濟上的獨立性使測試有更充分的條件按測試要求去完成。
專業性——獨立測試作為一種專業工作,在長期的工作過程中勢必能夠積累大量實踐經驗,形成自己的專業知識。同時軟體測試也是技術含量很高的工作,需要有專業隊伍加以研究,並進行工程實踐。專業化分工是提高測試水平、保證測試品質、充分發揮測試效應的必然途徑。
權威性——由於專業優勢,獨立測試工作形成的測試結果更具信服力,而測試結果常常和對軟體的品質評價聯絡在一起,專業化的獨立測試機構的評價,更客觀、公正和具有權威性。
資源有保證——獨立測試機構的主要任務是進行獨立測試工作,這使得測試工作在經費、人力和計劃方面更有保證,不會因為開發的壓力減少對測試的投入,降低測試的有效性可以避免開發單位側重軟體開發而對測試工作產生不利的影響。
來源文件 <http://baike.baidu.com/view/16563.htm>