史威夫特(Jonathan Swift)在《格列佛遊記》中描寫拉格多大學院的教授,靠學生轉動框架上的握把隨機打亂字詞,再從中拼湊出「破碎的句子」,妄想藉此編纂出涵蓋一切學問的巨著。本章開頭以此諷喻:把測試當成「隨機動作的堆疊」,正如那位荒謬的教授。

測試的核心是「思考」#

開發者貝瑞(Barry)以為測試只是敲鍵盤。測試經理蘿絲(Rose)拋出一個看似離題的問題反問他:「火星人要怎麼知道某人正在測試?」

她的答案是:因為眾所周知火星人會讀心,而沒有讀心能力的話,光憑觀察行為,沒人能確知某人是否正在測試

測試真正的工作,是先於、並伴隨著肢體動作的「心智活動」。如果你不經思考地敲鍵盤,你不是在測試;如果你在思考卻沒敲鍵盤,你很可能正在測試。

蘿絲對測試的定義是:蒐集系統相關資訊的過程,且意圖讓這些資訊能用於某種目的。

沒有目的地敲鍵盤算測試嗎?#

蘿絲以十五歲表弟伊恩(Ian)為例:他花兩整天記錄新電腦的各種效能(開機時間、收信程式啟動時間、能同時開幾個瀏覽器分頁不當機……),寫進筆記本後就歸檔了。

蘿絲一一追問伊恩動機——是否要建立基準、是否在測試量測流程、是否要驗證業務的說詞以便退款——答案全是「不」。

伊恩只是為了自娛而敲鍵盤,對結果毫不在意。所以即使敲了兩天鍵盤,他很可能並不是在測試。有沒有「意圖把資訊用於某目的」,才是關鍵。

白手套測試(The White Glove Test)#

蘿絲講述她婉拒一份高薪工作的故事:對方主管說全部 150 位測試人員都遵循「測試流程手冊」,且全公司只有一本,收在 CMM 資料庫裡。蘿絲到資料庫,用手帕(她開玩笑說自己不是英國女王,沒有白手套)抹過手冊頂端,沾起厚達四分之一英吋的灰塵。

她沒敲任何鍵,卻完成了一次對「測試組織」的後設測試:灰塵估計出 150 位測試人員有多久沒碰過手冊,而「只有一本」則測出公司對「人們如何使用手冊」的認知。她決定不去那裡上班。

狗糧測試(The Dog Food Test)#

蘿絲主張開發者其實能、也應該以許多方式測試:

  • 寫程式時立刻用眼睛抓到 typo——這也是一種測試
  • 她曾任職的車用煞車/轉向嵌入式軟體公司,規定每位參與開發者都得親自開著裝有該軟體的車、以時速一百英里繞測試跑道

這源於一句俗諺:「在餵你的狗之前,先吃你自己的狗糧。」對軟體開發者而言是絕佳建議——用自己的產品來測試它。它能測出開發者對產品的信心(雖非定論,因為有人天生過度自信、有人過度謙虛),是個很好的起點。

不過貝瑞也敏銳地指出:若「只」做狗糧測試,會犯抽樣錯誤——因為軟體開發者並非典型的文書處理或編譯器使用者

測試人員也需要被測試#

蘿絲讓蘇西重跑同事夏琳(Charlene)已做過的測試,並非為了取得結果,而是因為「夏琳是新人,我在測試夏琳的能力——依我的定義,夏琳也是一個系統」。

這讓蘇西不安,但蘿絲坦言這是測試經理的職責,而且她事先已告知夏琳以維護信任。蘿絲也希望蘇西測試她這位主管——當蘇西說「這份任務讓我不舒服」時,其實正在測試蘿絲會如何回應,並據此(風險)決定未來是否還敢提出尖銳問題。

你可能在無意識中測試#

蘇西嚐了一口湯、覺得太燙就改吃沙拉——蘿絲指出這也是測試,因為她用結果做出了關於風險的決定

展示不是測試#

蘇西昨天被業務藍道夫(Randolph)帶去客戶端,設計一套貝瑞功能的測試展示。她小心避開所有已知 bug 與效能問題,跑了約二十個測試案例。

蘿絲指出這「不是測試」,而是「偽裝成測試的展示(demonstration)」。蘇西並未蒐集任何資訊——她早就確知這二十個案例的結果,藍道夫交付的任務恰恰是「確保不會得到任何資訊」。她或許測試了「客戶的輕信程度」,但那不是測試產品。

小結#

一個動作要稱得上測試,就必須尋求「能影響行動」的資訊——無論它有沒有涉及敲鍵盤。

常見錯誤#

以下是把測試窄化為「敲鍵盤」時最常見的失誤。

  1. 以為電腦能讀心:電腦只做你叫它做的事,無論那是不是你真正想要的
  2. 沒去驗證軟體的銷售說詞:敲鍵盤辦不到這件事,最好基於具體宣稱來擬定計畫
  3. 測試時不使用覆蓋率工具(如白手套測試):你可以建立或安裝工具,告訴你系統哪些部分從未被任何測試碰過
  4. 以為覆蓋率測試就「證明」某物被測過:能顯示每行程式碼都被某測試碰過,不代表它們被「徹底」測過——那需要分析相關性與完整性,也就是「思考」
  5. 混淆流程文件與流程:流程是你「實際做」的事,流程文件是某人「希望你理想上做」的事,兩者鮮少完全吻合
  6. 混淆文件與事實:例如混淆測試腳本與測試、測試報告與測試、需求文件與需求
  7. 沒有「吃自己的狗糧」:若你害怕或鄙視自己的產品,別人為何要買它?
  8. 狗糧測試只用不具代表性的「狗」:除非你開發的是軟體開發工具,否則全由軟體開發者組成的樣本不太可能代表你的使用者群
  9. 不測試你的測試人員,或測試過頭:每個人的工作都需要被評估,但不該沒完沒了;某個程度後,你得信任人們把工作做好
  10. 假裝展示是測試:你可能是發送端或接收端——不確定哪個更糟:騙別人,還是騙自己