測(cè)試驅(qū)動(dòng)開發(fā)與行為驅(qū)動(dòng)開發(fā)中的測(cè)試先行方法
2016-01-29 22:12:45 來源:Ben Linders ,譯者 陸志偉 評(píng)論:0 點(diǎn)擊:
Gil Zilberfeld將在 Agile Practitioners會(huì)議上舉辦小型研討會(huì),討論測(cè)試先行(test first)方法,測(cè)試驅(qū)動(dòng)開發(fā)(TDD)和行為驅(qū)動(dòng)開發(fā)(BDD)的基礎(chǔ)。
Test-First是一個(gè)很優(yōu)秀的工具。它能促進(jìn)團(tuán)隊(duì)內(nèi)更好的理解力和生產(chǎn)力。其結(jié)果是高質(zhì)量的代碼——無論是早期成功發(fā)現(xiàn) bug還是正確實(shí)現(xiàn)特性方面。
Agile Practitioners 2016會(huì)議將于1月26-27日在以色列特拉維夫舉行,InfoQ將會(huì)覆蓋本次會(huì)議的新聞,Q&As和文章。
(……)今年我們的主題是親身實(shí)踐敏捷。我們知道沒有老師能夠傳授親身體驗(yàn),因此我們舉辦了很多研討會(huì)和實(shí)用講座,會(huì)議參加者可以親身體驗(yàn)、聽到和看到敏捷活動(dòng)是如何在許多成功企業(yè)內(nèi)實(shí)施的。
InfoQ采訪了 Zilberfeld,關(guān)于測(cè)試先行方法的優(yōu)勢(shì),測(cè)試驅(qū)動(dòng)開發(fā)和行為驅(qū)動(dòng)開發(fā)概念,團(tuán)隊(duì)使用 BDD和 TDD的實(shí)例,以及如何在不編寫任何代碼的情況下探索 BDD和 TDD。
InfoQ:“測(cè)試先行”方法的優(yōu)勢(shì)是什么?
Zilberfeld:測(cè)試驅(qū)動(dòng)開發(fā)是從90年代末的極限編程從業(yè)者開始的。但事實(shí)上,人們?cè)诰帉懘a的數(shù)十年前已經(jīng)開始編寫測(cè)試了。
其理念是這樣的:當(dāng)程序員編寫代碼時(shí),他們通常在代碼中解決復(fù)雜問題。但是,這種方式常常使得結(jié)果同樣復(fù)雜,并且含有遠(yuǎn)遠(yuǎn)超過實(shí)際需要解決的問題(假設(shè)重要的東西已經(jīng)被編碼)。
這意味著需要測(cè)試更多的代碼。測(cè)試有時(shí)需要改變“已經(jīng)工作”的代碼,這會(huì)引入風(fēng)險(xiǎn)。最終導(dǎo)致要么根本沒有進(jìn)行測(cè)試,因?yàn)闆]有時(shí)間測(cè)試,或者是次優(yōu)的測(cè)試,因?yàn)闊o法覆蓋我們想要覆蓋的范圍。
測(cè)試先行定義了工作需求。因?yàn)槲覀冇袦y(cè)試形式的定義,它定義了為了解決具體問題我們需要編寫什么樣的代碼。僅僅通過運(yùn)行測(cè)試就可以非常簡(jiǎn)單地知道我們是否有可工作的功能。
這種方式會(huì)擴(kuò)大測(cè)試覆蓋率,因?yàn)闇y(cè)試成為優(yōu)先開發(fā)活動(dòng),而不會(huì)被迫推到最后。
另外,編寫這些測(cè)試和制定場(chǎng)景的時(shí)候,我們會(huì)更深入地探索問題空間,因?yàn)闀?huì)出現(xiàn)許多問題。而在事后測(cè)試(test after)中,有時(shí)不會(huì)發(fā)生這些討論,開發(fā)人員以他們的思維編碼,而不是以解決方案的需求編碼。
InfoQ:你能簡(jiǎn)單介紹一下行為驅(qū)動(dòng)開發(fā)(BDD)和測(cè)試驅(qū)動(dòng)開發(fā)(TDD)的概念嗎?
Zilberfeld:在 TDD和 BDD中,你先將問題分解成多個(gè)情境,也就是例子。我們的頭腦更容易專注小情境,而不善于解決大的、復(fù)雜的問題。
然后開始著名的紅-綠-重構(gòu)循環(huán),就像這樣:
- 編寫一個(gè)失敗的情境。失敗是因?yàn)榫幾g或者因?yàn)榇a不存在。無論如何,該測(cè)試是代碼如何被外部模塊使用的案例。
- 努力讓測(cè)試通過。重點(diǎn)是可工作的功能而不是形式,也就是編寫最小的實(shí)現(xiàn),讓它通過測(cè)試。更進(jìn)一步,它應(yīng)該通過迄今為止我們編寫的整個(gè)測(cè)試套件。
- 改進(jìn)代碼。現(xiàn)在一切都是綠色的,使用測(cè)試安全網(wǎng)我們可以重寫代碼。如果我們破壞了什么,我們會(huì)立即知道。
將問題分解成更小的部分,然后以增量的形式開發(fā)需要的代碼,并且在流程中加入急需的剎車。這有助于我們思考我們遺漏的情境,而不是“我們知道解決方案是什么樣子”。
BDD開始于2000年代中期,更進(jìn)一步地將 TDD推向產(chǎn)品空間。通過使用產(chǎn)品用途案例,我們可以僅僅開發(fā)情境所需的代碼。我們可以專注對(duì)業(yè)務(wù)重要的情境。然后可以使用 TDD編寫實(shí)際代碼。
BDD最大的優(yōu)勢(shì)是溝通。如果你將“三個(gè)同伴”——業(yè)務(wù)分析師、開發(fā)人員和測(cè)試人員——集中到一個(gè)房間,討論我們希望看到的行為案例,那么在編寫代碼之前,我們將會(huì)得到最好的提出和解決問題的觀點(diǎn)。
而這就是 BDD——討論商定的行為案例。這些案例可以寫成自動(dòng)化測(cè)試(但這不是要求),然后編碼使測(cè)試通過,最后重構(gòu)代碼。
顯然,BDD情境的詳細(xì)程度比更精細(xì)的 TDD測(cè)試還要寬泛。盡管我發(fā)現(xiàn)在某些方面它們是相互關(guān)聯(lián)的,但是在 TDD和 BDD情境中編寫測(cè)試還是需要不同的技能。
InfoQ:你有與合作團(tuán)隊(duì)使用 BDD和 TDD的案例嗎?
Zilberfeld:在 BDD中,由誰編寫情境是有區(qū)別的,但是我合作的大多數(shù)團(tuán)隊(duì)中,都是測(cè)試人員編寫情境。這些案例的討論通常在編寫代碼之前。測(cè)試人員和開發(fā)人員并行工作——測(cè)試人員專注高水平的自動(dòng)化測(cè)試,開發(fā)人員專注代碼和單元測(cè)試(測(cè)試優(yōu)先與否)。一旦完成就會(huì)對(duì)情境進(jìn)行評(píng)審。然后在某個(gè)時(shí)候?qū)﹂_發(fā)和測(cè)試進(jìn)行集成,以確保測(cè)試通過。
BDD和 TDD在迭代中非常“敏捷”,這使得情境“完成”與否非常的明顯。BDD情境要么“符合”迭代,要么就是故事過于冗長(zhǎng)。
在實(shí)現(xiàn)上 TDD稍有不同。培訓(xùn)之后,開發(fā)人員會(huì)對(duì)等待他們的代碼妥協(xié)。通常這些都是遺留代碼,這與干凈的測(cè)試先行代碼不同。
我常開玩笑說 TDD中最后一個(gè) D是紀(jì)律。因?yàn)樗鼘?duì)測(cè)試先行的實(shí)現(xiàn)最重要。它與我們被教導(dǎo)的不同也更難,因此在看到價(jià)值之前我們需要團(tuán)隊(duì)的支持。這就是為什么大部分團(tuán)隊(duì)最終不做 TDD,勉強(qiáng)接受事后測(cè)試的緣故。
熬過困難的前期之后,開始清理自己的代碼,添加更多的覆蓋率。代碼變得更加容易維護(hù)。并且從社會(huì)角度來看,新加入團(tuán)隊(duì)的開發(fā)人員會(huì)帶著“這就是我們的工作方式”理念加入 TDD。這是一個(gè)正面的反饋循環(huán)。
InfoQ:你能給 InfoQ讀者提前透露一下 Agile Practitioners會(huì)議上研討會(huì)的內(nèi)容嗎?以及向參會(huì)者展示如何在不編寫任何代碼的情況下探索 BDD和 TDD?
Zilberfeld:這次研討會(huì)背后還有一個(gè)故事。幾年前,我打算在比利時(shí) Testing Days會(huì)議上舉辦“TDD a spaceship”研討會(huì)(我打算三月在荷蘭的 Agile Testing Days會(huì)議上舉辦)。它是為開發(fā)人員設(shè)計(jì)的,但是參與者都是測(cè)試人員,擁有極少的編碼經(jīng)驗(yàn)。因此研討會(huì)變成解釋測(cè)試先行的理念,并且是在沒有實(shí)際編碼的情況下。很自然地,我被吸引到星球大戰(zhàn)的例子,我們交談、做課堂筆記,并討論了驗(yàn)收標(biāo)準(zhǔn),以及如何知道故事已經(jīng)完成。
那次研討會(huì)之后,我考慮如何以一種經(jīng)驗(yàn)的方式實(shí)現(xiàn)它。碰巧,我被介紹給GIF制作軟件工具,突然之間我們有了能夠幫助的工具。這是一個(gè)創(chuàng)建型工具,人們可以提前寫電影“腳本”,構(gòu)建并運(yùn)行,并能夠立即獲得反饋。
很棒的是我們可以應(yīng)用敏捷開發(fā)原則和經(jīng)驗(yàn)。因?yàn)槟闼胂蟮碾娪皹邮礁鷮?shí)際結(jié)果總是會(huì)有出入,所以我們構(gòu)建了一個(gè)新的版本。
另一個(gè)案例是處理遺留代碼。其中一個(gè)練習(xí)是在電影中更換演員,但是因?yàn)殡娪耙呀?jīng)編輯,因此我們只能在開頭或者結(jié)尾添加場(chǎng)景。鑒于需求與代碼不能分開考慮,如何更改需求與已經(jīng)構(gòu)建完成的代碼之間的沖突這一理念就非常有啟發(fā)性。
InfoQ:你同時(shí)還是agile practitioners會(huì)議的組織者之一,你能提前透露一下會(huì)議議程嗎?
Zilberfeld:這是我們第五年舉辦該會(huì)議,自創(chuàng)立以來無論是規(guī)模還是質(zhì)量都得到了提升。它被列為以色列最好的敏捷會(huì)議是因?yàn)椋?
我們圍繞“親身實(shí)踐”主題會(huì)議。我們將有全天的專題報(bào)告、小型研討會(huì),甚至演講都具有實(shí)際用途。我們旨在讓人們親身體驗(yàn),然后回歸工作,開始實(shí)施他們學(xué)到的內(nèi)容。
我們?yōu)椴煌愋偷膮⑴c者準(zhǔn)備了內(nèi)容——Scrum Master,測(cè)試人員,開發(fā)人員,產(chǎn)品經(jīng)理,團(tuán)隊(duì)領(lǐng)袖等任何你能夠想到的。但是,該會(huì)議不僅僅是拓寬你的角色知識(shí)。它是以一種“親身實(shí)踐”的方式讓你學(xué)習(xí)別人如何做的。
查看英文原文:Test First Approaches With Test Driven Development and Behavior Driven Development
相關(guān)熱詞搜索:test first TDD BDD 文化 & 方法 語言 & 開發(fā) Behavior Driven Development 協(xié)作 測(cè)試驅(qū)動(dòng)開發(fā) 重構(gòu) 團(tuán)隊(duì)工作 敏捷 測(cè)試 設(shè)計(jì)
上一篇:Facebook公布了可用于蘋果電視和手表的Parse SDK
下一篇:Facebook將關(guān)閉其移動(dòng)開發(fā)者平臺(tái)Parse

頻道總排行
- Cisco NetFlow v9為何無人問津?
- 技術(shù)專題:智能化運(yùn)維
- 開源代碼管理:如何安全地使用開源庫?
- Facebook架構(gòu)解讀
- IT運(yùn)維分析與海量日志搜索需要注意什么(1)
- 金山運(yùn)維肖力:如何將業(yè)務(wù)遷移到虛擬化環(huán)境并穩(wěn)定運(yùn)行(1)
- Apache Ignite(四):基于Ignite的分布式ID生成器
- CrazyEye,一款國(guó)人開源的堡壘機(jī)軟件(1)
- SDN時(shí)代的網(wǎng)絡(luò)管理系統(tǒng)會(huì)走向何方
- WOT2016吳兆松:Zabbix監(jiān)控自動(dòng)化的未來如何發(fā)展
頻道本月排行
- 8你消費(fèi)我買單——"漏洞"天使OneRASP...
- 7有了Jenkins,為什么還需要一個(gè)獨(dú)立...
- 6IT運(yùn)維分析與海量日志搜索需要注意什么(1)
- 5新浪微博王傳鵬:微博推薦架構(gòu)的演進(jìn)(1)
- 4史上最大機(jī)器學(xué)習(xí)數(shù)據(jù)集,雅虎對(duì)外開...
- 4雅虎開源可以提升流操作速度的DataSketches
- 4大眾點(diǎn)評(píng)高可用性系統(tǒng)運(yùn)維經(jīng)驗(yàn)分享
- 4云運(yùn)維如何選擇部署適合自身的IDC和...
- 4開源還是商用?十大云運(yùn)維監(jiān)控工具測(cè)...
- 4論開發(fā)與運(yùn)維沖突的根源、表現(xiàn)形式及...