2010年為《程序員》雜志寫(xiě)了一篇《敏捷測(cè)試的方法和實(shí)踐》,我們可以回過(guò)頭來(lái),看看過(guò)去的一年,敏捷測(cè)試發(fā)生了哪些變化。首先,我做了一個(gè)實(shí)驗(yàn),分別打開(kāi)2010年和2011年的“STAREAST Conference at-a-Glance”,輸入Agile,2010年顯示10個(gè)結(jié)果,而2011年顯示17個(gè)結(jié)果,有一個(gè)很大的增長(zhǎng),說(shuō)明敏捷測(cè)試越來(lái)越引起大家的關(guān)注。這只是一個(gè)表面的現(xiàn)象,我們還需要真正了解發(fā)生了哪些實(shí)質(zhì)性的變化。


  舉一個(gè)例子,《敏捷測(cè)試:測(cè)試人員和測(cè)試團(tuán)隊(duì)的實(shí)踐指南》的作者Lisa Crispin在StarEast 2011上有一個(gè)演講??Agile Testing: After the First Year, What’s Next? 其中提到,我們從傳統(tǒng)開(kāi)發(fā)方法轉(zhuǎn)向敏捷方法,由于開(kāi)發(fā)人員掌握了測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD,Test Driven Development),而測(cè)試人員部分地實(shí)現(xiàn)了驗(yàn)收測(cè)試和回歸測(cè)試的自動(dòng)化,所以我們活下來(lái)了,但我們?cè)诮酉聛?lái)深入實(shí)施敏捷測(cè)試時(shí),還會(huì)面臨新的挑戰(zhàn),甚至要克服更大的困難。當(dāng)測(cè)試人員有了一年的經(jīng)驗(yàn),并擁有了敏捷方法的價(jià)值觀(guān)、原則和實(shí)踐之后,我們還不得不考慮如何不斷改進(jìn)持續(xù)的發(fā)布、如何有效地管理技術(shù)債務(wù)、如何對(duì)客戶(hù)的需求有更好的理解,這要求我們掌握更深的敏捷測(cè)試技術(shù),例如將“精益(Lean)方法”用于改進(jìn)敏捷測(cè)試的績(jī)效,以及重構(gòu)自動(dòng)化測(cè)試的設(shè)計(jì)或腳本以提高投入產(chǎn)出比。

 

  TDD 向ATDD、BDD轉(zhuǎn)化?

  以前人們談到敏捷方法,會(huì)談到TDD或UTDD(Unit TDD),但是究竟有多少個(gè)公司在采用TDD方法來(lái)寫(xiě)代碼?而在采用TDD開(kāi)發(fā)方法的公司中,又有多少程序員在全面使用TDD方法呢?TDD是一個(gè)糾結(jié)的問(wèn)題。一方面,TDD的確是一個(gè)好東西,先寫(xiě)測(cè)試用例、后寫(xiě)代碼,保證程序員第一次把代碼寫(xiě)對(duì),也徹底解決了代碼的可測(cè)試性問(wèn)題,在代碼層次上把缺陷的預(yù)防做到淋漓盡致。另一方面,多數(shù)項(xiàng)目很緊張,不可能給程序員足夠時(shí)間去實(shí)施TDD,程序員對(duì)實(shí)現(xiàn)有極大興趣,而對(duì)測(cè)試缺乏興趣,多數(shù)程序員也不愿意或不會(huì)主動(dòng)去做TDD。這樣,TDD實(shí)踐還存在較大困難,有比較多的爭(zhēng)議。我看到一位作者寫(xiě)道:組里頭TDD說(shuō)了3年,據(jù)我所知,看完兩本TDD名著,并堅(jiān)持寫(xiě)單元測(cè)試的人只有我一個(gè)(我組里有開(kāi)發(fā)人員15名)。



  圖1 TDD和ATDD之間的關(guān)系 為了解決TDD實(shí)施不力,在過(guò)去一年,越來(lái)越多的人關(guān)注ATDD,即驗(yàn)收測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(Acceptance Test Driven Development)。從2003年開(kāi)始,人們逐漸實(shí)踐TDD,而ATDD 是在2007年Lasse Koskela寫(xiě)了一本書(shū)《測(cè)試驅(qū)動(dòng):Java開(kāi)發(fā)人員的TDD和ATDD》 ,才開(kāi)始引起大家的更多關(guān)注。從那時(shí)算起也有四年了,但在國(guó)內(nèi),則是近一兩年的事。當(dāng)然,我們可以將TDD和ATDD結(jié)合起來(lái)使用,形成一種混合的方法模型。TDD和ATDD之間的關(guān)系,可以用圖1來(lái)描述。

 

  接著,BDD(行為驅(qū)動(dòng)開(kāi)發(fā),Behavior Driven Development)也開(kāi)始大行其道,那BDD是不是“做得比較好的TDD”呢?概念越來(lái)越多,概念的界限難以確定,BDD可以看成ATDD的延伸,只是BDD更強(qiáng)調(diào)用戶(hù)的視角、用戶(hù)的行為,為ATDD注入了“Given,When,Then”這樣特定的需求描述語(yǔ)言。2009年,BDD創(chuàng)始人在倫敦發(fā)表的“敏捷規(guī)格、BDD和極限測(cè)試交流”中,對(duì)BDD給出了如下定義:

  BDD是第二代的、由外及內(nèi)的、基于拉動(dòng)的(pull)、多方利益相關(guān)者的(stakeholder)、多尺度的、高度自動(dòng)化的敏捷方法。它描述了一個(gè)交互循環(huán),可以具有帶有良好定義的輸出(即工作中交付的結(jié)果):已測(cè)試過(guò)的軟件。


  但這個(gè)定義看起來(lái)還不夠好,至少讓我們明白起來(lái)還有一定的困難。實(shí)際上,BDD具有自己特定的“Given,When,Then”行為描述語(yǔ)言,和敏捷的user story極為吻合。所以“Given,When,Then” 行為描述語(yǔ)言才是BDD顯著的特征。


  TDD在寫(xiě)測(cè)試用例時(shí),常常會(huì)提出“我們應(yīng)該先測(cè)什么”,然后針對(duì)測(cè)試的條件來(lái)填充代碼,而B(niǎo)DD則試圖換一種方式去思考問(wèn)題,即問(wèn)自己“預(yù)期的行為是什么?”,可能會(huì)寫(xiě)出結(jié)構(gòu)更好的代碼。說(shuō)到底,BDD更關(guān)注客戶(hù)的需求,通過(guò)了解客戶(hù)的不同行為,對(duì)客戶(hù)的需求有更深刻的理解,從而借助對(duì)需求逐漸深入的理解來(lái)驅(qū)動(dòng)軟件開(kāi)發(fā)。

  TDD更重要的價(jià)值是其思想,像傳統(tǒng)的制造業(yè),一定是先知道產(chǎn)品的質(zhì)量標(biāo)準(zhǔn)或驗(yàn)收標(biāo)準(zhǔn)之后,才去設(shè)計(jì)、制造。從這個(gè)思想來(lái)看,TDD、ATDD和BDD都是一樣的。不一樣的是其具體的操作方法或?qū)嵺`,我們可以說(shuō),ATDD和BDD有一定的進(jìn)步,但還沒(méi)有到達(dá)完美的地步,還有提升的空間。在未來(lái),首先是如何靈活結(jié)合BDD、ATDD和TDD來(lái)構(gòu)成一個(gè)測(cè)試體系,是一個(gè)發(fā)展方向;其次,是在BDD、ATDD和TDD根本的、共同的思想基礎(chǔ)上,構(gòu)成一個(gè)全新的、更完善的敏捷測(cè)試框架。后者的可能性更大。

  探索式測(cè)試的地位

 

  在過(guò)去一兩年,在敏捷方法中探索式測(cè)試(Exploring Test,ET)也是一個(gè)熱門(mén)話(huà)題,甚至有些人想用探索式測(cè)試來(lái)代替?zhèn)鹘y(tǒng)的用例測(cè)試(case-based test)或腳本測(cè)試(scripted test),走向另一個(gè)極端。探索式測(cè)試是對(duì)用例測(cè)試的補(bǔ)充,在非敏捷開(kāi)發(fā)方法中也可以使用。只是在非敏捷開(kāi)發(fā)方法中,有較為嚴(yán)格的需求規(guī)范和設(shè)計(jì)文檔,有充分的時(shí)間去設(shè)計(jì)足夠的測(cè)試用例,探索式測(cè)試只是作為一種輔助的手段發(fā)現(xiàn)一些隱藏很深的缺陷,并成為一種產(chǎn)品學(xué)習(xí)的工具以完善測(cè)試用例。然而,在敏捷測(cè)試中,由于迭代快、需求變化相對(duì)頻繁,缺乏詳細(xì)的需求描述文檔和足夠的設(shè)計(jì)描述文檔,探索式測(cè)試發(fā)揮更大的作用,甚至在新功能測(cè)試中發(fā)揮決定性的作用。需要提醒的是,在敏捷測(cè)試中,回歸測(cè)試應(yīng)該仍然以用例測(cè)試為主,可以這樣說(shuō),回歸測(cè)試還是百分之百的用例測(cè)試。

  探索式測(cè)試,實(shí)際早在1984年由James Bach和Cem Kaner提出來(lái),但為什么直到近幾年才比較熱呢?這主要得益于敏捷開(kāi)發(fā)方法的興起,而敏捷開(kāi)發(fā)方法的興起又得益于互聯(lián)網(wǎng)應(yīng)用的迅速擴(kuò)張。大家都知道,互聯(lián)網(wǎng)應(yīng)用越來(lái)越普遍,競(jìng)爭(zhēng)越來(lái)越激烈,迫切要求互聯(lián)網(wǎng)應(yīng)用產(chǎn)品發(fā)布要快,再加上許多互聯(lián)網(wǎng)產(chǎn)品的開(kāi)發(fā),都極具創(chuàng)新性、摸著石頭過(guò)河,其需求不明確,要求開(kāi)發(fā)周期短,頻繁發(fā)布新的版本,及時(shí)獲得市場(chǎng)和用戶(hù)的反饋,不斷修正以更好地滿(mǎn)足用戶(hù)的需求。針對(duì)被測(cè)對(duì)象,所掌握的信息不夠充分的情況下,探索式測(cè)試是一種很有效的測(cè)試方法。而且,把測(cè)試過(guò)程寫(xiě)下來(lái)(腳本化)需要時(shí)間,在敏捷測(cè)試中,時(shí)間顯得更為珍貴。如果需求變化快,腳本化的測(cè)試用例維護(hù)成本也過(guò)高、甚至是極大的浪費(fèi)。探索式測(cè)試的倡議者還認(rèn)為,測(cè)試執(zhí)行過(guò)程應(yīng)該是智力活動(dòng)的過(guò)程,這一過(guò)程越善于思考、越流暢,我們?cè)接袡C(jī)會(huì)發(fā)現(xiàn)缺陷。而用例測(cè)試方法,有太多的停頓、不夠流暢,會(huì)破壞這一過(guò)程。