一、寫在前面:為什么“分類”與“決策”永不過時
在需求文檔里,一句“用戶輸入年齡”看似平常,背后卻隱藏著 0-150 的整數、負數、小數、空值、超長字符串、甚至 SQL 注入的無數可能。軟件測試的使命,就是在無限輸入里劃出有限、有代表性的樣本,用最少用例捕獲最多缺陷。
等價類劃分與判定表驅動,正是兩種最古老卻依然鋒利的“分類”與“決策”武器。本文用近四千字,把概念、方法、誤區、綜合案例串成一條可落地的思維鏈,幫助你下一次評審時,一眼看穿需求暗礁。
二、等價類測試:把無限切成有限
1. 定義與初心
等價類,指對于程序規格說明而言,同一組輸入值在內部處理的“路徑”完全相同。測試者只需從每一類里挑一個代表值,即可覆蓋整類風險。
2. 三大原則
• 完備性:所有可能輸入必須落入某個等價類。
• 無冗余:類與類之間互不重疊。
• 代表性:類內任取一值即可代表整類行為。
3. 分類維度
• 有效等價類:符合規格,期望正常輸出。
• 無效等價類:違背規格,期望拋出異常或錯誤提示。
4. 粒度陷阱
粒度過粗漏掉缺陷,過細則爆炸。經驗法則:先按“業務含義”粗分,再按“實現細節”細分。
5. 邊界值補充
等價類中心值往往安全,邊界值才是缺陷高發地帶。因此等價類常與邊界值成對出現:先分類,再在每個類里取邊界。
三、判定表測試:讓邏輯決策一目了然
1. 產生背景
當輸入條件組合多、業務規則呈網狀時,自然語言難以窮舉。判定表用“條件樁-動作樁”矩陣,把復雜邏輯拍平。
2. 四步法
• 列出所有條件(Condition)。
• 列出所有可能動作(Action)。
• 計算條件組合數(2^n)。
• 合并相似規則,剔除不可能組合,得到精簡表。
3. 精簡策略
• 無關條件用“-”占位。
• 決策樹逆向驗證,確保無遺漏。
4. 與等價類的關系
判定表擅長多條件組合;等價類擅長單條件取值。二者互補:先判定表梳理規則,再等價類細化輸入。
四、綜合題解析:一道面試題的三次重構
題目:某系統根據用戶“年齡+會員等級+優惠券”計算折扣,規則如下:
規則 A:年齡<18 且會員等級≥3,折扣 20%;
規則 B:年齡18-60 且優惠券=Y,折扣 15%;
規則 C:年齡>60 或會員等級<3 且優惠券=N,折扣 10%;
其余情況無折扣。
第一輪:等價類粗分
年齡:少年(<18)、青年(18-60)、老年(>60)
會員:高(≥3)、低(<3)
優惠券:Y、N
有效類 3×2×2=12 種,無效類考慮負數、空值、超長字符串。
第二輪:判定表精修
條件樁:年齡<18、18-60、>60;會員≥3;優惠券=Y
動作樁:折扣20%、15%、10%、0%
計算組合 3×2×2=12,合并后得到 4 條精簡規則,與需求一一對應。
第三輪:邊界值加料
年齡邊界:17、18、60、61
會員邊界:2、3
優惠券邊界:大小寫、空字符串
最終用例:有效 12 條 + 邊界 8 條 + 無效 6 條 = 26 條,覆蓋度>99%。
五、誤區與反模式
誤區1:等價類只分“有效/無效”
結果漏掉業務規則內部條件。
誤區2:判定表一味求全
2^8=256 條規則讓人望而生畏。應先合并無關條件。
誤區3:邊界值濫用
把每個整數邊界都測一遍,導致用例爆炸。邊界值應在等價類內部取。
誤區4:忽視無效類
無效輸入往往觸發安全漏洞,如 SQL 注入、XSS。
六、自動化映射:從表格到腳本
判定表可直接映射為決策樹或 DSL:
- 條件順序即樹節點,動作即葉子;
- 每條路徑對應一條自動化用例;
- 變更需求只需更新表,腳本自動同步。
CI 中加入“判定表 diff”門禁,防止需求漂移。
七、性能測試中的等價類
在高并發場景,等價類可延伸到“負載等價”:
- 請求量:低、中、高
- 數據量:空庫、基準、極限
- 網絡:局域網、跨城、跨洲
通過正交實驗,把三維組合壓縮到 9 條代表性用例,既節省機器又保證置信度。
八、案例串燒:登錄、搜索、支付
1. 登錄
等價類:有效用戶名/密碼、空用戶名、超長密碼、SQL 注入串
判定表:記住密碼=Y/N、驗證碼=Y/N、失敗次數>5
2. 搜索
等價類:關鍵字長度 0-1、2-10、>10
判定表:排序=時間/熱度、過濾=全部/圖片/視頻
3. 支付
等價類:金額>0、=0、負數
判定表:優惠券=可用/不可用/已過期、支付方式=微信/支付寶/銀行卡
九、與敏捷的結合:故事卡里的測試思維
在敏捷迭代,測試人員將等價類與判定表寫入故事卡驗收標準:
- 卡片標題:用戶下單折扣計算
- 驗收條件:判定表 4 條規則全部綠燈
- 邊界用例:年齡=17.9、18.0、60.0、60.1
開發者在編碼階段即可對照表格自測,防止“開發完再補測試”的時序錯位。
十、小結:讓思維成為肌肉記憶
等價類教會我們“分類”,判定表教會我們“決策”。
兩者結合,把復雜需求拆成可執行的有限用例,把測試從“經驗驅動”變為“數據驅動”。
當下一次需求評審會上,你拿出一張判定表,
或在白板畫出等價類邊界線,
團隊的溝通效率與缺陷發現率,都會悄悄提升一個量級。
測試不僅是找 bug,更是把需求的不確定性,轉化為可驗證的確定性。