BDD是第二代的、由外及內(nèi)的括袒、基于拉(pull)的次兆、多方利益相關(guān)者的(stakeholder)、多種可擴(kuò)展的锹锰、高自動(dòng)化的敏捷方法芥炭。它描述了一個(gè)交互循環(huán),可以具有帶有良好定義的輸出(即工作中交付的結(jié)果):已測(cè)試過(guò)的軟件恃慧。
簡(jiǎn)單一點(diǎn)地說(shuō)园蝠,BDD,即行為驅(qū)動(dòng)開(kāi)發(fā)糕伐,是開(kāi)發(fā)者通過(guò)與產(chǎn)品經(jīng)理溝通需求砰琢,共同定義出滿足這些需求的軟件需具備的行為(Behaviour)蘸嘶,再以這些行為為驅(qū)動(dòng)(Driven)良瞧,編寫(xiě)產(chǎn)品代碼(Development)來(lái)實(shí)現(xiàn)這些行為陪汽。BDD的出現(xiàn),是為了解決測(cè)試驅(qū)動(dòng)開(kāi)發(fā)中常遇到的問(wèn)題褥蚯,比如:從哪里開(kāi)始測(cè)試挚冤,應(yīng)該測(cè)試什么,不應(yīng)該測(cè)試什么等等赞庶。BDD源自TDD训挡,但重點(diǎn)不是關(guān)于測(cè)試,所強(qiáng)調(diào)的溝通與協(xié)作可以指導(dǎo)更好的做自動(dòng)化測(cè)試歧强。BDD?強(qiáng)調(diào)用領(lǐng)域特定語(yǔ)言(DSL,?domain?specific?language)描述用戶行為澜薄,定義業(yè)務(wù)需求,而不會(huì)關(guān)心系統(tǒng)的技術(shù)實(shí)現(xiàn)摊册。
為什么要BDD肤京?
美國(guó)經(jīng)濟(jì)解讀:
“The?hardest?single?part?of?building?a?software?system?is?deciding?precisely?what?to?build(開(kāi)發(fā)軟件系統(tǒng)中最困難的部分就是準(zhǔn)確地說(shuō)明需要開(kāi)發(fā)什么)”?—?No?Silver?Bullet,?Fred?Brooks
案例一:業(yè)務(wù)分析人員覺(jué)得自己分析的需求已經(jīng)寫(xiě)的很清晰了,并且跟技術(shù)人員進(jìn)行了足夠的溝通茅特,可是開(kāi)發(fā)完?sign?off的時(shí)候忘分,發(fā)現(xiàn)所開(kāi)發(fā)的功能還是跟期望有差距。
案例二:開(kāi)發(fā)團(tuán)隊(duì)辛辛苦苦開(kāi)發(fā)完一個(gè)功能白修,滿懷信心的去給客戶展示的時(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)致理解的不一致性镜豹。使用BDD以上兩個(gè)案例需求和實(shí)現(xiàn)不一致的問(wèn)題就能迎刃而解了傲须。
BDD常用框架
BDD面臨的首要問(wèn)題是如何使用特定的描述性語(yǔ)言來(lái)完成需求的描述。目前BDD框架已經(jīng)比較多趟脂,比如?JBehave,Cucumber,Concordian?等泰讽,每一種框架都使用自己的一套DSL。
使用Calabash實(shí)現(xiàn)BDD開(kāi)發(fā)
Calabash是基于Cucumber框架實(shí)現(xiàn)的一套跨平臺(tái)的BDD開(kāi)發(fā)框架,可以方便的實(shí)現(xiàn)在iOS平臺(tái)和Android平臺(tái)上的自動(dòng)化UI接受測(cè)試已卸。下面將通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)講解整個(gè)Calabash的配置開(kāi)發(fā)步驟(以XCode為例)佛玄。
功能描述:檢驗(yàn)登錄密碼是否合法--在登錄界面,用戶輸入完賬號(hào)密碼累澡,當(dāng)用戶點(diǎn)擊“登錄”按鈕的時(shí)候梦抢,檢驗(yàn)用戶的密碼是否大于等于6位,如果小于愧哟,出現(xiàn)錯(cuò)誤提示“密碼不能少于6位”
安裝Calabash沙盒:打開(kāi)終端奥吩,在終端里運(yùn)行下面的腳本。該腳本將會(huì)在沙盒中安裝配置Ruby?2.1.5-p273,?Calabash?iOS,?Calabash?Android以及Xamarin?Test?Cloud.?(備注:Calabash沙盒會(huì)忽略電腦上的默認(rèn)Ruby配置蕊梧,不對(duì)其造成任何影響霞赫,所有相關(guān)文件都存在$Home/.calabash/sandbox中)
curl-sslhttps://raw.githubusercontent.com/calabash/install/master/install-osx.sh|bash
安裝成功后,terminal中將出現(xiàn)下列的提示肥矢。
新建工程:創(chuàng)建一個(gè)只有登錄界面的新工程绩脆,為登錄界面嵌入一個(gè)navigation?controller,title為“點(diǎn)融網(wǎng)”橄抹,登錄界面中包含了一個(gè)“賬號(hào)”輸入框靴迫,“密碼”輸入框,“登錄”按鈕以及一個(gè)“錯(cuò)誤信息”label楼誓。實(shí)現(xiàn)邏輯玉锌,如果用戶輸入的密碼不合法,提示“錯(cuò)誤信息“疟羹。
引入Calabash庫(kù)
a)?在終端cd至工程根目錄
b)?在終端輸入calabash-sandbox
c)?在沙盒中輸入calabash-ios?download
d)?用XCode打開(kāi)工程主守,選擇TARGETS->工程->Building?Settings->?Other?Linker?Flags,雙擊Debug榄融,在對(duì)話框中粘貼下面字符串
-ObjC?-force_load?"$(SOURCE_ROOT)/calabash.framework/calabash"?-framework?CFNetwork
6.為iOS工程創(chuàng)建一個(gè)Calabash測(cè)試用例
在沙盒中輸入下面命令参淫,執(zhí)行該命令時(shí)會(huì)出現(xiàn)一系列的一般疑問(wèn)句,全部選y就可以了愧杯。命令執(zhí)行完成后涎才,工程根目錄下會(huì)出現(xiàn)一個(gè)features的文件夾,里面存放的就是將來(lái)會(huì)被自動(dòng)測(cè)試的feature們
根據(jù)Gherkin的語(yǔ)法規(guī)則(類似于自然語(yǔ)言)在sample.feature文件中定義測(cè)試用例并保存力九,如下面所示耍铜。作者在這里只寫(xiě)了該feature中的一個(gè)scenario,即密碼太短的檢驗(yàn)跌前;讀者可以嘗試在后面加上另外一個(gè)scenario棕兼,即檢驗(yàn)是否包含至少一個(gè)大寫(xiě)字母
在沙盒中輸入Cucumber,真機(jī)或者模擬器會(huì)自動(dòng)加載該工程抵乓,逐步模擬feature中所描述的行為伴挚,運(yùn)行結(jié)果如下靶衍,表示測(cè)試通過(guò)。
總結(jié)
BDD是一種以溝通為核心的敏捷軟件開(kāi)發(fā)方法茎芋,通過(guò)開(kāi)發(fā)者與產(chǎn)品既得利益者(或其代表)之間不斷的溝通颅眶,用一種雙方都能理解的語(yǔ)言來(lái)定義和明確features,這些features在將來(lái)既可以通過(guò)框架(如Calabash)來(lái)轉(zhuǎn)換成自動(dòng)化的測(cè)試用例败徊,又可以作為簡(jiǎn)化版的文檔以供查閱。
當(dāng)然掏缎,世界上沒(méi)有最完美的方法皱蹦,只有最適合自己的方法。BDD有一些很明顯的優(yōu)點(diǎn)眷蜈,比如可以確保開(kāi)發(fā)出來(lái)的產(chǎn)品更符合需求沪哺、縮短開(kāi)發(fā)階段結(jié)束之后的測(cè)試周期、features確定完后更高的開(kāi)發(fā)效率等酌儒;然而缺點(diǎn)也是昭然若揭的辜妓,即項(xiàng)目前期會(huì)有大量的時(shí)間消耗在逐一討論feature上面,本來(lái)程序員們?cè)陧?xiàng)目開(kāi)啟之后的第二周就可以開(kāi)始coding了忌怎,結(jié)果因?yàn)橛懻摷危苍S會(huì)拖到第三周甚至第四周之后才能開(kāi)始coding。不幸的是榴啸,對(duì)于目前的大多數(shù)互聯(lián)網(wǎng)公司來(lái)說(shuō)孽惰,尤其是初創(chuàng)型公司,時(shí)間就是生命鸥印。所以在使用BDD方法之前需三思而后行勋功,是相信磨刀不誤砍柴工還是更相信速度制勝。
本文作者:汪春建(點(diǎn)融黑幫)库说,點(diǎn)融資深軟件工程師狂鞋,從事Mobile開(kāi)發(fā)8年,熟悉Window Moblie ,Symbian ,Android 及iOS等移動(dòng)平臺(tái)軟件開(kāi)發(fā)潜的。喜歡研究新技術(shù)骚揍,業(yè)余時(shí)間會(huì)閱讀開(kāi)源代碼,學(xué)習(xí)優(yōu)秀的代碼風(fēng)格啰挪,編程思想疏咐,并將所學(xué)知識(shí)融入工作中,提高工作效率脐供。