身份資料一致性講的不是資料漂亮,而是一條紀錄裡的欄位彼此說得通:地址與郵遞區號同屬一個國家、電話的國碼與所選國家相符、出生日期與年齡門檻不衝突。當這些對應被打破,測試往往不會失敗,反而會安靜地通過,這才是最麻煩的地方。
什麼叫做一條紀錄內部自洽
一筆身份紀錄是由多個欄位互相支撐起來的。國家決定了證件號的格式、地址的行政區與郵遞區號寫法、電話的國碼,以及姓名可能的排列方式;出生日期決定了年齡;性別影響姓名與稱謂。這些關係讓一筆資料讀起來像真的。
自洽的反面不是格式錯誤,而是組合錯誤。單看每一欄都合法,放在一起卻不可能存在:一個國家的地址配上另一個國家的郵遞區號、電話國碼與居住國不符、證件號的格式屬於另一個國家。
判斷自洽與否有一個實用的方法:把這筆紀錄想像成要寄給某個人看,問他會不會覺得哪裡怪。會讓人停下來想一下的地方,通常就是欄位之間的依賴沒有對上。
最常見的矛盾組合
| 矛盾類型 | 表面上看到的樣子 | 通常出錯的地方 |
|---|---|---|
| 地址與郵遞區號 | 兩者各自合法,卻屬於不同國家 | 隨機組合各欄位 |
| 電話與國家 | 國碼與居住國不一致 | 電話單獨產生 |
| 生日與年齡 | 年齡是另存的值,沒有隨生日更新 | 年齡被寫死入庫 |
| 姓名與性別 | 稱謂與名字不符 | 各欄位分開隨機 |
這些組合有一個共同點:它們都來自「每個欄位各自獨立產生」。隨機產生器最擅長製造合法但不搭的資料,而測試若只用這種資料,就測不到一致性規則到底有沒有寫。更麻煩的是,這類錯誤在畫面上很難一眼看出,因為每一欄看起來都很正常。要避免它,可以讓產生流程先決定國家與生日,再由此推導電話、地址與證件號;順序反過來,就會出現各欄位各自為政的情況。
為什麼不自洽的資料會讓測試假通過?
因為驗證程式通常只檢查單一欄位。當所有欄位都各自合法時,流程就會走完,測試得到綠燈;系統其實沒有做任何跨欄位判斷,卻看起來一切正常。等到真實使用者填出一組矛盾的資料,才發現規則根本不存在。
更麻煩的是這種假通過會累積信心。團隊會以為一致性已經被覆蓋,於是後續新增的欄位也不再設計對應的檢查。等到問題在正式環境出現,通常已經是用戶端回報,而不是測試端攔下。
要打破這個循環,測試資料必須刻意包含矛盾的組合,並預期系統會給出特定的行為:擋下、標記,或至少提示。若系統沒有任何反應,這就是一個待補的規則,而不是資料的問題。
電話與國家碼對不上會發生什麼事?
電話是最容易出錯的一欄,因為它同時牽涉國碼、區碼與長度。當國碼與使用者的居住國不符時,簡訊驗證可能永遠送不到,客服也難以判斷該用哪個地區的規則處理。若系統只檢查長度,這種錯誤會一路通過所有驗證。
另一個常見情況是同一筆紀錄裡同時存在市話與行動電話,兩者的國碼卻不一致。真實使用者確實會保留舊國家的號碼,因此系統應該允許這種情況,但要在介面上說清楚哪一支是主要聯絡方式,而不是讓兩支號碼互相矛盾卻沒有標示。
要理解區碼與地區的對應為什麼值得另外檢查,可以參考電話前綴與地區對應這篇的整理。
給開發者:一致性規則該多嚴格
- 先分清哪些配對是硬規則、哪些只是慣例。證件號格式屬於前者,姓名排列屬於後者。
- 硬規則在寫入前就擋下,慣例不一致只發出警告,避免誤擋合法輸入。
- 跨欄位檢查集中在同一層,不要讓每個畫面各自實作一套。
- 年齡這類衍生值即時計算,不要入庫,否則一定會與生日脫節。
- 隨機產生樣本時,讓相關欄位取自同一組來源,而不是各自獨立抽取。
- 不一致的錯誤訊息要指出是哪兩個欄位衝突,而不是只說資料無效。
要驗證你的檢查邏輯是否真的有效,可以拿一組刻意矛盾的樣本跑一遍;若系統照樣通過,那就代表規則還沒寫。想先了解矛盾樣本該怎麼組織,讀測試固定裝置裡的身份資料。郵遞區號本身的國家差異,則可對照各國郵遞區號格式。
一致性檢查該放在哪一層?
越靠近資料寫入的地方越好,但不必只有一層。前端做即時提示是為了體驗,後端做強制檢查才是防線;若只有前端檢查,任何繞過介面的寫入都會把矛盾資料留在系統裡。
測試環境也應該套用同一套規則。若測試環境放寬了檢查,測試就會證明一件不成立的事;這種差異最後一定由正式環境的使用者發現。若某些情境確實需要例外,就把它寫成明確的開關,而不是默默降低標準。
一致性與格式驗證差在哪?
格式驗證只看單一欄位,例如證件號的位數與允許的字元;一致性驗證看的是欄位之間的關係。兩者都會在類似的表單上失敗,但修法完全不同:格式錯誤要改輸入規則,一致性錯誤要改的是產生或組合資料的方式。
很多團隊把兩者混在同一個檢查裡,結果錯誤訊息只說資料無效,使用者與測試都無法判斷問題在哪。分開之後,格式問題適合在輸入時即時提示,一致性問題則適合在送出時檢查,因為它需要多個欄位的值都已經確定。訊息也應該分別說明,欄位本身寫錯與欄位之間對不上是兩件事。
還有一種情況是格式正確但一致性永遠無法滿足,例如某個地區並沒有通用的郵遞區號體系。這種情形應該明確列為例外並寫進規則,而不是讓驗證邏輯去猜,否則第一個遇到的使用者就會被擋下。
下一步
挑三組最常見的矛盾組合,各準備一筆樣本,確認系統會擋下、標記或提示;再把年齡這種衍生欄位從資料表裡移除,改成即時計算。需要一批彼此對應的合成紀錄時,本站的身份產生器可以依國家一次產生完整的一條,且各欄位取自同一組來源——這些內容只供測試與示範,不能用來冒充真人,也不具備任何真實證件的效力。