敏捷聯盟Gordon Pask獎獲得者講“測試驅動開發”(TDD)

hzbook2008發表於2010-07-22
 

測試驅動的物件導向軟體開發(預訂中,估價)

《測試驅動的物件導向軟體開發》 前言

原書名:Growing Object-Oriented Software, Guided by Tests

作者:Steve Freeman  Nat Pryce(敏捷聯盟Gordon Pask獎獲得者,Mock技術早期創始人)


這本書是講什麼的

 

這是一本實踐指南,介紹了我們發現的編寫物件導向軟體的最好方式:測試驅動開發(test driven development,TDD) 。它描述了我們遵循的過程、追求的設計原則,以及使用的工具。它以我們數十年的經驗為基礎。在這些年裡,我們與世界上一些最好的程式設計師共事,向他們學習。

本書討論了一些問題與困惑,它們是我們在一個個專案中所見到的。如何將測試驅動開發應用到軟體專案中?我從哪裡開始?為什麼我應該既編寫單元測試,又編寫使用者場景測試?測試“驅動”開發是什麼意思?如何測試某個難弄的特徵?

本書同時也著重討論了設計,以及設計方式對TDD方式所產生的影響。如果說我們從中學到了什麼,那就是測試驅動開發作為一個整體時,效果最好。我們曾看到過一些團隊雖然採用了一些基本實踐(編寫並執行測試),但他們仍不得要領,因為他們並沒有採用背後更深層次的過程。

為什麼“培育”物件導向軟體

本書使用“培育”(Growing)這個詞是因為它讓人們感覺到開發是增量式的。我們在任何時候都有可以工作的軟體,確保程式碼總是儘可能地具備良好的結構,並經過全面的測試。任何事情都不比交付可以工作的系統更有效。正如John Gall在[Gall03]中所寫的,“能工作的複雜系統總是從能工作的簡單系統演進而來的。”

“培育”也暗示了一個在好的軟體中發現的生物學特點,即在每一層結構中一致的感覺。它將我們的方式與物件導向結合起來,正好與Alan Kay的觀點一致,即物件像生物細胞一樣彼此傳送訊息。

為什麼要以測試為“指導”

我們先寫測試,因為我們發現這有助於寫出更好的程式碼。先寫一個測試迫使我們澄清自己的意圖,只有無二義地描述了應該做什麼以後,我們才會開始下一步的工作。先寫測試的過程幫助我們發現設計是否太僵硬或沒有關注要點。然後,當我們希望繼續下一步工作並修復設計缺陷時,測試可以提供迴歸覆蓋測試構成的安全網。

本書使用“指導”(Guided)這個詞,是因為此項技巧仍然需要使用者的技能和經驗。我們發現測試驅動開發是一種有效的設計支援工具——只要我們學會如何增量式地開發並“聆聽測試”。像其他正規的設計活動一樣,TDD需要理解和持續的努力才有效。

我們曾發現一些團隊同時編寫測試和程式碼(甚至有一些團隊先寫測試),他們的程式碼仍然一團糟,測試只是增加了維護的成本。他們已經起步,但還沒有明白這種技巧是要讓測試來指導開發。利用測試的內容,將關注點放在取得進展上,並利用測試的反饋來提升系統的品質。

什麼是模擬物件

編寫本書最初的動機是完整解釋使用模擬物件(Mock Object)的技術,我們看到這種技術常被人誤解。隨著寫作的深入才意識到,我們社群對模擬物件的發現和使用實際上體現了我們寫軟體的方式。這是大局觀的一部分。
本書將利用jMock庫來展示模擬物件是如何工作的。更具體地說,我們將展示模擬物件應該用於TDD過程的什麼位置,以及它在物件導向開發的環境中具有怎樣的意義。


這本書為誰而寫

這本書是為“有一定知識的讀者”而寫的。它的目標讀者是具有專業經驗的開發者,他們至少曾看過測試驅動開發。 在編寫時,我們假設是向一些以前未接觸過這些技術的同事進行解釋。

為了留出篇幅以介紹更深入的內容,我們假定讀者具備有關基本概念和工具的一些知識。別的一些書對TDD進行了很好的介紹。

這是一本Java書嗎

本書從頭到尾使用Java語言,因為它非常普及,我們希望讀者至少能理解這些例子。也就是說,本書實際上是在介紹任何物件導向環境都適用的一組技巧。

如果您目前不用Java,在許多其他語言中也有與我們使用的測試和模擬庫(JUnit和jMock)等價的類庫。這些語言包括C#、Ruby、Python、Smalltalk、Objective-C,以及(令人印象深刻的) C++。甚至還有更少見的語言的版本,如Scala。在Java中,也有其他的測試框架和模擬框架。

為什麼您要聽信我們

《測試驅動的物件導向軟體開發》 彙集了我們幾十年的經驗,包括近十年的測試驅動開發。在這段時間裡,我們在各種專案中使用TDD。這些專案包括:面向訊息的大型企業整合系統(具有互動式Web前端和多處理器計算網格後端)、微型嵌入式系統(必須執行在幾十KB的記憶體中)、用作關鍵業務系統廣告的免費遊戲、後端中介軟體和網路服務(支援高度互動的圖形桌面應用)。而且,我們為世界各地的會議和公司講授這些內容。

我們也從同事的經驗中獲益,他們來自倫敦的TDD社群。我們花了不少工作時間和業餘時間讓思想接受挑戰和磨鍊。我們很感謝能有機會與這樣活躍的(善於爭論的)同事一起工作。

本書有些什麼內容

這本書有五個部分:

第一部分“簡介”,是在軟體開發專案背景下,對測試驅動開發、模擬物件和麵向物件設計的高層次的介紹。同時也介紹了本書其他部分中用到的一些測試框架。即使您已經熟悉TDD,仍然建議您通讀第1章和第2章,因為它們描述我們進行軟體開發的方法。如果您熟悉JUnit和jMock,您也許願意跳過簡介的其他部分。

第二部分“測試驅動開發過程”,描述了TDD過程,展示瞭如何開始開發,並讓開發進行下去。我們深入探討了測試驅動開發和麵向物件程式設計之間的關係,說明了這兩種技術的原理是如何相互支援的。最後,我們討論瞭如何處理外部程式碼。這一部分介紹了概念,下一部分將這些概念投入實戰。

第三部分“工作的例子”,是一個擴充套件的例子,讓您初步體驗一下以測試驅動的方式來開發物件導向應用。在整個過程中,我們討論了一些折中和做決定的動機。這個例子相當長,因為我們希望說明TDD的某些特徵是怎樣隨著程式碼規模的擴大變得更為重要的。

第四部分“可持續的測試驅動開發”,描述了一些保持系統可維護的實踐。我們現在非常注意保持程式碼整潔和富有表現力,因為這些年來,我們已經瞭解了程式碼變差的代價。這部分描述我們採用的一些實踐,並解釋了為什麼這麼做。

第五部分“高階主題”,探討了TDD更難的一些方面:複雜的測試資料、永續性和併發性。我們展示了處理這些問題的方法,並討論了這對程式碼的設計和測試所產生的影響。

最後,附錄包含了關於jMock和Hamcrest的一些支援材料。

本書不包含什麼內容

這是一本技術書籍。我們不討論使專案成功的其他主題,如團隊組織、需求管理和產品設計。採用增量式的、測試驅動的方法來開發顯然與專案運作的方式有著密切的關係。TDD支援一些新的活動,例如頻繁交付;它也會被一些組織環境破壞,例如早期設計凍結或利益相關人之間缺乏溝通。同樣,有許多其他書籍討論這些主題。

作者簡介

Steve Freeman是一名獨立諮詢師,擅長領域是敏捷軟體開發(http://www.m3p.co.uk)。他與Nat Pryce一同贏得了2006年敏捷聯盟的Gordon Pask獎。他是倫敦極限星期二俱樂部(London Extreme Tuesday Club)的建立成員,也是第一任倫敦XP日(London XP Day)的主席,還經常在國際會議上擔任組織者和演講者。Steve曾在各種型別的組織中工作過,從為IBM開發完整零售版軟體,到為大的研究實驗室開發原型。Steve擁有劍橋大學的哲學博士學位,並擁有統計和音樂學位。Steve居住在英國倫敦。

Nat Pryce在帝國理工學院取得博士學位之後,Nat Pryce加入了.com風潮,剛好看到泡沫破滅。從那時起,他就在許多不同的行業(包括體育新聞報導、市場營銷傳播、零售、電信和金融業)中當程式設計師、架構師、培訓師和諮詢師。他也曾參加學術研究專案,偶爾在大學任教。作為XP的早期採用者,他編寫了一些支援TDD的開放原始碼庫,對一些庫作出了貢獻,他也是倫敦XP日(London XP Day)的發起組織者之一。他也經常在國際會議上發表演講。Nat居住在英國倫敦。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16502878/viewspace-668714/,如需轉載,請註明出處,否則將追究法律責任。

相關文章