本文首發(fā)于【林子的空間】
在剛接觸BDD(Behavior Driven Development贸宏,行為驅(qū)動(dòng)開(kāi)發(fā))的時(shí)候造寝,我以為就是用Cucumber這樣的工具來(lái)編寫場(chǎng)景用例,從而實(shí)現(xiàn)自動(dòng)化測(cè)試吭练,甚至很長(zhǎng)時(shí)間分不清BDD和ATDD(Acceptance test driven development)到底有什么區(qū)別诫龙。那么,BDD真的就是用來(lái)做自動(dòng)化測(cè)試的嗎鲫咽?本文就來(lái)跟大家分享一下我理解的BDD签赃。
為什么要BDD?
“開(kāi)發(fā)軟件系統(tǒng)最困難的部分就是準(zhǔn)確說(shuō)明開(kāi)發(fā)什么” (“The hardest single part of building a software system is deciding precisely what to build” — No Silver Bullet, Fred Brooks) 分尸。
場(chǎng)景一:業(yè)務(wù)分析人員覺(jué)得自己分析的需求已經(jīng)寫的很清晰了锦聊,并且跟技術(shù)人員進(jìn)行了足夠的溝通,可是開(kāi)發(fā)完做Desk check的時(shí)候箩绍,發(fā)現(xiàn)所開(kāi)發(fā)的功能還是跟期望有差距括丁。
場(chǎng)景二:開(kāi)發(fā)團(tuán)隊(duì)辛辛苦苦開(kāi)發(fā)完一個(gè)功能,滿懷信心的去給產(chǎn)品經(jīng)理/客戶展示的時(shí)候伶选,才發(fā)現(xiàn)原來(lái)客戶需求的功能不是這樣的史飞。
這些場(chǎng)景是不是似曾相識(shí)?為什么會(huì)這樣仰税?第一個(gè)場(chǎng)景是開(kāi)發(fā)團(tuán)隊(duì)內(nèi)部技術(shù)人員跟需求分析人員的理解有偏差构资,導(dǎo)致大家理解的需求其實(shí)是不一樣的;第二個(gè)場(chǎng)景是開(kāi)發(fā)團(tuán)隊(duì)沒(méi)有真正理解產(chǎn)品經(jīng)理/客戶所提出來(lái)的真實(shí)需求陨簇,導(dǎo)致開(kāi)發(fā)的產(chǎn)品跟需求不一致吐绵。其實(shí),產(chǎn)生這兩個(gè)不一致的真正原因是因?yàn)椴煌巧兄煌念I(lǐng)域知識(shí)河绽,說(shuō)著不同的語(yǔ)言己单,大家在溝通的時(shí)候,如果都用自己領(lǐng)域語(yǔ)言耙饰,必然會(huì)產(chǎn)生溝通代溝纹笼,導(dǎo)致理解的不一致性。
領(lǐng)域知識(shí)不同苟跪、語(yǔ)言不通導(dǎo)致溝通障礙廷痘,這個(gè)客觀存在的問(wèn)題該如何解決呢蔓涧?BDD正是為此而生。
BDD是什么笋额?
BDD的提出者Dan North強(qiáng)調(diào)BDD不是關(guān)于測(cè)試的元暴,它是在應(yīng)用程序存在之前,寫出用例與期望兄猩,從而描述應(yīng)用程序的行為茉盏,并且促使在項(xiàng)目中的人們彼此互相溝通。
要給BDD下個(gè)清晰易懂的定義很難枢冤,包括大師們也這么認(rèn)為鸠姨,這里試著總結(jié)以下幾點(diǎn):
1. 關(guān)注的是業(yè)務(wù)領(lǐng)域,而不是技術(shù):BDD強(qiáng)調(diào)用領(lǐng)域特定語(yǔ)言(DSL, domain specific language)描述用戶行為掏导,定義業(yè)務(wù)需求享怀,而不會(huì)關(guān)心系統(tǒng)的技術(shù)實(shí)現(xiàn)。
2. 不是工具趟咆,強(qiáng)調(diào)的是一種協(xié)作方式:BDD要求各個(gè)角色共同參與系統(tǒng)行為的挖掘和定義添瓷,以實(shí)現(xiàn)對(duì)業(yè)務(wù)價(jià)值的一致理解。
3. 不是關(guān)于測(cè)試的:BDD源自TDD值纱,又不同于TDD鳞贷,重點(diǎn)不是關(guān)于測(cè)試的,但可以指導(dǎo)更好的做自動(dòng)化測(cè)試虐唠。
4. 全棧敏捷方法:BDD促使團(tuán)隊(duì)所有角色從需求到最后的測(cè)試驗(yàn)證搀愧,進(jìn)行高度的協(xié)作和溝通,以交付最有價(jià)值的功能疆偿。
BDD怎么做咱筛?
用例場(chǎng)景的描述格式“GIVEN... WHEN... THEN... ”對(duì)大家都不陌生,但用這個(gè)格式寫出好的用例卻是非常的難杆故,尤其是新手迅箩。這里總結(jié)幾點(diǎn)供大家參考:
1.業(yè)務(wù)層抽取,業(yè)務(wù)語(yǔ)言描述
根據(jù)業(yè)務(wù)流程找出對(duì)應(yīng)的數(shù)據(jù)流处铛,在每個(gè)數(shù)據(jù)停留點(diǎn)或者數(shù)據(jù)發(fā)生變化的點(diǎn)進(jìn)行縱切饲趋,抽取出一個(gè)個(gè)用例場(chǎng)景。下面以一個(gè)真實(shí)業(yè)務(wù)來(lái)說(shuō)明撤蟆。
實(shí)例:
員工在企業(yè)系統(tǒng)創(chuàng)建空白問(wèn)卷奕塑,發(fā)送給委托人,委托人可以在用戶系統(tǒng)看到問(wèn)卷并填寫家肯,填寫完畢提交后龄砰,員工可以在企業(yè)系統(tǒng)看到填完的問(wèn)卷報(bào)告。業(yè)務(wù)流程和數(shù)據(jù)流如下圖所示息楔,根據(jù)前面描述的方法可以切分出四個(gè)用例場(chǎng)景寝贡。
場(chǎng)景的描述語(yǔ)言一定是業(yè)務(wù)領(lǐng)域可懂的扒披,不要涉及任何實(shí)現(xiàn)相關(guān)的技術(shù)細(xì)節(jié)值依。所描述的場(chǎng)景一定是從業(yè)務(wù)層抽象出來(lái)圃泡,體現(xiàn)真實(shí)業(yè)務(wù)價(jià)值的。
2.技術(shù)人員可懂愿险,自動(dòng)化友好
所描述的用例場(chǎng)景要能驅(qū)動(dòng)開(kāi)發(fā)颇蜡,必須要讓技術(shù)人員易于理解;要指導(dǎo)自動(dòng)化測(cè)試辆亏,還得要求對(duì)于自動(dòng)化的實(shí)現(xiàn)是友好的风秤。
這一點(diǎn)似乎是跟第一點(diǎn)有些矛盾,但我們嚴(yán)格遵守BDD的格式要求還是可以做到的:
- GIVEN從句描述的是場(chǎng)景的前提條件扮叨、初始狀態(tài)缤弦,通常是一種現(xiàn)在完成時(shí)態(tài);
- WHEN從句是采取某個(gè)動(dòng)作或者是發(fā)生某個(gè)事件彻磁,一定是動(dòng)詞碍沐,通常是一般現(xiàn)在時(shí);
- THEN從句用“應(yīng)該…(should be…)”來(lái)描述一種期望的結(jié)果衷蜓,而不用斷言(assert)累提,后者與測(cè)試關(guān)聯(lián)更緊密。
3.數(shù)據(jù)驅(qū)動(dòng)磁浇,需求實(shí)例化
抽象的業(yè)務(wù)語(yǔ)言描述的需求斋陪,往往由于太抽象而缺失掉很多關(guān)鍵信息,導(dǎo)致不同人員對(duì)需求理解的不一致置吓。想要既抽象又能包含細(xì)節(jié)信息无虚,就需要采用需求實(shí)例來(lái)描述。簡(jiǎn)單說(shuō)來(lái)衍锚,就是給場(chǎng)景用例舉例說(shuō)明友题。舉例就會(huì)需要列舉數(shù)據(jù),如果在場(chǎng)景用例描述里邊直接添加數(shù)據(jù)實(shí)例构拳,那樣的用例將會(huì)很混亂咆爽,可讀性和可維護(hù)性都非常差。如果我們能夠在描述場(chǎng)景的用例里邊用一些變量來(lái)代替置森,把變量對(duì)應(yīng)的值(數(shù)據(jù))提取出來(lái)存為一個(gè)表格或者獨(dú)立的文件斗埂,這樣將會(huì)使得用例的可讀性很好,而且也不會(huì)缺失細(xì)節(jié)信息(數(shù)據(jù))凫海,后期的維護(hù)和修改也較為方便呛凶。這就是數(shù)據(jù)驅(qū)動(dòng)的方法來(lái)描述實(shí)例化的需求。
下面舉幾個(gè)例子行贪,大家體會(huì)一下:
場(chǎng)景一:檢查收件箱漾稀,可以看出第三個(gè)清晰明了且能體現(xiàn)業(yè)務(wù)價(jià)值模闲,比較符合上面的要求。
場(chǎng)景二:限制非法用戶查看某些受限內(nèi)容崭捍,BDD要強(qiáng)調(diào)什么(What)尸折,而不是怎么(How),第二個(gè)寫的比較好殷蛇。
場(chǎng)景三:添加圖書到購(gòu)物車并計(jì)算總額
BDD的工具有Cucumber实夹、JBehave、Twist粒梦、Concordion等亮航,工具的優(yōu)缺點(diǎn)和使用方法,網(wǎng)上都有豐富的文檔可參考匀们,在此不作介紹缴淋。
BDD有什么好處?
BDD的作用是把利益關(guān)系人泄朴、交付團(tuán)隊(duì)等不同方面的項(xiàng)目相關(guān)人員集中到一起重抖,形成共同的理解,共同的價(jià)值觀以及共同的期望值叼旋。它可以幫助我們:
1. 關(guān)注用戶行為
2.交付最有用的功能
3. 在團(tuán)隊(duì)內(nèi)部維護(hù)一致的術(shù)語(yǔ)
4. 探究需求實(shí)例
5. 編寫和維護(hù)需求
6. 創(chuàng)建活的文檔
7. 消除協(xié)作與溝通障礙
什么樣的項(xiàng)目適合BDD仇哆?
- 簡(jiǎn)單的一次性項(xiàng)目,溝通交流成本都較低的情況下夫植,沒(méi)有必要使用BDD讹剔;
- 業(yè)務(wù)比較輕量,重在技術(shù)方面的項(xiàng)目详民,可以使用簡(jiǎn)單的白板上的BDD延欠,不需要在BDD工具記錄需求用例文檔;
- 業(yè)務(wù)復(fù)雜沈跨、團(tuán)隊(duì)成員較多的項(xiàng)目由捎,溝通成本高,BDD很有必要饿凛。
常見(jiàn)疑惑
1.BDD與TDD/ATDD
TDD是測(cè)試驅(qū)動(dòng)開(kāi)發(fā)狞玛,ATDD是驗(yàn)收測(cè)試驅(qū)動(dòng)開(kāi)發(fā),都是關(guān)于測(cè)試的涧窒,是與所開(kāi)發(fā)的系統(tǒng)緊密聯(lián)系的心肪。而BDD則不同,前面提到過(guò)BDD不是關(guān)于測(cè)試的纠吴,著重關(guān)注需求硬鞍、關(guān)注客戶的業(yè)務(wù)價(jià)值,所描述的需求用例是可以獨(dú)立于軟件系統(tǒng)存在的,因?yàn)榭蛻舻臉I(yè)務(wù)是始終存在的固该,不取決于是否有軟件系統(tǒng)來(lái)支撐锅减。
2. BDD與SBE
SBE(Specification By Example,實(shí)例化需求)是在BDD之后由Gojko提出來(lái)的伐坏,也是關(guān)于需求的怔匣,主要強(qiáng)調(diào)通過(guò)列舉實(shí)例發(fā)現(xiàn)需求中的缺失概念。BDD也是關(guān)注需求的著淆,同樣會(huì)使用實(shí)例來(lái)描述行為劫狠。兩者的本質(zhì)沒(méi)有區(qū)別拴疤,只是概念的差異永部。