試用例設(shè)計(jì)全流程實(shí)踐指南)
1. 拿到需求別急著開(kāi)寫(xiě)用例設(shè)計(jì)的第一步其實(shí)是讀懂系統(tǒng)功能測(cè)試用例到底該怎么設(shè)計(jì)我發(fā)現(xiàn)很多剛?cè)胄械臏y(cè)試新人最喜歡干的一件事就是打開(kāi)Excel照著需求文檔的字段列表一個(gè)輸入框一個(gè)輸入框地寫(xiě)用例。輸入用戶(hù)名一條輸入密碼一條點(diǎn)擊登錄按鈕一條……寫(xiě)了幾十條下來(lái)看著挺充實(shí)一評(píng)審就被老測(cè)試幾句話(huà)問(wèn)住登錄失敗之后有提示嗎連續(xù)輸錯(cuò)五次會(huì)鎖賬號(hào)嗎鎖了之后什么時(shí)候解鎖這些用例你寫(xiě)在哪了這其實(shí)就是典型的用例設(shè)計(jì)思路沒(méi)建立起來(lái)的表現(xiàn)。測(cè)試用例不是需求文檔的字段翻譯器它是你對(duì)整個(gè)系統(tǒng)的一次模擬推演——你得在腦子里先把功能跑一遍再把跑法具象化成一條條用例。所以我不太喜歡直接用設(shè)計(jì)思路這個(gè)詞來(lái)講這件事我更愿意把它拆成四個(gè)環(huán)節(jié)讀懂需求、拆解場(chǎng)景、組織表達(dá)、持續(xù)維護(hù)。這篇文章就沿著這條線(xiàn)把我這些年實(shí)際走下來(lái)的思路完整過(guò)一遍希望能給正在為用例寫(xiě)不好、評(píng)審總挨批發(fā)愁的朋友一點(diǎn)實(shí)在的參考。1.1 需求澄清階段用例設(shè)計(jì)者應(yīng)該坐的位置先說(shuō)一個(gè)我自己的親身體會(huì)用例設(shè)計(jì)真正開(kāi)始的時(shí)間不是需求文檔交到你手上那一刻而是產(chǎn)品經(jīng)理開(kāi)始講需求的那一刻。我見(jiàn)過(guò)太多測(cè)試同事需求宣講會(huì)上從頭到尾不吭聲等文檔發(fā)下來(lái)才逐字逐句讀。結(jié)果讀到一半發(fā)現(xiàn)一堆模糊地帶這里的列表排序規(guī)則是什么這個(gè)字段必填嗎超時(shí)時(shí)間設(shè)多少——這些問(wèn)題如果在會(huì)上問(wèn)一分鐘就能得到答案拖到寫(xiě)用例的時(shí)候再回頭找產(chǎn)品往往就得等半天而且很容易出現(xiàn)需求變更了但你還在按舊邏輯寫(xiě)的情況。所以在需求澄清階段我會(huì)強(qiáng)迫自己干三件事第一帶著問(wèn)題去聽(tīng)。需求文檔沒(méi)到手之前先跟產(chǎn)品經(jīng)理要一頁(yè)紙的功能概述哪怕是口頭說(shuō)的都行。我要搞清楚三個(gè)最基本的問(wèn)題這個(gè)功能給誰(shuí)用解決什么問(wèn)題操作路徑是什么這三個(gè)問(wèn)題搞不清楚后面所有用例都是空中樓閣。第二現(xiàn)場(chǎng)把業(yè)務(wù)規(guī)則頂清楚。產(chǎn)品經(jīng)理講到任何一條規(guī)則時(shí)我都會(huì)追問(wèn)它的邊界情況。比如訂單超過(guò)30分鐘未支付自動(dòng)取消我會(huì)立刻問(wèn)那第29分59秒支付成功了呢第30分鐘整呢自動(dòng)取消的同時(shí)用戶(hù)正在支付怎么辦取消之后庫(kù)存還恢復(fù)嗎這些問(wèn)題不是抬杠而是把規(guī)則從文字描述變成可執(zhí)行的邏輯。第三把需求當(dāng)代碼一樣做靜態(tài)走查。我會(huì)在拿到需求文檔之后對(duì)照歷史功能列一張變更影響清單——這次改了什么、新增了什么、刪除了什么、有沒(méi)有動(dòng)到之前的老邏輯。很多重大故障都出在我只是加了一個(gè)字段沒(méi)想到牽動(dòng)了舊邏輯這種地方。說(shuō)個(gè)真實(shí)案例。我們之前做過(guò)一個(gè)后臺(tái)的批量導(dǎo)入功能需求文檔里寫(xiě)得很清楚支持Excel批量導(dǎo)入單次不超過(guò)1000條。我看完之后問(wèn)了一句如果導(dǎo)入的文件里有50條數(shù)據(jù)格式正確、30條格式錯(cuò)誤、20條重復(fù)系統(tǒng)會(huì)怎么處理產(chǎn)品說(shuō)逐條校驗(yàn)錯(cuò)誤的跳過(guò)正確的導(dǎo)入。我又問(wèn)那錯(cuò)誤和重復(fù)的記錄要不要給用戶(hù)反饋反饋在哪看要不要生成一個(gè)失敗清單產(chǎn)品當(dāng)場(chǎng)愣了一下說(shuō)這個(gè)細(xì)節(jié)他還沒(méi)想好。結(jié)果這個(gè)沒(méi)想好的細(xì)節(jié)后來(lái)成了整個(gè)功能最復(fù)雜的模塊——因?yàn)槭∏鍐我故揪唧w行號(hào)、錯(cuò)誤原因、并且允許用戶(hù)下載修正。測(cè)試人員如果在需求階段不問(wèn)這一句等用例寫(xiě)完、開(kāi)發(fā)做完了才發(fā)現(xiàn)返工成本就是十倍百倍。所以別覺(jué)得自己只是寫(xiě)用例的你要把自己當(dāng)成第一個(gè)運(yùn)行這套系統(tǒng)的人——你在紙上跑不通的邏輯開(kāi)發(fā)寫(xiě)完大概率也跑不通。1.2 業(yè)務(wù)規(guī)則拆解從需求描述翻譯成邏輯清單需求澄清做完接下來(lái)這一步非常關(guān)鍵也是很多測(cè)試同學(xué)跳過(guò)去的把需求文檔里的自然語(yǔ)言逐條翻譯成如果-那么的邏輯清單。為什么要干這件事因?yàn)樽匀徽Z(yǔ)言是有歧義的。用戶(hù)點(diǎn)擊提交后系統(tǒng)將訂單狀態(tài)更新為待審核——這句話(huà)看起來(lái)沒(méi)毛病但點(diǎn)擊提交之前發(fā)生了什么表單校驗(yàn)不通過(guò)怎么辦網(wǎng)絡(luò)異常超時(shí)怎么辦服務(wù)器返回500怎么辦這些在自然語(yǔ)言里全是隱含邏輯你要做的就是把它們?nèi)匡@式化。我常用的做法是畫(huà)一張業(yè)務(wù)規(guī)則清單表每一行就是一條獨(dú)立業(yè)務(wù)規(guī)則列包括編號(hào)、觸發(fā)條件、系統(tǒng)動(dòng)作、異常分支、備注。比如拿一個(gè)最簡(jiǎn)單的登錄功能來(lái)說(shuō)編號(hào)觸發(fā)條件系統(tǒng)動(dòng)作異常分支R01用戶(hù)名和密碼均正確登錄成功跳轉(zhuǎn)首頁(yè)無(wú)R02用戶(hù)名正確密碼錯(cuò)誤提示密碼錯(cuò)誤記錄失敗次數(shù)R03用戶(hù)名不存在提示用戶(hù)名不存在無(wú)R04連續(xù)失敗5次鎖定賬號(hào)30分鐘鎖定期間即使密碼正確也不放行R05鎖定期滿(mǎn)后首次登錄解鎖并允許登錄重置失敗計(jì)數(shù)這套規(guī)則清單整理完你會(huì)發(fā)現(xiàn)兩件重要的事第一用例還沒(méi)開(kāi)始寫(xiě)你已經(jīng)能看出產(chǎn)品邏輯的漏洞了比如R04和R05之間的競(jìng)態(tài)條件第29分59秒用戶(hù)試了一次錯(cuò)的算不算鎖定期內(nèi)第二后面寫(xiě)用例的時(shí)候完全可以一條規(guī)則對(duì)應(yīng)至少兩條用例——一條走正常分支、一條走異常分支覆蓋率和邏輯完備性一下子就上去了。這塊我還有個(gè)心得規(guī)則清單要盡量落到可判定的程度。什么叫可判定比如密碼錯(cuò)誤這四個(gè)字你得搞清楚是前端先校驗(yàn)格式還是發(fā)到后端校驗(yàn)錯(cuò)誤提示的文案是什么輸入框要不要標(biāo)紅光標(biāo)要不要定位回密碼框這些雖然不是每條都要寫(xiě)進(jìn)用例但它們是你的測(cè)試觀(guān)察點(diǎn)——沒(méi)有觀(guān)察點(diǎn)的用例執(zhí)行完你也分不清到底算通過(guò)還是算失敗。2. 用例設(shè)計(jì)的工具箱不是每種方法都要硬套得知道在什么場(chǎng)景用哪把功能測(cè)試用例設(shè)計(jì)方法論市面上講得很多等價(jià)類(lèi)劃分、邊界值分析、場(chǎng)景法、判定表、因果圖、正交實(shí)驗(yàn)、錯(cuò)誤推測(cè)……書(shū)上都寫(xiě)過(guò)但我在實(shí)際項(xiàng)目里發(fā)現(xiàn)一個(gè)普遍問(wèn)題很多測(cè)試同學(xué)把方法當(dāng)成了模板拿到任何功能都從等價(jià)類(lèi)開(kāi)始套結(jié)果把最簡(jiǎn)單的東西做復(fù)雜了把最復(fù)雜的東西又做簡(jiǎn)單了。所以這一節(jié)我不打算按教科書(shū)的方式把每個(gè)方法講一遍而是想聊聊我實(shí)際使用這些方法時(shí)的選型邏輯——什么場(chǎng)景下用什么方法最劃算什么情況下可以大膽地把方法組合起來(lái)用。2.1 輸入類(lèi)功能等價(jià)類(lèi)和邊界值誰(shuí)在先其實(shí)有講究等價(jià)類(lèi)劃分和邊界值分析是測(cè)試用例設(shè)計(jì)的基礎(chǔ)中的基礎(chǔ)幾乎所有跟輸入框、下拉框、日期控件有關(guān)的功能都能用上。但這兩者誰(shuí)先誰(shuí)后很多人沒(méi)想過(guò)。我的習(xí)慣是先做等價(jià)類(lèi)劃分再做邊界值補(bǔ)充最后用錯(cuò)誤推測(cè)來(lái)加菜。為什么這個(gè)順序因?yàn)榈葍r(jià)類(lèi)解決的是覆蓋面問(wèn)題邊界值解決的是精準(zhǔn)度問(wèn)題錯(cuò)誤推測(cè)解決的是真實(shí)感問(wèn)題。你不可能一上來(lái)就精確定位某個(gè)邊界你得先把大區(qū)域分出來(lái)把有效數(shù)據(jù)和無(wú)效數(shù)據(jù)劃清楚再去看邊界上的那兩三個(gè)值。舉個(gè)例子一個(gè)庫(kù)存管理系統(tǒng)的入庫(kù)數(shù)量輸入框要求是大于0小于等于10000的正整數(shù)。等價(jià)類(lèi)怎么劃有效等價(jià)類(lèi)有三個(gè)1到10000之間的整數(shù)、大于0的任意整數(shù)這只是理論上說(shuō)實(shí)際上還是要落到具體值無(wú)效等價(jià)類(lèi)有一堆0、負(fù)數(shù)、小數(shù)、非數(shù)字字符、超過(guò)10000的整數(shù)、空值。邊界值分析怎么做就是取邊界旁邊的值0和1下邊界兩側(cè)、10000和10001上邊界兩側(cè)。注意這里有一個(gè)新手常犯的錯(cuò)誤——邊界值不是只取邊界本身而是要把邊界兩側(cè)的值都取到而且要結(jié)合有效類(lèi)取一個(gè)、無(wú)效類(lèi)取一個(gè)。比如1是有效下邊界0是無(wú)效下邊界兩個(gè)都要測(cè)。但是光這樣還不夠。我還會(huì)問(wèn)一句這個(gè)輸入框有沒(méi)有輸入法限制能不能粘貼復(fù)制粘貼一個(gè)1000有沒(méi)有可能輸入 1 帶空格算不算通過(guò)這些用等價(jià)類(lèi)和邊界值劃分不出來(lái)因?yàn)樗鼈儗儆谡鎸?shí)用戶(hù)在操作時(shí)可能出現(xiàn)的輸入方式——這就是錯(cuò)誤推測(cè)法發(fā)揮作用的地方了。錯(cuò)誤推測(cè)法聽(tīng)起來(lái)很玄學(xué)好像全靠個(gè)人經(jīng)驗(yàn)其實(shí)也有套路基于你過(guò)去犯過(guò)的錯(cuò)和見(jiàn)過(guò)的bug去推測(cè)當(dāng)前系統(tǒng)可能存在的問(wèn)題。我有個(gè)習(xí)慣新項(xiàng)目開(kāi)始前會(huì)專(zhuān)門(mén)去翻一下過(guò)往同類(lèi)模塊的缺陷報(bào)告把高頻bug列成一張失效模式清單——比如日期格式在不同瀏覽器解析差異、金額計(jì)算浮點(diǎn)精度丟失、大量數(shù)據(jù)下分頁(yè)按鈕失效、快速雙擊提交按鈕產(chǎn)生重復(fù)訂單……這些清單每到一個(gè)新功能就拿出來(lái)過(guò)一遍能命中不少問(wèn)題。2.2 流程類(lèi)功能場(chǎng)景法才是主線(xiàn)別再用功能點(diǎn)羅列代替用戶(hù)旅程輸入類(lèi)功能好處理真正讓很多測(cè)試頭疼的是流程類(lèi)功能——用戶(hù)從開(kāi)始操作到結(jié)束中間可能跨頁(yè)面、跨狀態(tài)、跨數(shù)據(jù)變更。比如電商下單、審批流、訂單退貨流程這類(lèi)功能光靠等價(jià)類(lèi)和邊界值是遠(yuǎn)遠(yuǎn)不夠的你需要的是場(chǎng)景法。場(chǎng)景法的核心思想是用基本流和備選流把用戶(hù)的操作路徑走一遍。但我在工作中看到的普遍現(xiàn)象是大家用場(chǎng)景法用得特別粗糙基本流就是需求文檔里的happy path備選流就是隨便挑幾個(gè)報(bào)錯(cuò)場(chǎng)景——這樣下來(lái)整個(gè)流程的完整性還是覆蓋不到。我自己的做法是把場(chǎng)景法和狀態(tài)轉(zhuǎn)換法結(jié)合著用。第一步先把系統(tǒng)的核心狀態(tài)畫(huà)出來(lái)比如一個(gè)訂單的狀態(tài)可能有新建、待支付、已支付、待發(fā)貨、已發(fā)貨、已完成、已取消。第二步畫(huà)狀態(tài)之間的合法轉(zhuǎn)換邊新建可以到待支付發(fā)起支付待支付可以到已支付支付成功待支付可以到已取消用戶(hù)取消已支付可以到待發(fā)貨支付完成進(jìn)入備貨……第三步把導(dǎo)致?tīng)顟B(tài)轉(zhuǎn)換的動(dòng)作逐條列出來(lái)。第四步用這些合法轉(zhuǎn)換邊推導(dǎo)基本流用非法轉(zhuǎn)換邊和異常情況推導(dǎo)備選流。這么做的好處是你會(huì)發(fā)現(xiàn)有些雖然流程上合法但產(chǎn)品經(jīng)理沒(méi)寫(xiě)清楚的狀態(tài)組合。比如已發(fā)貨之后還能不能申請(qǐng)取消如果訂單已經(jīng)出庫(kù)了用戶(hù)取消申請(qǐng)系統(tǒng)是攔截還是走逆向流程已支付但是支付回調(diào)沒(méi)收到訂單卡在中間態(tài)系統(tǒng)有沒(méi)有對(duì)賬機(jī)制這些問(wèn)題如果等到執(zhí)行階段暴露出來(lái)要么是需求漏洞要么是開(kāi)發(fā)實(shí)現(xiàn)沒(méi)考慮——而你現(xiàn)在在用例設(shè)計(jì)階段就發(fā)現(xiàn)了等于提前幫項(xiàng)目排了雷。場(chǎng)景法寫(xiě)出來(lái)的用例還有個(gè)好處就是可讀性強(qiáng)。我評(píng)審別人的用例時(shí)最怕看到那種點(diǎn)擊A按鈕驗(yàn)證跳轉(zhuǎn)到B頁(yè)面點(diǎn)擊C按鈕驗(yàn)證D字段顯示的碎片化用例——你根本不知道用戶(hù)在干什么也說(shuō)不清這條用例驗(yàn)證的是哪個(gè)業(yè)務(wù)目標(biāo)。場(chǎng)景法用例就不一樣它們的名字本身就帶著業(yè)務(wù)含義用戶(hù)支付超時(shí)后重新發(fā)起支付訂單狀態(tài)最終應(yīng)為已支付并恢復(fù)庫(kù)存扣減——評(píng)審人一眼就能看出這條用例的業(yè)務(wù)價(jià)值和驗(yàn)證點(diǎn)。2.3 多條件組合判定表、因果圖、正交試驗(yàn)到底用哪個(gè)流程類(lèi)功能處理完還有一個(gè)場(chǎng)景經(jīng)常讓人頭大當(dāng)一個(gè)動(dòng)作的結(jié)果同時(shí)受多個(gè)條件影響時(shí)用例數(shù)量會(huì)失控。比如優(yōu)惠券計(jì)算用戶(hù)是否登錄、是否會(huì)員、訂單金額是否滿(mǎn)足門(mén)檻、優(yōu)惠券是否在有效期內(nèi)、是否可疊加使用——五個(gè)條件兩兩組合就是32種情況全寫(xiě)出來(lái)用例數(shù)爆炸不寫(xiě)吧又怕漏掉關(guān)鍵組合。這種場(chǎng)景下不同的方法各有適用場(chǎng)景。判定表適合條件個(gè)數(shù)不多一般不超過(guò)4~6個(gè)且條件和動(dòng)作都是離散取值的情況。因果圖是判定表的圖形化表達(dá)適合你在跟別人溝通邏輯時(shí)用實(shí)際寫(xiě)用例時(shí)還是轉(zhuǎn)化為判定表更直接。正交試驗(yàn)法我個(gè)人覺(jué)得是最適合條件多、組合多、但全測(cè)不現(xiàn)實(shí)的場(chǎng)景——它用正交表取有代表性的組合用最少的用例覆蓋兩兩組合的完整度很適合參數(shù)組合測(cè)試。不過(guò)我得給一句忠告正交試驗(yàn)法在真實(shí)項(xiàng)目中的應(yīng)用沒(méi)有教科書(shū)里那么樂(lè)觀(guān)。因?yàn)檎辉囼?yàn)假設(shè)所有條件之間是相互獨(dú)立的而真實(shí)業(yè)務(wù)邏輯里條件之間往往有強(qiáng)關(guān)聯(lián)——用戶(hù)是會(huì)員和用戶(hù)未登錄這兩個(gè)條件不可能同時(shí)為真。所以正交試驗(yàn)算出來(lái)的用例組合里經(jīng)常會(huì)有一些邏輯上不可能的搭配你需要人工把這些排除掉。我的建議是先用判定表把業(yè)務(wù)規(guī)則的核心邏輯理清楚再用正交試驗(yàn)的思路處理那些理論上可以組合、但沒(méi)必要窮舉的次級(jí)參數(shù)兩者結(jié)合才能既保證核心邏輯覆蓋又控制用例規(guī)模。3. 如何判斷用例夠了從覆蓋維度到優(yōu)先級(jí)排序的完整框架用例寫(xiě)完了評(píng)審的時(shí)候最怕被問(wèn)一個(gè)問(wèn)題用例全了嗎——全這個(gè)字是沒(méi)法量化的。你不能拍著胸脯說(shuō)全覆蓋了你得有一套判斷框架。3.1 功能點(diǎn)之外的隱形維度數(shù)據(jù)、狀態(tài)、權(quán)限、環(huán)境、異常很多測(cè)試同學(xué)判斷覆蓋率的時(shí)候只看功能點(diǎn)——需求文檔里寫(xiě)了幾個(gè)功能點(diǎn)我就寫(xiě)幾條用例。這是遠(yuǎn)遠(yuǎn)不夠的。我在工作里總結(jié)了一套多功能維度檢查法每次用例評(píng)審之前用這套維度清單做一次自查第一個(gè)維度是數(shù)據(jù)維度同樣的操作不同數(shù)據(jù)狀態(tài)下結(jié)果是否一致比如列表頁(yè)有0條數(shù)據(jù)、1條數(shù)據(jù)、1000條數(shù)據(jù)時(shí)的分頁(yè)展示比如搜索功能關(guān)鍵詞為空、單字、長(zhǎng)文本、帶特殊符號(hào)時(shí)的表現(xiàn)。這些不寫(xiě)用例你心里就沒(méi)底。第二個(gè)維度是狀態(tài)維度上文已經(jīng)說(shuō)過(guò)流程類(lèi)功能一定要畫(huà)出所有狀態(tài)和狀態(tài)轉(zhuǎn)換。很多bug其實(shí)就藏在狀態(tài)動(dòng)作的矩陣?yán)铩热缫讶∠唵沃匦轮Ц哆@種操作需求文檔根本沒(méi)寫(xiě)但用戶(hù)真的能到達(dá)這個(gè)頁(yè)面歷史訂單里點(diǎn)了一個(gè)舊鏈接。這種從不該出現(xiàn)的入口進(jìn)入的用例恰恰最能發(fā)現(xiàn)問(wèn)題。第三個(gè)維度是權(quán)限維度同一功能對(duì)不同角色、不同數(shù)據(jù)范圍應(yīng)該有不同的可見(jiàn)性和操作性。前臺(tái)用戶(hù)能不能看到后臺(tái)的刪除按鈕普通員工能不能看到所有人的薪資A部門(mén)經(jīng)理能不能修改B部門(mén)的數(shù)據(jù)權(quán)限維度最容易出的是越權(quán)漏洞這類(lèi)用例在安全測(cè)試?yán)镆彩侵攸c(diǎn)。第四個(gè)維度是環(huán)境維度不同瀏覽器、不同操作系統(tǒng)、不同網(wǎng)絡(luò)環(huán)境下功能表現(xiàn)是否一致這不僅僅是兼容性測(cè)試的事——有些隱藏的js報(bào)錯(cuò)、樣式錯(cuò)亂、接口超時(shí)只在特定環(huán)境下才會(huì)觸發(fā)。我見(jiàn)過(guò)一個(gè)項(xiàng)目開(kāi)發(fā)在自己Chrome上測(cè)得好好的用戶(hù)用Safari打開(kāi)直接白屏就是因?yàn)橛袀€(gè)API在Safari下不被支持。第五個(gè)維度是異常維度這是我最看重的維度。包括外部接口異常、依賴(lài)服務(wù)超時(shí)、數(shù)據(jù)庫(kù)連接失敗、消息隊(duì)列積壓等。很多團(tuán)隊(duì)把異常測(cè)試扔給聯(lián)調(diào)階段去碰運(yùn)氣但真正的異常場(chǎng)景需要提前設(shè)計(jì)——比如支付回調(diào)延遲2分鐘到達(dá)系統(tǒng)怎么處理第三方短信服務(wù)掛了注冊(cè)流程是繼續(xù)還是報(bào)錯(cuò)這些不是聯(lián)調(diào)能碰出來(lái)的得專(zhuān)門(mén)寫(xiě)用例去驗(yàn)證。用這套維度自查完你會(huì)發(fā)現(xiàn)功能點(diǎn)全覆蓋只是一個(gè)及格線(xiàn)。真正的好用例是能讓這些隱形維度里的深層問(wèn)題浮到水面上來(lái)的。3.2 優(yōu)先級(jí)排序高風(fēng)險(xiǎn)、高頻次、高影響三者合一的先測(cè)用例數(shù)量永遠(yuǎn)不可能無(wú)限膨脹所以在用例設(shè)計(jì)階段就得學(xué)會(huì)做減法。我的排序邏輯就一句話(huà)風(fēng)險(xiǎn)高低、使用頻次、影響范圍三者綜合打分分?jǐn)?shù)高的優(yōu)先級(jí)就高。這不是什么高深理論但真正落地的團(tuán)隊(duì)不多。具體怎么操作我給每條用例標(biāo)三個(gè)維度分每個(gè)維度1到5分風(fēng)險(xiǎn)維度是這個(gè)功能出錯(cuò)的可能性——邏輯越復(fù)雜、耦合越深、越容易出問(wèn)題分越高頻次維度是用戶(hù)實(shí)際使用這個(gè)功能的頻率——高頻功能出錯(cuò)影響面最大影響維度是出錯(cuò)后的后果嚴(yán)重程度——數(shù)據(jù)不可恢復(fù)、資金損失、權(quán)限泄露都是5分級(jí)別的。然后計(jì)算綜合分風(fēng)險(xiǎn)乘以頻次乘以影響或者簡(jiǎn)單相加看你團(tuán)隊(duì)習(xí)慣。分高的用例放在冒煙測(cè)試和回歸測(cè)試的核心集里分低的放在擴(kuò)展回歸里。這里有個(gè)容易被忽視的tip冒煙測(cè)試用例集一定要從高優(yōu)先級(jí)用例里選而不是從功能點(diǎn)里平均選。因?yàn)槊盁煖y(cè)試的目的是用最少的時(shí)間確認(rèn)系統(tǒng)沒(méi)崩只有把高風(fēng)險(xiǎn)高頻的功能覆蓋到了這個(gè)目標(biāo)才成立。4. 用例表達(dá)與文檔化字段怎么設(shè)計(jì)、步驟怎么寫(xiě)才算一份能直接用的用例設(shè)計(jì)好用例思路之后表達(dá)層面的問(wèn)題就來(lái)了。很多團(tuán)隊(duì)用例寫(xiě)了不少一執(zhí)行才發(fā)現(xiàn)前置條件沒(méi)寫(xiě)清楚、測(cè)試數(shù)據(jù)沒(méi)準(zhǔn)備好、預(yù)期結(jié)果模糊不清——執(zhí)行人員拿到用例根本沒(méi)法跑。這一節(jié)我專(zhuān)門(mén)聊聊怎么把腦子里想好的用例落成一份別人能直接照著執(zhí)行的文檔。4.1 用例字段設(shè)計(jì)從最小集到完整集哪些字段必不可少功能測(cè)試用例模板不同公司差別很大。有些公司一個(gè)Excel里就五六個(gè)字段用例編號(hào)、模塊、標(biāo)題、步驟、預(yù)期結(jié)果。有些公司特別講究從測(cè)試環(huán)境、測(cè)試階段、前置條件、測(cè)試數(shù)據(jù)、步驟描述、預(yù)期結(jié)果、實(shí)際結(jié)果、缺陷編號(hào)、執(zhí)行人、執(zhí)行時(shí)間、備注十幾個(gè)字段一個(gè)不少。我的觀(guān)點(diǎn)是字段不是越多越好但有幾個(gè)字段絕對(duì)不能省。省掉那些字段用例的可執(zhí)行性和可追溯性都會(huì)大打折扣。首先是前置條件這個(gè)字段重要性極高但也是被省略得最多的。前置條件寫(xiě)清楚執(zhí)行人員才知道這條用例的起點(diǎn)是什么——需要哪些數(shù)據(jù)已存在、哪個(gè)環(huán)境已準(zhǔn)備好、登錄的是哪個(gè)賬號(hào)。我見(jiàn)過(guò)很多用例步驟第一條就寫(xiě)點(diǎn)擊個(gè)人中心但個(gè)人中心入口在哪需要登錄嗎數(shù)據(jù)是空還是有歷史記錄全沒(méi)寫(xiě)執(zhí)行人員只能靠猜。第二步測(cè)試數(shù)據(jù)字段也很關(guān)鍵。比如測(cè)試搜索功能你得寫(xiě)明搜索關(guān)鍵詞是什么期望返回哪些結(jié)果測(cè)試轉(zhuǎn)賬功能你得寫(xiě)明轉(zhuǎn)賬金額、賬戶(hù)余額、手續(xù)費(fèi)規(guī)則。沒(méi)有明確測(cè)試數(shù)據(jù)的用例不同人執(zhí)行可能得出不同結(jié)論——你說(shuō)驗(yàn)證通過(guò)我說(shuō)數(shù)據(jù)不對(duì)吵半天最后發(fā)現(xiàn)是各自拿的數(shù)據(jù)不一樣。第三步預(yù)期結(jié)果字段一定要寫(xiě)到可觀(guān)察可判定。不要寫(xiě)系統(tǒng)正常運(yùn)行這種廢話(huà)要寫(xiě)頁(yè)面右上角提示保存成功列表第一行顯示新記錄記錄狀態(tài)為草稿。預(yù)期結(jié)果越具體用例執(zhí)行的判定就越容易即使換一個(gè)新人來(lái)執(zhí)行也不會(huì)因?yàn)槔斫馄疃鲥e(cuò)。第四步用例編號(hào)要有規(guī)則。很多項(xiàng)目的用例編號(hào)就是流水號(hào)用例多了之后完全沒(méi)法追溯。我習(xí)慣的編號(hào)規(guī)則是模塊縮寫(xiě)-階段-序號(hào)比如LOGIN-SM-001代表登錄模塊冒煙測(cè)試第1條、ORDER-EXT-023代表訂單模塊擴(kuò)展測(cè)試第23條。這樣做的好處是從缺陷編號(hào)里直接能反查到用例編號(hào)用例編號(hào)又能定位到模塊和階段——需求變更的時(shí)候改起來(lái)也有索引可循。4.2 步驟描述操作、輸入、預(yù)期逐行對(duì)應(yīng)一段白話(huà)勝過(guò)十行術(shù)語(yǔ)用例步驟怎么寫(xiě)我非??粗乜蓤?zhí)行性。我見(jiàn)過(guò)最差的寫(xiě)法是輸入正確賬號(hào)密碼點(diǎn)擊登錄驗(yàn)證頁(yè)面跳轉(zhuǎn)?!_賬號(hào)密碼是哪個(gè)賬號(hào)哪個(gè)密碼跳轉(zhuǎn)到哪個(gè)頁(yè)面驗(yàn)證什么什么都不明確。我自己的寫(xiě)法偏好是每個(gè)步驟都包含三要素操作位置、操作動(dòng)作、輸入數(shù)據(jù)如有。每個(gè)步驟的預(yù)期結(jié)果單獨(dú)成行緊跟其后。比如登錄用例可以這樣寫(xiě)打開(kāi)登錄頁(yè)訪(fǎng)問(wèn)地址https://xxx.com/login測(cè)試環(huán)境輸入用戶(hù)名test_user01該賬號(hào)在測(cè)試庫(kù)中已存在輸入密碼Test123456點(diǎn)擊登錄按鈕預(yù)期結(jié)果頁(yè)面跳轉(zhuǎn)至首頁(yè)右上角顯示test_user01首頁(yè)接口請(qǐng)求均返回200這么寫(xiě)看起來(lái)很啰嗦但一個(gè)從沒(méi)接觸過(guò)這個(gè)項(xiàng)目的執(zhí)行人員照著這個(gè)步驟就能完成測(cè)試。這才是用例該有的樣子——用例是給人看的執(zhí)行手冊(cè)不是給自己看的思維導(dǎo)圖。另外還有一個(gè)細(xì)節(jié)用例步驟里應(yīng)該寫(xiě)數(shù)據(jù)而不是寫(xiě)任意有效數(shù)據(jù)。因?yàn)槿我庥行Р恢涝趺礃?gòu)造你說(shuō)隨便填一個(gè)執(zhí)行的人隨手填了個(gè)123456然后發(fā)現(xiàn)報(bào)錯(cuò)說(shuō)密碼格式不對(duì)白白浪費(fèi)時(shí)間排查是不是環(huán)境問(wèn)題。4.3 從功能用例到自動(dòng)化前置設(shè)計(jì)階段就要留的自動(dòng)化接口隨著測(cè)試團(tuán)隊(duì)逐步引入自動(dòng)化比如用Playwright這套工具鏈做Web端端到端測(cè)試功能用例的設(shè)計(jì)思路也要跟著升級(jí)——最核心的變化是用例設(shè)計(jì)階段就要考慮這條用例將來(lái)能不能被自動(dòng)化復(fù)用。我在日常工作中有一個(gè)習(xí)慣每寫(xiě)一條手工用例都會(huì)在腦子里過(guò)一遍如果自動(dòng)化來(lái)做這條用例的步驟是否可腳本化。有些用例天生適合自動(dòng)化固定的操作路徑、明確的輸入輸出、確定的頁(yè)面跳轉(zhuǎn)——這些可以按Playwright的Page Object模式來(lái)拆解把頁(yè)面元素定位和業(yè)務(wù)操作封裝成Page對(duì)象用例腳本只做點(diǎn)擊和斷言?xún)蓪?。有些用例不適合自動(dòng)化需要人工視覺(jué)判斷的樣式問(wèn)題、需要連第三方硬件的場(chǎng)景、大量隨機(jī)數(shù)據(jù)驅(qū)動(dòng)的探索性測(cè)試——這些留在手工用例里更理智。所以在用例模板里我會(huì)額外加一列自動(dòng)化適配性高/中/低/不適用并在步驟描述中盡量把元素的穩(wěn)定標(biāo)識(shí)id、name、data-testid等記錄下來(lái)。這樣做有一個(gè)實(shí)際好處等真正開(kāi)始搭自動(dòng)化框架的時(shí)候你手頭已經(jīng)有一批按自動(dòng)化標(biāo)準(zhǔn)組織過(guò)的用例了不用再回頭重新梳理需求。我見(jiàn)過(guò)太多團(tuán)隊(duì)功能測(cè)試用例是一套Excel自動(dòng)化腳本是另一套Script兩邊各寫(xiě)各的維護(hù)成本翻倍。從一開(kāi)始就在用例設(shè)計(jì)階段對(duì)齊后面能省很多事。5. 用例評(píng)審和維護(hù)好的用例是改出來(lái)的不是寫(xiě)出來(lái)的用例寫(xiě)完了評(píng)審做完了是不是就結(jié)束了不是。用例的生命周期是從評(píng)審會(huì)之后才開(kāi)始的。我見(jiàn)過(guò)太多項(xiàng)目的用例庫(kù)版本還停留在半年之前新需求加了一堆舊用例沒(méi)刪改動(dòng)的邏輯也沒(méi)同步——這樣的用例庫(kù)執(zhí)行價(jià)值接近于零。5.1 評(píng)審會(huì)看什么業(yè)務(wù)正確性、邏輯完備性、表達(dá)可執(zhí)行性用例評(píng)審這個(gè)環(huán)節(jié)不同團(tuán)隊(duì)做法差別很大。有的團(tuán)隊(duì)評(píng)審就是測(cè)試組自己人過(guò)一遍有的團(tuán)隊(duì)會(huì)叫產(chǎn)品、開(kāi)發(fā)、測(cè)試三方一起過(guò)——后者才是我覺(jué)得靠譜的做法因?yàn)槿娇从美慕嵌韧耆煌齻€(gè)角度合起來(lái)才能把問(wèn)題暴露全。產(chǎn)品經(jīng)理看什么看用例是否真實(shí)反映了業(yè)務(wù)需求——有沒(méi)有遺漏商業(yè)規(guī)則有沒(méi)有把某種邊界情況處理得跟業(yè)務(wù)預(yù)期不符。開(kāi)發(fā)人員看什么看用例是否符合系統(tǒng)實(shí)現(xiàn)——某個(gè)功能其實(shí)是調(diào)了第三方接口的你的預(yù)期結(jié)果里得體現(xiàn)異步等待某個(gè)狀態(tài)其實(shí)是定時(shí)任務(wù)刷新的你的用例步驟里得留出觸發(fā)時(shí)機(jī)。測(cè)試人員自己看什么看表達(dá)可執(zhí)行性——前置條件清不清楚測(cè)試數(shù)據(jù)有沒(méi)有給全預(yù)期結(jié)果可不可判定評(píng)審會(huì)上我最常問(wèn)的三個(gè)問(wèn)題是第一個(gè)這條用例的失敗怎么定義如果預(yù)期結(jié)果是頁(yè)面提示保存成功那如果頁(yè)面沒(méi)有提示但數(shù)據(jù)確實(shí)存進(jìn)去了算通過(guò)還是失敗這類(lèi)判定標(biāo)準(zhǔn)必須在評(píng)審時(shí)定清楚否則執(zhí)行時(shí)一定打架。第二個(gè)這個(gè)場(chǎng)景的數(shù)據(jù)從哪里來(lái)很多用例需要特定數(shù)據(jù)支持比如測(cè)試用戶(hù)已購(gòu)買(mǎi)過(guò)該課程。執(zhí)行人員要去哪找這個(gè)用戶(hù)是自己注冊(cè)一個(gè)新賬號(hào)買(mǎi)一遍還是測(cè)試環(huán)境里已經(jīng)有預(yù)置數(shù)據(jù)評(píng)審的時(shí)候不把這個(gè)鏈路走通執(zhí)行階段就開(kāi)始到處求人。第三個(gè)這條用例和那條用例之間有無(wú)依賴(lài)關(guān)系用例的執(zhí)行順序有沒(méi)有講究比如新增用戶(hù)這條必須在查詢(xún)用戶(hù)列表之前執(zhí)行。如果有依賴(lài)關(guān)系要么在用例里寫(xiě)明前置用例編號(hào)要么在Excel里把用例排好序。移動(dòng)端的用例尤其依賴(lài)執(zhí)行順序——你不可能在沒(méi)有安裝App的情況下測(cè)試啟動(dòng)App后的閃屏頁(yè)。評(píng)審會(huì)的產(chǎn)出不只是通過(guò)不通過(guò)的結(jié)論而是一份修改意見(jiàn)清單。我把每個(gè)意見(jiàn)標(biāo)記為阻塞性必須改和建議性可以不改阻塞性的比如業(yè)務(wù)規(guī)則理解錯(cuò)誤、遺漏關(guān)鍵場(chǎng)景、測(cè)試數(shù)據(jù)不可用必須當(dāng)場(chǎng)改完建議性的比如步驟描述可以更精簡(jiǎn)、字段順序調(diào)整會(huì)后統(tǒng)一處理。5.2 變更驅(qū)動(dòng)的用例維護(hù)新增、修改、刪除三條線(xiàn)并行系統(tǒng)上線(xiàn)之后需求變更不可避免。每一次需求變更都是用例庫(kù)的一次手術(shù)。我建議團(tuán)隊(duì)里指定一個(gè)用例庫(kù)Owner維護(hù)者每次變更走一條標(biāo)準(zhǔn)流程第一步需求變更分析。拿到變更需求后先評(píng)估影響范圍——涉及哪些模塊、哪些狀態(tài)、哪些數(shù)據(jù)規(guī)則。影響分析做得越細(xì)用例改動(dòng)范圍就越準(zhǔn)。第二步用例新增。新增的特性寫(xiě)成新用例這部分邏輯跟從0到1設(shè)計(jì)用例一樣不再贅述。但要注意新增用例的編號(hào)不要插到舊編號(hào)中間去用新模塊前綴加新序號(hào)保持編號(hào)體系穩(wěn)定。第三步用例修改。這個(gè)最容易被偷懶——很多測(cè)試同學(xué)在舊用例上直接把預(yù)期結(jié)果改了也不管步驟描述、前置條件、測(cè)試數(shù)據(jù)是否需要同步調(diào)整。我見(jiàn)過(guò)一個(gè)經(jīng)典事故需求把注冊(cè)時(shí)手機(jī)號(hào)必填改成了注冊(cè)時(shí)手機(jī)號(hào)可選填測(cè)試同學(xué)只改了預(yù)期結(jié)果另一條卻不知道手機(jī)號(hào)必填這條用例在另外兩個(gè)模塊如忘記密碼模塊、安全設(shè)置模塊里也有同樣的斷言三個(gè)地方全要同步改——漏改的直接后果就是后面回歸測(cè)試誤報(bào)了一堆bug開(kāi)發(fā)查了半天發(fā)現(xiàn)根本不存在。第四步用例刪除。刪除舊用例也是學(xué)問(wèn)不要直接用物理刪除建議在用例狀態(tài)列標(biāo)記為廢棄——保留可追溯性。因?yàn)槌隽藛?wèn)題要回溯時(shí)你可能需要知道當(dāng)年這個(gè)地方為什么不再測(cè)試了——可能是功能下線(xiàn)了也可能是策略調(diào)整了。5.3 覆蓋率評(píng)估從點(diǎn)數(shù)人頭到需求-用例映射最后聊聊覆蓋率這個(gè)指標(biāo)。很多人一提覆蓋率第一反應(yīng)是代碼覆蓋率——行覆蓋率、分支覆蓋率多少多少。但這個(gè)對(duì)功能測(cè)試用例來(lái)說(shuō)并不直接適用。功能測(cè)試用例設(shè)計(jì)更關(guān)心的是需求-用例映射覆蓋率。我的做法是每個(gè)功能需求點(diǎn)建立一張需求項(xiàng)-用例編號(hào)映射表。比如需求項(xiàng)用戶(hù)注冊(cè)-手機(jī)號(hào)校驗(yàn)對(duì)應(yīng)用例REG-001、REG-002、REG-003需求項(xiàng)用戶(hù)注冊(cè)-密碼強(qiáng)度校驗(yàn)對(duì)應(yīng)REG-004、REG-005。評(píng)審時(shí)把映射表打開(kāi)從上往下逐條打勾看看哪些需求項(xiàng)還沒(méi)有對(duì)應(yīng)用例或者有了用例但沒(méi)覆蓋關(guān)鍵分支。這張表的維護(hù)成本不高但它的價(jià)值在于讓你的用例庫(kù)從一堆Excel變成了一張可審計(jì)的網(wǎng)絡(luò)——每一個(gè)需求點(diǎn)都有據(jù)可查每一條用例都有責(zé)任歸屬。這套需求-用例映射的另一個(gè)價(jià)值是在需求變更時(shí)快速定位影響面。回頭再看5.2節(jié)說(shuō)的同步修改問(wèn)題如果你有映射表一條需求變更過(guò)來(lái)直接查表就知道哪些模塊下的哪些用例需要看不用靠記憶去翻Excel。到這里我把功能測(cè)試用例設(shè)計(jì)從讀懂需求到表達(dá)落地到持續(xù)維護(hù)的完整思路都過(guò)了一遍。這一套東西看著挺多但落到日常工作中核心就是一句話(huà)用例設(shè)計(jì)不是寫(xiě)出來(lái)的是拆出來(lái)的——把需求拆成規(guī)則、把規(guī)則拆成路徑、把路徑拆成步驟、把步驟拆成斷言。你把這個(gè)拆字吃透了用例自然就有血有肉了。