規格的兩種洞:沉默與假具體
一份讀起來完整的規格不等於完整的規格。而且規格的洞有兩種,它們要用兩種不同的方式才抓得到——任一種掃法都抓不到另一種的獵物。
沉默(silence):規格從頭到尾沒提到的維度
冪等性、逾時、併發誰贏、終態再打一次、誰不該看到、部分成功怎麼回滾、邊界的等號算不算。
抓法:逐條問維度的 checklist(15 題,見 BDD checklist 專門找規格沒寫到的維度)。
為什麼測試抓不到:測試只能對「已經寫在 spec 的句子」寫斷言。規格從頭沒提「兩個人同時做誰贏」,就不會有人去寫那個空測試。測試證偽已寫的,checklist 找沒寫的。
假具體(假 concrete):句子讀起來完整,但寫不出斷言
規格寫「額度不足時拒絕」——checklist 的「結果可觀察嗎」會判它過關,因為它確實寫了結果。但一動手寫斷言就卡住:
- 拒絕是回 400 還是 200 + errorCode?
- 額度不足含不含凍結金額?
- 「超過 7 天」的起算點是
completedAt還是paidAt?自然日還是工作日?第 7 天 23:59 算不算內?
抓法:寫 test skeleton——每條 AC 一個測試名稱 + 輸入/預期輸出/錯誤路徑三行註記,不寫實作。寫「合理」「視情況」「正確處理」就是洞,不是答案。
為什麼 checklist 抓不到:寫得出問句 ≠ 答得出數值。
可以帶走的一句話
checklist 管廣度(想到要問什麼),skeleton 管深度(答案夠不夠具體到能斷言)。 兩個 pass 都要跑。
順帶一提,skeleton 還會照出不可測的需求(「回應要夠快」「介面要直覺」);checklist 則抓得到跨 story 的矛盾(story A 說終態不可改、story B 說管理員可強制改,兩邊各自都能寫斷言、各自都綠)。