測試固定裝置指的是那份跟著測試一起留在版控裡的樣本資料,它的價值來自穩定:同一份裝置在每次執行都產生相同結果,失敗才有辦法重現。以下說明身份樣本該怎麼組織與命名、值得先準備哪些邊界案例,以及它為什麼會隨時間腐化。
固定裝置與即時產生的分工
兩者解決的是不同問題,不該互相取代。固定裝置負責穩定,適合核心流程與回歸測試;即時產生負責廣度,能在短時間內造出大量組合,適合探索性測試與壓力情境。
分工的方式通常是分層:核心流程用固定樣本,探索階段用產生器,發現問題後把造成問題的那一筆固定下來,成為新的樣本。這樣既保住可重現性,也不會讓手寫樣本成為唯一的資訊來源。
最需要避免的是把產生器直接接進固定裝置。一旦兩者混在一起,每次調整產生邏輯都會讓整批樣本變動,審查的人看到的是一大片差異,而不是一個有意義的新案例。若樣本數量真的很大,可以讓產生器輸出一次結果後就固定成檔案,之後不再重新產生,這樣既省下人工撰寫的時間,也保住可重現性。
身份樣本該按什麼命名?
名稱是固定裝置唯一的老師。當一筆樣本只叫「身份範例」時,後人無法判斷它為什麼存在、能不能改;若名稱同時帶上國家與場景,例如標明是某國的年齡門檻邊界或某國的單名案例,用途就一目瞭然。
名稱也讓覆蓋率變得可檢查。把樣本名稱列出來,就能看出哪些國家只有一筆、哪些情境完全沒有樣本,而不必逐筆閱讀內容。這比等待某個人記得補充來得可靠。若名稱裡帶上規則類型,還能進一步看出同一類規則是否重複準備了好幾筆長得一樣的樣本。
避免只用序號命名。序號在新增與刪除之間很容易重排,參照它的測試也會跟著失效;名稱只要維持語意,就能承受內容的調整。若某筆樣本真的說不出用途,那通常代表它可以直接刪掉。
值得先準備的邊界樣本有哪些?
與其準備一批長得差不多的紀錄,不如準備幾筆各自代表一種失敗模式的樣本。以身份資料來說,值得先涵蓋的類型包括:
- 極高齡的樣本,用來檢查年齡計算與報表分組。
- 超長姓名,用來檢查欄位長度與顯示排版。
- 只有單名、沒有姓氏的樣本,用來檢查必填規則與字串拼接。
- 含變音符號與非拉丁字元的樣本,用來檢查正規化與比對。
- 生日落在閏日的樣本,用來檢查日期換算。
- 落在保留號段的證件號,用來檢查拒絕邏輯。
這些樣本不需要很多,但要能各自說明它對應哪一種錯誤。若某筆樣本既測不到邊界,也重現不了特定缺陷,那它存在的意義就只是增加維護成本。
為什麼每次隨機產生會讓失敗無法重現?
因為失敗的條件也一起消失了。當測試每次執行都拿到不同的紀錄,一次失敗之後無法再跑出同樣的輸入,也就無法確認修改是否真的解決了問題。團隊往往只能反覆重跑,期待它再次出現。
隨機資料還有一個副作用:它讓差異難以閱讀。審查時看到的是整批欄位都在跳動,而不是一個針對特定情境的新案例,於是很難判斷改動到底帶來了什麼影響。這種難以閱讀的差異也會拖慢審查速度,因為審查的人必須先分辨哪些變動是刻意的、哪些只是隨機的結果。
務實的折衷是把隨機當成發現工具,而不是長期資產。發現問題後,把造成問題的那一筆(或一組條件)固定進裝置,讓它成為回歸測試的一部分;這樣既保留了探索的廣度,也累積了可重現的案例。每次固定下來的樣本,最好同時在檔名或註解裡寫上它當初對應的缺陷或回報編號,日後才有辦法判斷它是否還有意義。
給開發者:裝置的結構與防腐化
- 每個樣本一組明確的識別名稱,包含國家與場景。
- 樣本保持靜態,需要隨機資料時另外用產生器取得。
- 相關欄位取自同一組來源,避免出現跨國家的矛盾組合。
- 檔案開頭寫明用途、涵蓋範圍與最後更新時間。
- 只被單一測試使用的樣本,可以考慮直接寫在該測試裡,減少間接層級。
- 新增樣本時同步檢查是否已有相同用途的樣本,避免重複。
本站的身份產生器可以一次產生一整條彼此對應的紀錄,適合拿來造樣本後再固定下來;這些內容只供測試,不能拿來冒充真人,也不能當成任何真實身分的證明。樣本裡的欄位該如何互相對應,整理在身份資料一致性;地址類樣本的組織方式可以參考測試固定裝置裡的地址資料。
裝置會不會隨時間腐化?
會,而且通常沒有人注意到。當產品規則改變、欄位增減,或某個國家改用新的證件格式,舊樣本就會從「像真的」變成「一看就知道過時」。它仍然能通過測試,因為它測的是舊規則。
防止腐化的方式是把樣本當成程式碼看待:定期抽樣檢視、在規則變動時一併更新、並在檔案裡註明它最後一次被確認的內容。可重現測試資料在流程上怎麼運作,可以參考可重現的測試資料。
一份裝置要涵蓋多少國家才夠?
沒有標準答案,但可以用兩個問題決定:產品實際服務哪些地區,以及哪些地區的規則差最多。與其為每個國家準備一筆結構相同的樣本,不如先覆蓋規則明顯不同的幾類,例如純數字證件號、字母數字混合、內含出生日期,以及需要校驗位的格式。
當產品新增一個地區時,最經濟的做法是同時補上該地區的樣本,而不是等到問題出現才回頭補。若新地區與既有樣本屬於同一類規則,也可以先在文件中註明這是有意的取捨,讓後人知道那是判斷,而不是遺漏。
覆蓋率也應該看得見。把樣本名稱與涵蓋的地區列成一張清單,就能一眼看出哪些地區只有一筆、哪些規則完全沒有樣本,而不必等人憑印象回答。
下一步
把裝置裡的身份樣本名稱逐筆念出來,看看有沒有哪一筆說不出用途;再挑三筆補上邊界情境,例如單名、閏日與超長姓名。做完之後跑一次完整測試,確認這些樣本真的會走到你想檢查的那條路徑,而不是被其他規則先擋下來。