「所謂專家,就是一個小錯不犯、卻一路衝向滔天大謬的人。」——作家史托伯格(Benjamin Stolberg)
把測試做壞的方式或許有無限多種,但有幾種特別致命的「思考方式」足以毀掉任何測試專案。本章透過一個情境劇——專案經理康恩(Kahn)、新任測試經理蘿絲(Rose)、開發者貝瑞(Barry)與測試人員蘇西(Suzy)之間的對話——逐一拆解這些謬誤。
究責謬誤(The Blaming Fallacy)#
康恩一整天被老闆與業務輪番數落,心情惡劣,於是把矛頭指向第一個脆弱的對象——剛到職六週的蘿絲。
究責謬誤的信念是:只要指責、用責備的語氣與音量,問題就會更快解決。事實通常正好相反——一個人花越多時間心力找別人來怪罪,解決問題的機會就越小。
蘿絲沒有反過來怪別人,而是冷靜回問:「我的部門能在這件事上幫上什麼忙?」
窮舉測試謬誤(The Exhaustive Testing Fallacy)#
康恩咆哮:「這客戶出問題,就是因為你的部門沒做窮舉測試!」蘿絲反問「你說的『窮舉』是什麼意思?」康恩答不上來,只說「就是該測所有東西卻沒測」。
蘿絲心知「測試所有東西」永不可能(見前章)。康恩不只不懂測試,甚至「不懂到不知道自己不懂」。蘿絲忍住沒說的玩笑是:唯一真正的「窮舉測試」,是測試人員累到(exhausted)做不下去的時候。
測試產生品質謬誤(The Testing-Produces-Quality Fallacy)#
康恩抱怨丟了 MegaCorp 的大單,因為對方評估時在「跨國模擬」功能找到一堆 bug。蘿絲一針見血:「你是說,像我們第一週測試時就回報、你卻叫我們停手的那些 bug 嗎?」當時康恩說「沒客戶需要那功能」,要她專注重要的事。
康恩一面阻止蘿絲做測試以外的任何事、又只准她測他認為該測的東西,卻反過來氣她沒「修好」問題。這就是測試產生品質謬誤——以為測試本身就能造出品質。蘿絲決定慢慢根除康恩根深柢固的謬誤,而非當場硬碰。
分解謬誤(The Decomposition Fallacy)#
貝瑞對蘇西吼:「測各個模組,模組組成系統,你就等於測了整個系統。測了零件就等於測了整體!」
這是分解謬誤——以為整體只是各部分之和。蘿絲糾正:「測模組只給我們關於模組的資訊,而非它們如何協同運作。」
組合謬誤(The Composition Fallacy)#
蘇西反擊:「測系統就會自動測到各個零件。」
這是組合謬誤——以為測了整個系統,組成它的零件就都被測過了。蘿絲解釋:系統測試會「碰到」每個模組,但「碰到」不等於觸及模組的所有部分。就像「只碰了系統介面,你會說你測過它了嗎?」
一切測試都一樣謬誤(The All-Testing-Is-Testing Fallacy)#
貝瑞堅稱他和蘇西的測試「沒那麼不同」。蘿絲在白板上寫下三個詞來釐清:
- 需求(REQUIREMENTS)
- 意圖(INTENT)
- 實作(IMPLEMENTATION)
她的論證是:
- 貝瑞假設「他的意圖 = 需求」,但我們無從確知——我們不知道此刻對需求的理解,是否等同貝瑞上週寫程式時對需求的理解
- 唯一能查證的方式,是「對照實作」來測試
- 蘇西比對的是「實作 vs. 需求」;貝瑞該比對的是「意圖 vs. 實作」
- 同時做這兩種測試,才能知道三者是否一致;若不一致,就能設法處理落差
與此密切相關的是「一切都同樣容易測謬誤(The Everything-Is-Equally-Easy-to-Test Fallacy)」——它讓人對測試時間做出過度樂觀的錯誤估計,並讓人感到無助,誤以為程式設計師無法為「更容易找到 bug」做任何事。
任何白痴都會測謬誤(The Any-Idiot-Can-Test Fallacy)#
貝瑞嗆道:「實際測試很簡單,不過就是敲敲鍵盤,任何白痴都會。」蘿絲不動聲色地要來他那疊測試清單,憑六週經驗雖不足以設計出最好的測試,卻足以在爛測試套件裡找出破綻——而且果然找到了。
貝瑞即將學到:好的測試永遠是探索性的(exploratory),後續測試強烈受先前測試結果影響。過程是調查式的,所以貝瑞那張預先列好的測試清單不會領先蘇西太久。他最好把「測試背後的動機」交給蘇西,讓她依產品與測試的最新資訊去充實實際的測試。
小結#
學會辨認這少數幾個關於測試的重大謬誤,就能消除專案經理一半的嚴重錯誤。
常見錯誤#
以下是落入測試謬誤時最常見的失誤。
- 相信究責長期有效:你或許看到短期效果,但那比較像用棍子戳狗,而非真的有益
- 相信你對問題的第一印象總是正確:第一印象重要,但測試問題通常需要更多分析——尤其當你發現自己又在指責別人時
- 相信你能「窮舉」測試任何東西:要求窮舉測試,你通常只會得到用各種方式作弊、躲避主管、最終反抗的測試人員
- 以為可以「又快又髒」地開發、事後再把品質測進去:又快又髒就是髒,而且還很難測
- 以為系統測試會抓到所有 bug,於是跳過單元測試:系統測試不僅抓不到所有 bug,還更耗時更花錢——超過你省下的
- 以為單元測試會抓到所有 bug,於是跳過系統測試:你會只因「組裝前每個零件都測過了」的保證,就搭一架飛機的處女航嗎?
- 期待測試產生品質:品質是「整個開發流程」的產物。爛測試會導致爛品質,但除非流程其他環節都到位且正確執行,否則好測試也不會帶來好品質