【本文翻譯自 Clear Acceptance Criteria for User Stories with Examples】
在一個完美的世界里,人們看一眼就能明白彼此在想什么,沒有什么能讓他們之間產(chǎn)生困惑。但在現(xiàn)實世界中,我們要想辦法把自己的想法傳達(dá)清楚,讓同行不會誤解我們。
在軟件開發(fā)中,驗收標(biāo)準(zhǔn)(Acceptance Criteria)有助于正確設(shè)定客戶對產(chǎn)品的期望。諸如 "我希望我的應(yīng)用很棒,受到盡可能多的人歡迎 "這樣的標(biāo)準(zhǔn)并不能真正說明什么;我們通過參考用戶故事(User Story)的驗收標(biāo)準(zhǔn)來消除客戶和開發(fā)團(tuán)隊之間的誤解。
在這篇文章中,我們將討論敏捷方法論(如Scrum和Kanban)中的驗收標(biāo)準(zhǔn),并為你提供一些比較好的驗收標(biāo)準(zhǔn)的例子。
Scrum、用戶故事和驗收標(biāo)準(zhǔn)在2020年并不只是流行語
我們提到Scrum是有原因的。Scrum是一個敏捷框架,可以幫助軟件開發(fā)團(tuán)隊交付任何復(fù)雜的產(chǎn)品。在RubyGarage,我們更喜歡按照Scrum的方法論工作,最近我們甚至發(fā)布了自己的Scrum估算撲克應(yīng)用——Scrummer。
在Scrum中(其他敏捷方法也一樣),我們用“用戶故事”和“驗收標(biāo)準(zhǔn)”這樣的術(shù)語來描述需求,以確保清楚地描述最終用戶將如何使用一個應(yīng)用程序,以及團(tuán)隊?wèi)?yīng)該如何完成每個任務(wù)。
當(dāng)我們開始構(gòu)建一個產(chǎn)品時,我們與客戶合作定義用戶故事。用戶故事的編寫格式如下:
作為(某個類型的用戶),我想(執(zhí)行一些行動),以便我(可以實現(xiàn)一些目標(biāo)/結(jié)果/價值)。
As a (type of user), I want to (perform some action) so that I (can achieve some goal/result/value).
用戶故事的目的是解釋用戶在系統(tǒng)中的角色,他們所期望的活動,以及他們打算通過成功完成一個用戶故事來得到什么。對于敏捷團(tuán)隊來說,用戶故事是識別用戶需求的主要方法。
定義驗收標(biāo)準(zhǔn)
那么,我們?nèi)绾未_保用戶故事的正確完成,并符合客戶的要求呢?這就是驗收標(biāo)準(zhǔn)的作用。驗收標(biāo)準(zhǔn)是一個正式的需求清單,它確保所有的用戶故事都能完成,所有的場景都能被考慮在內(nèi)。簡單來說,驗收標(biāo)準(zhǔn)規(guī)定了滿足用戶故事的條件。簡明扼要的標(biāo)準(zhǔn)可以幫助開發(fā)團(tuán)隊避免對客戶的需求產(chǎn)生歧義,防止溝通不暢。
撰寫驗收標(biāo)準(zhǔn)不僅對引起客戶對產(chǎn)品的愿景很重要,對開發(fā)過程也很重要。不同的人會從不同的角度看同一個問題,這很正常。明確寫出的標(biāo)準(zhǔn)為你打算實現(xiàn)的功能引入了一個單一的解決方案。
驗收標(biāo)準(zhǔn)是用來干什么的?
- 確定邊界。驗收標(biāo)準(zhǔn)幫助開發(fā)團(tuán)隊定義用戶故事的邊界。換句話說,驗收標(biāo)準(zhǔn)可以幫助你確認(rèn)應(yīng)用程序何時能如愿以償?shù)匕l(fā)揮作用,也就是說,一個用戶故事已經(jīng)完成。
- 達(dá)成共識。有了驗收標(biāo)準(zhǔn),開發(fā)團(tuán)隊與客戶就會同步。團(tuán)隊清楚地知道應(yīng)該滿足哪些條件,就像客戶知道對應(yīng)用的期望一樣。
- 作為檢驗的依據(jù)。驗收標(biāo)準(zhǔn)是正常流程和異常流程測試的參考依據(jù),旨在檢查系統(tǒng)是否按預(yù)期工作。
- 進(jìn)行準(zhǔn)確的規(guī)劃和估算。驗收標(biāo)準(zhǔn)方案可以將用戶故事正確劃分為任務(wù),從而正確估計和規(guī)劃用戶故事。
誰來寫驗收標(biāo)準(zhǔn),何時寫?
無論是客戶還是開發(fā)團(tuán)隊都要寫驗收標(biāo)準(zhǔn)。通常情況下,由產(chǎn)品負(fù)責(zé)人(客戶)撰寫的標(biāo)準(zhǔn)會由開發(fā)團(tuán)隊的成員進(jìn)行審核,以確保標(biāo)準(zhǔn)規(guī)定得很清楚,并且從開發(fā)的角度來看,沒有任何技術(shù)限制或不一致的地方。如果產(chǎn)品負(fù)責(zé)人有一定的軟件開發(fā)經(jīng)驗,并且知道如何編寫項目文檔,這樣的流程是一種很好的協(xié)作方式。
如果你更愿意把編寫驗收標(biāo)準(zhǔn)的任務(wù)交給開發(fā)團(tuán)隊,那么需求分析師、項目經(jīng)理或QA專家應(yīng)該處理這項任務(wù),因為他們知道技術(shù)和功能的可行性。
請記住,驗收標(biāo)準(zhǔn)應(yīng)該在迭代開始前確定下來,千萬不要等開發(fā)開始后才確定。因此,團(tuán)隊和產(chǎn)品負(fù)責(zé)人應(yīng)該在迭代前就交付物的最低標(biāo)準(zhǔn)達(dá)成一致。
如何寫驗收標(biāo)準(zhǔn)?
驗收標(biāo)準(zhǔn)有幾種類型。最受歡迎的是面向規(guī)則的(以清單的形式)和面向場景的(以場景的形式來說明每個標(biāo)準(zhǔn))。面向場景的類型在敏捷團(tuán)隊中很受歡迎,因為它有助于跨越需求,設(shè)想各種用例,并進(jìn)一步使用場景進(jìn)行手動和自動驗收測試。
使用面向場景的方法描述驗收標(biāo)準(zhǔn)的常用模板是源于行為驅(qū)動開發(fā)(BDD)的Given/When/Then格式。Given/When/Then格式用于編寫驗收測試,以確保滿足所有的規(guī)范要求。
這種格式對人類來說很方便(因為它是以熟悉的因果關(guān)系方式寫的),對Cucumber和RSpec等自動化測試工具來說也很方便。例如,當(dāng)我們建立一個有兩種用戶(注冊用戶和訪客)的網(wǎng)站時,我們很可能為一個用戶故事寫下以下驗收標(biāo)準(zhǔn),定義注冊用戶的登錄功能:
作為一個已注冊的用戶
我希望能夠登錄一個網(wǎng)站
以便我可以訪問到我的個人資料
場景: 系統(tǒng)用戶用有效憑證登錄
Given:鑒于我是該系統(tǒng)的已注冊用戶
我在登錄頁面上
When:當(dāng)我在 "用戶名 "和 "密碼 "字段中填寫我的正確信息時
點(diǎn)擊登錄按鈕
Then:然后我就登錄成功了
Given/When/Then模板可以幫助你減少編寫測試用例的時間,因為你在前期描述了系統(tǒng)的行為。我們更喜歡用第一人稱 "我 "來寫驗收標(biāo)準(zhǔn),因為這有助于我們從用戶的角度來說話,讓用戶的需求銘記在心。
這里有幾個小技巧,可以幫助你寫出優(yōu)秀的驗收標(biāo)準(zhǔn):
- 保持你的標(biāo)準(zhǔn)定義清晰,這樣項目團(tuán)隊的任何成員都能理解你想要傳達(dá)的理念。
- 保持標(biāo)準(zhǔn)的真實性和可實現(xiàn)性。定義你能夠提供的最低限度的功能,并堅持下去。另一方面,不要試圖描述每一個細(xì)節(jié),因為你有可能使你的待辦事項列表變得雜亂無章,并被埋在許多小任務(wù)之下。
- 與所有利益相關(guān)者協(xié)調(diào),使你的驗收標(biāo)準(zhǔn)建立在共識的基礎(chǔ)上。
- 創(chuàng)建可衡量的標(biāo)準(zhǔn),使您能夠充分估計開發(fā)時間,以便能夠在預(yù)算和時間限制內(nèi)完成。
- 考慮提供檢查表,使你能夠看到驗收標(biāo)準(zhǔn)覆蓋了哪些用戶故事。

驗收標(biāo)準(zhǔn)的例子
在本節(jié)中,我們將通過一些常見的功能來舉例說明驗收標(biāo)準(zhǔn)要怎么寫。我們會先定義一下用戶故事,因為驗收標(biāo)準(zhǔn)是在用戶故事指定了所有功能后寫的。
例1
我們的第一個用戶故事描述了網(wǎng)頁搜索功能。
作為一個網(wǎng)站用戶
我希望能在網(wǎng)頁上進(jìn)行搜索
以便我找到必要的信息
根據(jù)Given/When/Then模板,接受標(biāo)準(zhǔn)如下:
場景: 用戶通過名稱搜索一個項目
Given:鑒于我的角色是注冊用戶或訪客
When:當(dāng)我打開 "產(chǎn)品 "頁面時
Then:系統(tǒng)就會顯示出所有產(chǎn)品的列表
并且系統(tǒng)在屏幕右上角顯示 "搜索 "部分
When:當(dāng)我在 "搜索 "字段中填入產(chǎn)品列表中現(xiàn)有項目的名稱時
我點(diǎn)擊 "應(yīng)用 "按鈕或按鍵盤上的回車鍵
Then:系統(tǒng)就會在搜索結(jié)果部分顯示出與輸入的產(chǎn)品名稱相匹配的產(chǎn)品
并且系統(tǒng)在搜索結(jié)果部分的頂部顯示了搜索結(jié)果的數(shù)量
例2
下一個例子代表了一個反饋表頁的驗收標(biāo)準(zhǔn),用戶故事如下:
作為一個網(wǎng)站用戶
我希望能夠提交反饋意見
以便站長們在以后的網(wǎng)站更新過程中可以考慮我的意見或關(guān)注點(diǎn)
這塊功能的接受標(biāo)準(zhǔn)是:
場景: 用戶提交有效數(shù)據(jù)的反饋表
Given鑒于我的角色是登錄用戶或訪客
When”當(dāng)我打開反饋頁面時
Then系統(tǒng)展示給我一張?zhí)峤环答伇?,包?"電子郵件"、"姓名 "和 "評論 "字段,這些字段是必須的
When當(dāng)我在 "電子郵件 "字段中填入有效的電子郵件地址時
我在 "姓名 "一欄填上我的名字
我在 "評論 "欄里填上我的評論
我點(diǎn)擊 "提交反饋 "按鈕
Then系統(tǒng)就會提交我的反饋
然后,系統(tǒng)顯示 "您已成功提交反饋意見 "的閃動信息
然后,系統(tǒng)會清除提交反饋表的字段
例3
最后,我們再來看一個在博客發(fā)表評論功能的用戶故事和驗收標(biāo)準(zhǔn)。只有登錄的用戶才能添加評論。"添加評論 "功能的用戶故事將是:
作為一個登錄用戶
我希望能夠?qū)Σ┛臀恼掳l(fā)表評論
以便我可以得到問題的反饋
這個功能的驗收標(biāo)準(zhǔn)是:
場景:登錄的用戶在博客文章上發(fā)表評論
Given鑒于我是已登錄用戶
When當(dāng)我打開有特定博客的頁面時
Then系統(tǒng)會在博文下方的 "評論 "部分顯示出其他用戶添加的評論列表
并且系統(tǒng)在 "評論 "欄目的上方顯示 "添加評論 "字段
When當(dāng)我在 "添加評論 "字段中填寫我的評論時
我點(diǎn)擊 "提交 "按鈕
Then然后系統(tǒng)會保存我的評論
然后,系統(tǒng)在 "評論 "部分的最上方顯示了我的評論
然后,系統(tǒng)從我的評論開始,左側(cè)就顯示出我的用戶名和資料照片
然后,系統(tǒng)在我的評論下面顯示 "刪除 "和 "編輯 "圖標(biāo)
收尾工作
正如你所看到的那樣,編寫驗收標(biāo)準(zhǔn)對于客戶和開發(fā)團(tuán)隊來說,確實是一項雙贏的活動:它不僅能幫助團(tuán)隊準(zhǔn)確地知道他們必須做什么,而且還能讓客戶及時了解開發(fā)過程,讓他們檢查開發(fā)的軟件是否符合實際的業(yè)務(wù)需求。
不要被用戶故事和驗收標(biāo)準(zhǔn)嚇跑了——你在描述和詳細(xì)說明所有功能上投入的時間最終會得到回報。驗收標(biāo)準(zhǔn)作為用例建模和測試用例的基礎(chǔ),可確保您實現(xiàn)業(yè)務(wù)目標(biāo)并生產(chǎn)出無錯誤的應(yīng)用程序。