測試驅動(dòng)開(kāi)發(fā)(TDD)是一種開(kāi)發(fā)方式,它改變了傳統軟件開(kāi)發(fā)的流程,即首先設計程序,再進(jìn)行編碼與測試工作。TDD采取了很小的增量式開(kāi)發(fā)方式:首先編寫(xiě)一個(gè)測試,再編寫(xiě)實(shí)際程序代碼以通過(guò)測試,最后對代碼進(jìn)行改進(jìn)。這種方式的結果是大量的(通??蛇_到幾千個(gè))自動(dòng)化測試,能夠在幾秒鐘之內執行完畢。
測試人員需要注意到一點(diǎn),這些高效的自動(dòng)化單元測試剔除了大多數手工測試的執行。這樣一來(lái),我們就需要重新反思是否有必要在TDD團隊中繼續保留測試人員的角色。
從表面上看,無(wú)論是否采用TDD,“測試人員”都是團隊中必不可少的角色,但實(shí)際情況要復雜得多,現在讓我們來(lái)看看這些復雜性體現在何處:
如果你打算開(kāi)始嘗試TDD,那么建議你不要試圖在團隊中揉合老派的QA與功能測試人員。
如果你已經(jīng)成功地實(shí)施了TDD,那么在團隊中安排一位專(zhuān)攻測試的成員仍然是有意義的。
在TDD中團隊中能夠取得成功的測試人員與傳統的功能測試人員的區別在于,前者具有更扎實(shí)的技術(shù)背景。
QA的興衰
在對“ TDD已死? ”這一主題所展開(kāi)的一次對話(huà)中,Kent Beck(KB)、Martin Fowler(MF)與David Heinemeier Hansson(DHH)圍繞著(zhù)QA與測試展開(kāi)了激烈的討論。他們指出了專(zhuān)職測試人員歷史的3個(gè)發(fā)展階段:
堆積QA:通常指機能失調的QA部門(mén),其中充斥著(zhù)大量的功能測試人員。
摒棄QA:對于讓程序員負責測試的做法過(guò)于自信,在開(kāi)發(fā)過(guò)程中摒棄測試人員。
當前現狀:在項目中引入適當的QA(甚至是功能性的)仍是有必要的。
流行于上世紀90年代的堆積QA的做法現在看來(lái)似乎已經(jīng)過(guò)時(shí)了,許多IT組織已經(jīng)解散了他們的QA部門(mén),并將測試人員分派到各個(gè)敏捷團隊中。不過(guò),在許多敏捷團隊中,這些測試人員仍在繼續著(zhù)早期的手工測試任務(wù)。眾多組織仍然受困于延續自20年前的機能失調的測試方法。
老派的QA方式之所以出現機能失調的情況,是因為這種方式依賴(lài)于大量的功能測試人員。這些測試人員是手工測試方面的專(zhuān)家,但對于技術(shù)方面的技能知之甚少。測試人員的專(zhuān)業(yè)性決定了他們擅長(cháng)于對功能的“測試”。但是,老派的QA部門(mén)更傾向于(同時(shí)也出于商業(yè)利益的考慮)讓這些測試人員對功能進(jìn)行“檢查”。
“檢查”的主要特點(diǎn)在于:這種測試 完全 可以實(shí)現 自動(dòng)化 (Bach 與Bolton 2013)。這就意味著(zhù)“檢查”功能可以由程序員完成。至于是應該讓測試人員還是程序員進(jìn)行功能“檢查”,這種選擇貌似隨意,其實(shí)不然:無(wú)論是發(fā)現 bug、進(jìn)行隔離、匯報、跟蹤或是提出修復意見(jiàn),測試人員都要花費更多的時(shí)間(Kaner 2001)。
通過(guò)手工測試人員對功能進(jìn)行“檢查”的方式讓老派的QA變得非常低效。一旦團隊培養出“不要測試自己的代碼,把它丟給QA去做”這種觀(guān)念,測試工作就變得機能失調了(KB與DHH在這次對話(huà)中的觀(guān)點(diǎn))。這種方式發(fā)展到一定程度,就會(huì )造成效率的不斷下降,隨著(zhù)投入的測試人員越多,反而會(huì )造成bug數量的不斷升高。('Better Testing - Worse Quality',Hendrickson 2001)
摒棄QA是對于手工測試這種機能失調的實(shí)踐的一種自然反應。之所以本文的標題沒(méi)有取名為“敏捷團隊中的測試人員”,是因為摒棄QA的做法在某些情況下并不可行,比如你的敏捷團隊雖然實(shí)施了Scrum框架,卻沒(méi)有進(jìn)行任何自動(dòng)化單元測試,又或是團隊正在進(jìn)行某些商業(yè)現成品或技術(shù)(COTS)的軟件開(kāi)發(fā)。如果團隊中沒(méi)有設立功能測試人員,則必須實(shí)施TDD實(shí)踐,或是其他任何一種能夠生成自動(dòng)化單元測試的方法。
在大多數情形下,選擇了TDD就意味著(zhù)你必須改變程序員的技能、習慣,并且往往還需要改變他們的態(tài)度與自我意識。而實(shí)現以上這幾點(diǎn)并不容易,同時(shí) TDD本身也并非可以一促而就的:“要很好地掌握遺留代碼、對單元測試進(jìn)行適當的隔離、以及集成測試是非常困難的”(Shore 2007)。根據評估,當程序員轉為采用TDD實(shí)踐后,前幾個(gè)月的生產(chǎn)力會(huì )急劇下降。不僅如此,對實(shí)踐TDD的新手往往要進(jìn)行幾周乃至幾個(gè)月時(shí)間進(jìn)行手把手的培訓(Larman,Vodde 2008)。
依我的經(jīng)驗看來(lái),老派的程序員與測試人員之間往往存在著(zhù)一種共生現象。老派的程序員不喜歡進(jìn)行單元測試,只要項目中有測試人員,他們就企圖蒙混過(guò)關(guān)。而老派的測試人員也不愿意學(xué)習技術(shù)知識,只要為程序員找到了足夠的bug,他們也同樣選擇應付了事。老派的程序員與測試人員都希望避免進(jìn)行任何改變。因此,在我看來(lái),如果程序員已經(jīng)開(kāi)始實(shí)施TDD實(shí)踐,再往團隊中安置一個(gè)功能測試人員就是一個(gè)壞主意。
原文轉自:http://www.infoq.com/cn/articles/testers-TDD-teams