iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Software Development

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

Day 18 漫遊探索-破舊區:專挑系統最髒、最亂、最容易壞的地方測

  • 分享至 

  • xImage
  •  

在軟體測試的「導覽地圖」中,「破舊區測試類型」 (The Seedy District Tours) 代表的是一種更具攻擊性且充滿挑戰的測試思維。如果說「旅遊區」是為了看風景,那麼「破舊區」就是為了走進那些充滿危機、甚至有些令人厭惡的環境,去挖掘軟體最脆弱的一面。

破舊區測試的核心思想,是綜合各種破壞性技巧,刻意創造出「有害」或「惡化」的環境來測試軟體。在現實生活中,破舊區可能是旅客避之唯恐不及的地方,但在測試的世界裡,這正是檢驗系統「生存能力」與「健全度」的最佳場所。測試人員在這裡不再扮演溫和的遊客,而是轉化為充滿懷疑、甚至帶有敵意的破壞者。

(1) 破壞測試法

在軟體測試的「破舊區」中,最令人感到心驚肉跳卻又充滿技術挑戰的方法,莫過於「破壞測試法」 (The Saboteur tour)。這套測試法不再把軟體當成需要呵護的對象,而是將其丟入極度惡劣、甚至充滿敵意的環境中,看看它是否能在資源被掠奪的情況下依然堅強地活著。

不同於一般的測試是檢查「功能好不好用」,破壞測試法是透過「掌控資源」並「限制使用」來觀察系統的崩潰臨界點。測試人員會人為地製造故障注入(fault injection),比如在軟體讀取數據時突然損壞檔案、在記憶體極少的機器上運行高負載操作,或是切斷網路連線。這種「故意做壞事」的行為,是為了驗證系統在面對真實世界不可預期的硬體故障或環境惡化時,是否具備足夠的生存能力。
https://ithelp.ithome.com.tw/upload/images/20260817/20161809OjpGjaumaq.png

LINE 是我們日常生活中極度依賴網路、記憶體與資料存取權限的平台。透過破壞測試法,我們可以模擬在極端環境下,這款通訊巨頭會如何反應。

例子一:模擬「資料庫存取失敗」的強制讀取

LINE 每天都需要從手機儲存空間中讀取海量的聊天紀錄或大頭貼暫存檔。測試員在 LINE 試圖從磁碟讀取數據時(例如點開一張很久以前的照片),刻意改變該檔案的讀取權限,甚至在讀取中途手動毀壞該文件路徑。我們觀察的是:LINE 是否會直接閃退,還是能優雅地報錯,提示使用者檔案損毀並嘗試重新從雲端抓取?

這考驗了軟體對底層資源的「錯誤恢復」機制。一個成熟的系統不能因為一個本地快取檔案壞了,就導致整個聊天室永久無法開啟。

例子二:在「極限低記憶體」下的多工挑戰

當手機後台同時開啟多個高負載 App,導致可用記憶體寥寥無幾時,LINE 的穩定度就會面臨挑戰。

測試員會故意讓其他應用程式在後台消耗掉大量內存,在此時強迫 LINE 執行極端消耗內存的操作,例如開啟「高畫質視訊通話」或是載入一個擁有數千人的「超大型社群」。

這類測試能揭露軟體是否會因為搶不到資源而產生嚴重崩潰。破壞測試法強迫軟體在資源匱乏中生存,能幫助開發團隊優化資源排程,避免在舊型手機上發生頻繁閃退。

例子三:模擬「破碎的網路環境」與故障注入

在真實移動場景中,網路環境往往是多變且惡劣的,而不僅僅是單純的斷線。

測試員會在 LINE 進行備份聊天紀錄到雲端時,人為地引入故障注入(false injection),比如頻繁地斷開網線、或是突然切換到一個有問題的代理伺服器上。

我們觀察的是系統是否會給出正確的錯誤訊息,以及在環境恢復後,是否能確保數據的完整性,而不是讓備份進度卡在死循環中。

(2) 反叛測試法

在軟體測試的「破舊區」中,如果說破壞者是針對硬體資源下毒手,那麼「反叛測試法」 (The Antisocial tour) 則是針對軟體的「邏輯規則」發起全面挑釁。這套測試法不再試圖當一個合群的好使用者,而是要當一個滿懷惡意、專門唱反調的叛逆者,看看軟體在面對這些「不講理」的行為時,是否還能守住底線。

在這種測試中,你會刻意輸入最不可能、無意義、甚至是已知的惡意數據,來挑戰系統的校驗與容錯邏輯。 這種測試思維源於一個深刻的觀察:軟體開發者通常會假設使用者是理性且友善的,會乖乖按照規範輸入資料;但反叛測試員則認為,做好人、太和善、隨大流絕對不是達到測試目的的好辦法。

這種行為就像是在一場正式的酒吧之旅中,故意與導遊對著幹、甚至違反法律。 這類測試通常包含三個分支:輸入荒謬數據的「逆向測試法」(Opposite Tour)、嘗試非法操作的「歹徒測試法」(Crime Spree Tour),以及故意弄混步驟的「錯序測試法」(Wrong Turn Tour)。 透過這些「反社會」的行為,我們能真正驗證系統的錯誤處理能力與忍耐力。
https://ithelp.ithome.com.tw/upload/images/20260817/20161809LKcB5uEmfQ.png

LINE 的設計初衷是為了順暢溝通,但當我們採取反叛立場時,就會發現許多開發者「預想之外」的衝突點。

例子一:挑戰數據忍耐力的「逆向輸入」

在 LINE 的各個輸入欄位中,系統通常期望得到有意義的文字。當系統詢問「您的年齡」或「群組成員上限」時,反叛者會輸入一些完全荒謬的數值。 比如在需要正整數的地方輸入一個負數(如 -12),或是在群組名稱中貼上數萬個亂碼字元。

這是為了測試應用程式的「錯誤處理能力」。 我們要觀察系統是否會因為這些荒謬的輸入而導致崩潰,還是能回傳一個清晰的錯誤訊息,告知使用者輸入無效。

例子二:明目張膽違反規則的「歹徒操作」

這種測試法模擬的是一種「明知不可為而為之」的行為,就像在現實中明目張膽地違反法律。

測試員會嘗試上傳「不符合格式」的檔案作為頭像(例如把一個巨大的資料庫文件副檔名改成 .jpg),或者試著在不具備權限的情況下,頻繁嘗試執行管理員才能做的動作(如強制踢除成員)。

我們期望看到相應的出錯訊息。 如果系統沒有任何反應或甚至讓操作成功了,那就說明發現了一個嚴重的安全缺陷。

例子三:故意弄混順序的「錯序行為」

開發者通常認為使用者會按照「加入購物車 > 結帳 > 付款」的邏輯行動,但反叛者偏要選擇一個組合法的行為,將它們混在一起,造成前後順序不合法。

在 LINE 的貼圖小舖中,測試員會嘗試在「購物車還是空著」的時候就選擇結帳,或者在「還沒購買貨物」之前就試著申請退還該項貨物。

這種「錯序測試法」能驗證系統的狀態機機制是否嚴謹。 許多邏輯漏洞都發生在開發者忘記考慮使用者會不按牌理出牌的時刻。

透過這種不合群、不講理的測試方式,我們能確保軟體不只是在「好人」手中運作流暢,即使面對充滿惡意或粗心的極端使用者,依然能展現出專業的防護與穩定度。

(3) 強迫症測試法

「強迫症測試法」(The Obsessive-Compulsive tour)的定義非常簡單:測試人員像患有強迫症一樣,一遍又一遍地輸入同樣的數據,或者反覆執行完全相同的操作路徑。

在真實的軟體使用情境中,使用者往往會因為操作錯誤、網路延遲導致的焦慮,或者單純的個人習慣,而不斷回頭重做。然而,開發人員在撰寫程式時,通常會預設使用者會按照「特定且正確的順序」完成任務,且「只會執行一次」。強迫症測試法正是為了打破這種理想化的假設。測試員會重複、重做、拷貝、貼上與借用,直到系統因為處理不了這些重複的請求而發生數據損壞、重複扣款或介面崩潰。
https://ithelp.ithome.com.tw/upload/images/20260817/20161809usJsg9PF2B.png

以 LINE 為實戰範例,強迫症測試法能有效驗證其在高頻率重複動作下的穩定性。

例子一:1. 瘋狂重複的「訊息傳送」與「收回」

有些使用者在網路卡頓時,會下意識地連續點擊發送按鈕,或者在發出訊息後,反覆執行收回動作。

測試員選定一則訊息,快速且連續地執行「收回」動作,或者在訊息尚未成功送出前,瘋狂重複點擊發送。我們觀察的是:LINE 的伺服器是否能正確處理這些重複的請求?會不會出現訊息已被收回但對話框依然殘留內容,或者因為重複發送導致對話視窗出現多則重複訊息的混亂情況?

這考驗了系統對「冪等性 (Idempotency)」的處理,確保同一個動作執行多次與執行一次的結果是一樣的,避免造成使用者的資訊焦慮。

例子二:針對「貼圖與表情貼」的連續轟炸

在聊天過程中,快速、重複地切換並傳送同一組貼圖,是強迫症測試的典型路徑。你開啟貼圖選單,以極快的頻率連續點擊同一個動態貼圖,或者在貼圖下載過程中,反覆取消又重新開始下載。

開發人員常忘記為這些重複場景編寫錯誤處理程序。這種測試能驗證 App 的 UI 渲染引擎是否會因為瞬間湧入的重複動畫請求而導致畫面閃退,或者緩存機制是否會因為重複讀寫而發生崩潰。

「強迫症測試法」提醒了我們,軟體的品質不只取決於功能是否實現,更取決於它對人類行為多樣性的「容忍度」。雖然這種重複操作在開發者眼中看似無趣,但它往往能挖掘出那些因為「忘記編寫錯誤處理程序」而造成的重大破壞。


上一篇
Day 17 漫遊探索 – 旅館區: 主流程都測過了還是出包?因為 Bug 最愛躲在「取消、略過、留白」裡
下一篇
Day 19 情境導向測試:為什麼沒有「最佳實務」,只有「適不適合」?
系列文
你的自動化測試,大部分是在演戲|AI coding 時代的探索性測試 30 講19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言