iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0
Software Development

你的自動化測試,大部分是在演戲|AI coding 時代的探索性測試 30 講系列 第 23

Day 23 專案中如何進行 ET (4) - 協作型 – Pair Testing: 有些 Bug 不是測試案例漏掉,而是你一個人根本想不到

  • 分享至 

  • xImage
  •  

測試在現代軟體工程中,協作型探索式測試(Collaborative Exploratory Testing) 不再只是單一測試員的個人行為,而是一種強調團隊動能、集體智慧與即時回饋的技術實踐。它將測試過程定義為一個集學習、趣味、探索與高度投入於一體的思維過程。

為什麼需要「協作型」探索式測試?即便是在具備正規流程(如:明確的計劃、分析與條件設定)的環境下,測試人員在實際工作現場中,往往不一定隨時都有機會獨立實踐完整的探索式測試。

「協作型」測試的核心價值在於打破認知盲點。由於每個人在評估風險、制定策略與操作方法時,難免會受到個人經驗的侷限而遺漏重要細節。透過協作,團隊能借鑒彼此的測試靈感,將零散的經驗轉化為系統化的風險防線,同時在自由且具備樂趣的氛圍中,強化團隊的技術分享與凝聚力。
https://ithelp.ithome.com.tw/upload/images/20260822/20161809JGrmYYEVAH.png

結對測試 (Pair Testing)

結對測試是一種強調集體智慧的協作型測試實踐,其核心在於兩位團隊成員共同操作一台設備,針對特定功能或風險點進行深度探索。在執行過程中,兩人會分工擔任不同角色:一位是負責操作與落實步驟的「執行者」(Driver),另一位則是負責觀察全局、構思策略與記錄發現的「導航者」(Navigator)。這種模式能有效打破個人認知的盲點,當兩位測試人員、或是測試員與開發人員搭配時,能結合不同的技術背景與操作視角,將原本單打獨鬥的驗證過程轉化為即時的對話與靈感激盪,從而挖掘出單人測試難以察覺的邊界缺陷。

在實務本質上,結對測試不僅是提升產品質量的手段,更是團隊內部知識傳遞與經驗分享的最佳場域。它讓參與者能擺脫機械式執行測試案例的束縛,將測試過程定義為一個集學習、趣味、探索與高度投入於一體的思維過程。

結對測試的起源與 極限編程(Extreme Programming, XP) 以及其核心實踐「結對編程」(Pair Programming)有著深厚的血緣關係。隨著軟體工程在 1990 年代末期轉向敏捷化,開發者發現兩個人共用一台電腦編寫程式能顯著提升代碼品質並減少錯誤。測試社群隨後借鑒了這一概念,將其轉化為測試端的協作模式。

這項實踐的發展主要經歷了以下兩個階段的演進:

(1) 從開發延伸到測試:
最初是為了讓測試人員能更緊密地與開發人員協作,透過「一邊寫、一邊測」的動態反饋,縮短 Bug 的修復週期。這種模式打破了傳統測試與開發之間的隔閡,將測試視為一種團隊共有的責任。

(2) 融入探索式測試框架:
隨後,測試專家(如 James Bach 與 Cem Kaner 等人)將其納入探索式測試的實踐中,強調這是一個結合學習、探索與高度投入的思維過程。它不再只是按圖索驥的檢查,而是轉化為一種透過對話來激發靈感、彌補個人認知盲點的智力協作。

到了現代,結對測試已成為敏捷團隊中不可或缺的防禦機制,不僅用於發現缺陷,更被視為團隊內部知識分享與經驗傳承的重要工具。

在結對測試(Pair Testing)的實務中,透過不同職能與經驗背景的人員搭檔,能激發出截然不同的測試深度。以下整理了業界常見的四種搭配方式、優缺點及適用時機:

(1) 測試員 + 測試員
這是最標準的協作方式,讓兩位專業測試人員針對特定任務進行攻防。能夠深入討論測試設計與複雜的邊界案例,藉由不同的測試技術(如一人擅長 API,一人擅長 UI)互補,極大化測試覆蓋率。

但是容易受限於「測試視角」,若兩人對系統底層實作都不了解,可能無法發現架構層面的潛在風險。

這種搭配的適用時機,主要是針對邏輯異常複雜的功能、核心業務流程,或在執行第一、二輪功能測試時,利用「交換測試」來打破個人盲點。
https://ithelp.ithome.com.tw/upload/images/20260822/20161809xuTsZzkqN4.png

(2) 測試員 + 開發人員
這是敏捷開發中最推崇的組合,強調「測試左移」與即時回饋。開發者能提供程式邏輯與實作路徑的深度見解,測試者則帶入使用者觀點;發現 Bug 時能當場定位原因並修復,效率極高。

不過開發人員可能會有「這部分我改過了,一定沒問題」的心理預設,導致測試者受到開發邏輯的誘導。

可以在新功能剛開發完成、進行 Bug Fix 的補強時,或需要快速確認版本可測性的階段來使用。
https://ithelp.ithome.com.tw/upload/images/20260822/20161809GLiOFb3eYc.png

(3) 測試員 + 產品經理
這種組合側重於驗證「軟體是否滿足業務價值」,而非僅僅是技術規範。能最直接地確認實作是否符合產品初衷,PO 也能透過測試過程發現規格定義不夠詳盡之處。可以在需求分析階段的早期驗證、Beta 測試或驗收測試(UAT)前夕使用,確保產品方向無誤。

但是PO 可能不具備測試技術,測試進度會受限於業務端的理解速度,且難以進行深度的技術面測試。
https://ithelp.ithome.com.tw/upload/images/20260822/20161809VyqJDTG8pD.png

(4) 資深測試員 + 資淺測試員
這是一種以「經驗傳承」為核心目的的實踐方式。資淺成員能透過「做中學」快速掌握測試思維與工具操作;資深成員則能透過指導過程重新檢視既有的思維框架。

這樣做可能短期內測試產出的效率會下降,因為大部分時間花在解釋與教學上。因此可以在新進同仁入職訓練、推廣新的測試框架(如從手動轉自動化),或單純需要進行知識分享與團隊凝聚時使用。
https://ithelp.ithome.com.tw/upload/images/20260822/20161809RZkcQZONAT.png

搭配方式總覽表
https://ithelp.ithome.com.tw/upload/images/20260822/20161809aD8a4M3UYA.png

進行 結對測試(Pair Testing) 時,為了確保這場「雙人舞」能跳得既有彈性又不失秩序,實務上通常會遵循一套結構化的流程。這套流程旨在將「人的主動性」與「目標管理」結合,避免測試變成漫無目的的隨機點擊。

以下是結對測試實施的細節步驟:
https://ithelp.ithome.com.tw/upload/images/20260822/20161809Ol50PO76S7.png

一、 準備階段:定義目標與成員組合
在開始之前,必須先確定這場測程(Session)要解決什麼問題。

挑選成員組合:根據目前的測試階段選擇合適的搭檔,例如在開發剛完成時選擇「測試員 + 開發者」,或在功能測試期選擇「雙測試員」以打破盲點。

明確測試任務:設定一個具體的任務範疇,例如「驗證訂單系統的異常支付流程」,而不是籠統地說「測一下訂單功能」。

角色分配:明確誰擔任 執行者(Driver) 操控設備,誰擔任 導航者(Navigator) 思考策略與記錄,並建議在過程中適時交換角色。

二、 執行階段:測程管理與動態探索
這是結對測試的核心,強調在對話中學習與發現。

設定時間箱(Time-boxing):嚴格控管測試時間,建議每個測程落在 45 至 120 分鐘 之間,這是維持專注力與產出品質的最佳區間。

自主設計與學習:執行者不應被動執行既有案例,應按照自己的想法進行測試設計,並在操作中不斷學習系統行為。

即時溝通與求助:若遇到需求規格不明確或流程阻礙,導航者應立即與專案組其他成員(如 PO 或其他開發者)溝通,透過即時的回饋來化解僵局。

靈感啟發:當思路枯竭時,可以借用測試用例的標題作為啟發,或利用功能交互模型來碰撞出新的測試點,而非受限於原編寫者的思維。

三、 記錄與總結階段:轉化隱性知識
測試結束後的產出與回饋,是衡量結對測試成功與否的關鍵。

缺陷與風險記錄:記錄發現的 Bug、潛在的系統弱點,以及在探索中發現的「非預期行為」。

防止過度發散:若測程結束時發現仍有未竟的風險,應透過「新增一個測程」來進一步覆蓋,而非無限制地延長當前的時間。

成果分享與回饋:將測試心得(如新的測試路徑或操作技巧)進行分享,讓這份經驗能轉化為團隊的共同戰力,甚至回饋給自動化測試腳本進行補強。

實戰紀實:一場關於「清明返鄉搶票」的結對測試
在週二下午的 Hsinchu 辦公室裡,資深測試工程師阿明(資深測試專家)與剛修復完支付模組的開發人員小華,準備針對「台灣高鐵 App 訂票系統」進行一場為期 60 分鐘的結對測試。他們不打算翻閱厚重的測試案例,而是決定從真實的使用者情境出發,展開一場集學習、趣味與探索於一體的思維過程。

第一階段:設定目標與角色分配
阿明擔任導航者(Navigator),負責構思測試策略與觀察風險;小華則擔任執行者(Driver),操作手機並即時監看後台 Log。

「小華,我們設定一個極端情境。」阿明提議,「假設今天是清明連假開賣首日,一名大學生要幫自己和兩位外籍交換生訂購『大學生優惠票』,而且要使用 Apple Pay 支付。」這就是阿明依照自己想法進行的測試設計,旨在挖掘潛在的邊界風險。

第二階段:動態探索與問題討論
當小華在手機介面快速輸入護照號碼時,兩人的對話開始激盪:

阿明:「等等,如果我們在輸入第三位旅客護照號碼的瞬間,突然切換到 Line 回訊息再跳回來,系統會記住前面的資料嗎?」

小華:「理論上會暫存,但我沒測過切換 App 對 Session 的影響。」

小華實作切換後,驚訝地發現 App 畫面閃退回首頁。

阿明:「這就是阻礙!我們得先釐清這是快取過期還是記憶體回收問題。」

小華:「我看了一下 Log,是身分驗證的 Regex 判斷式在 App 喚醒時發生了空值異常。」

這種即時的「對話與反饋」,讓原本可能要兩天後才會被回報的 Bug,在 5 分鐘內就找到了根因。

第三階段:挑戰支付與異常中斷
阿明繼續出招:「現在進入支付。在 Apple Pay 臉部辨識跳出來的瞬間,我們故意按下電源鍵關屏。看看這筆訂單會變成就緒(Ready)還是死鎖(Deadlock)?」

小華操作後,後台顯示訂單狀態卡在「支付中」,無法自動釋放。兩人立即討論出這是因為狀態機未設定逾時釋放機制,這對搶票期間的位子留存至關重要。

測試紀錄產出(Session Note)
測程結束後,阿明快速整理了這份具備技術深度的紀錄,這也是協作型測試的重要價值所在:
https://ithelp.ithome.com.tw/upload/images/20260822/20161809WzdHbjhen5.png


上一篇
Day 22 專案中如何進行 ET (3) - ST 主導與 ET 輔助
下一篇
Day 24 專案中如何進行 ET (5) - 協作型 – Mob Testing一群人盯著同一台電腦,測試反而比一個人更有效率
系列文
你的自動化測試,大部分是在演戲|AI coding 時代的探索性測試 30 講25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言