2010年7月2日,Roy Osherove 和 Kent Beck 在 blog.typemock.com 進(jìn)行了一次對(duì)話,話題涉及單元測(cè)試(Unit Testing),JUnit Max(Kent 開發(fā)的一個(gè)單元測(cè)試的 Eclipse Plugin,不免費(fèi)),和面向初創(chuàng)企業(yè)的精益方法(Lean Startups)。
單元測(cè)試和 JUnit Max
作為軟件開發(fā)方法學(xué)的大師、極限編程XP的創(chuàng)始人、敏捷宣言的創(chuàng)始人之一,Kent Beck 一直在努力最大化地利用單元測(cè)試的價(jià)值,他說(shuō)一些程序員仍然認(rèn)為單元測(cè)試并不是他們的工作,但是單元測(cè)試確實(shí)能夠提高軟件的質(zhì)量。目前他正在開發(fā) JUnit Max,這是一個(gè) Eclipse plugin,每當(dāng)程序員保存一個(gè) Java 源文件的時(shí)候,JUnit Max 就會(huì)運(yùn)行測(cè)試并報(bào)告反饋信息。測(cè)試中的錯(cuò)誤將會(huì)如同編譯錯(cuò)誤一樣被報(bào)告給程序員。JUnit Max 的核心思想是測(cè)試錯(cuò)誤應(yīng)該和編譯錯(cuò)誤一樣被 IDE 報(bào)告給程序員,程序員不需要額外的菜單選項(xiàng)或者運(yùn)行其他的工具來(lái)運(yùn)行測(cè)試。特別是那些經(jīng)常失敗的測(cè)試,對(duì)于程序員來(lái)說(shuō)是非常有價(jià)值的反饋信息。在測(cè)試驅(qū)動(dòng)開發(fā)(Test Driven Development – TDD)中,我們重復(fù)著這樣一個(gè)循環(huán):“編寫一個(gè)‘失敗’的測(cè)試(Failing Test)” – “編碼實(shí)現(xiàn)功能以便讓測(cè)試通過(guò)”,隨著開發(fā)的深入,測(cè)試越來(lái)越豐富,測(cè)試能夠反饋給程序員的信息也越來(lái)越多,它們可以幫助程序員找出那些需要改進(jìn)的代碼。JUnit Max 能夠縮短這個(gè)循環(huán)的周期,因?yàn)樗鼮轭l繁地運(yùn)行測(cè)試和提供反饋。Roy 問(wèn)道:“當(dāng)你一個(gè)人編碼的時(shí)候,你是否嚴(yán)格地遵循 TDD,即一定要先寫測(cè)試,然后寫實(shí)現(xiàn)代碼。我個(gè)人發(fā)現(xiàn)這并不是一件容易做到的事情,特別是當(dāng)一個(gè)人編碼的時(shí)候。” Kent 回答:“視情況而定,有時(shí)候并不需要死板地遵循 TDD,比如當(dāng)我在做一些探索性或者說(shuō)實(shí)驗(yàn)性的編碼時(shí),并不需要寫測(cè)試,因?yàn)槲抑皇窍雵L試一下某些功能和特性。”
Roy: “你在測(cè)試驅(qū)動(dòng)開發(fā)中見過(guò)的最糟糕的錯(cuò)誤有哪些?”
Kent:“很多程序員僅僅是拷貝和粘貼測(cè)試代碼,但并不理解它們。所以我們經(jīng)常能看到?jīng)]有斷言的測(cè)試,同時(shí)測(cè)試很多邏輯和功能的測(cè)試,過(guò)于臃腫或者過(guò)于短小的測(cè)試等等。當(dāng)然這些錯(cuò)誤在學(xué)習(xí)過(guò)程中很普遍,也是我們學(xué)習(xí)的一部分。”
Roy:“你下一步最想嘗試的新概念是什么?”
Kent:“我最近談?wù)摰囊粋€(gè)主題是 Software G Forces,是關(guān)于軟件產(chǎn)品的部署頻率(Frequency of Deployment),這里的部署是指面向最終用戶的部署或者說(shuō)發(fā)布,是生產(chǎn)環(huán)境而非測(cè)試環(huán)境。從前的軟件產(chǎn)品每年(或數(shù)年)發(fā)布一個(gè)新的版本,而現(xiàn)在的軟件產(chǎn)品發(fā)布頻率越來(lái)越快,從每季度,每月,每周,每天,直至每小時(shí)。Kent 提及有一些非常復(fù)雜的軟件產(chǎn)品的發(fā)布頻率甚至是每天 40 到 50 次。此時(shí) Roy 提出了一個(gè)非常好的問(wèn)題:“產(chǎn)品發(fā)布得如此頻繁,我們?nèi)绾文軌蛟谶@么短的時(shí)間間隔內(nèi)獲得用戶反饋呢?”,Kent 回答道:“持續(xù)部署(Continuous Deployment)確實(shí)需要一些基礎(chǔ)設(shè)施建設(shè)來(lái)支持,比如:自動(dòng)版本回滾,自動(dòng)錯(cuò)誤檢測(cè),系統(tǒng)同時(shí)運(yùn)行多個(gè)版本的能力,比如一個(gè)服務(wù)器集群中不同的服務(wù)器上可以運(yùn)行產(chǎn)品的不同版本。”
Roy 問(wèn)道:“當(dāng)你在開發(fā)一個(gè)產(chǎn)品的時(shí)候,你在為客戶創(chuàng)造價(jià)值,而持續(xù)部署創(chuàng)造的則是一種內(nèi)在的價(jià)值,并且實(shí)施過(guò)程也是非常復(fù)雜的,你怎樣投入時(shí)間去實(shí)施它呢?是否需要從產(chǎn)品設(shè)計(jì)的一開始就考慮這些問(wèn)題呢?”,Kent 答道:“5 年之內(nèi)市場(chǎng)上可能會(huì)有許多持續(xù)部署的產(chǎn)品出現(xiàn),目前我們可能需要自己來(lái)尋求解決方案,因?yàn)楝F(xiàn)在它還是一個(gè)較新的領(lǐng)域。持續(xù)部署的重點(diǎn)之一是及時(shí)捕獲系統(tǒng)錯(cuò)誤,不僅僅是技術(shù)層面上的錯(cuò)誤,同時(shí)也包括業(yè)務(wù)層面。以 Amazon.com 為例,他們?cè)u(píng)價(jià)系統(tǒng)運(yùn)行的良好程度是以業(yè)務(wù)運(yùn)營(yíng)狀況為依據(jù)的,如果銷售額出現(xiàn)不明原因的下降,系統(tǒng)也會(huì)發(fā)出錯(cuò)誤警告。”
注:為了不讓文章過(guò)長(zhǎng),下半部分的面向初創(chuàng)企業(yè)的精益方法(Lean Startups)將在后面發(fā)布。