Xunit
2006 年 1 月 17 日
XUnit 是廣為軟體開發人員所知的測試架構家族的統稱。此名稱源自於 JUnit, 這是第一個廣為人知的架構。
這些架構的起源實際上始於 Smalltalk。Kent Beck 是軟體開發核心中的自動化測試的忠實擁護者。為了幫助他和他客戶執行此項任務,他會建立一個簡單的架構來組織和執行單元測試。重點在於讓程式設計人員能夠使用其常規的 Smalltalk 環境輕鬆定義測試,然後快速執行子集或整組測試。Kent 和他的追隨者會在每次變更系統後執行單元測試,並在 Smalltalk IDE 中進行快速的編輯和測試循環。
我當時遇到了 Kent。我已經自己做過同樣的事情,但 Kent 的架構結合了荒謬的簡潔性和對我來說剛好的功能。基本上,他做得比我好,所以我直接使用他的架構。特別是我們在 C3 上使用此架構,Ron Jeffries 也在那裡認識了它。
我說「它」,但那其實是個錯誤的說法。並沒有單一的 kent-beck-smalltalk-unit-testing 架構。Kent 希望人們控制自己的環境,所以他喜歡讓每個團隊自行建構架構(只需幾個小時),這樣他們會很樂意根據自己的特定情況進行變更,這基本上是一個 種子工程。
它在 Smalltalk 社群外仍然不為人知,因此將推廣此概念的功勞歸於 JUnit 是公平的。JUnit 誕生於 1997 年從蘇黎世飛往亞特蘭大參加 OOPSLA 的航班上。Kent 與 Erich Gamma 同機,而兩個極客在長途飛行中除了編寫程式外還能做什麼?JUnit 的第一個版本就在那裡建置完成,採用結對程式設計,並先進行測試(一種令人愉悅的元循環極客行為)。我聽說了這件事並要求取得一份副本,這使我成為第一批 alpha 用戶之一。我毫不猶豫地更改我不喜歡的地方,並將一些貢獻寄回給 Kent 和 Erich。如果你想知道該怪誰讓斷言訊息成為第一個參數,而不是遵循 java 在結尾放置選用參數的慣例...
JUnit 也引入了紅/綠色進度條指示器。在 C3 中,一旦測試失敗,我們會將整個視窗設為紅色,如果全部通過,則設為綠色。在整合時,很容易在中央建置機器上看到視窗。JUnit 引入了將此作為進度條的方式,從而為軟體開發人員增加了一些新的詞彙。
JUnit 迅速竄紅,並對極端程式設計和測試驅動開發的成長運動至關重要。我在過去十年中見證了對測試態度的巨大轉變,而我認為 JUnit 在其中扮演了重要角色。由於小巧且簡單,它鼓勵人們學習和使用它。它也證明了它可以讓其他人擴充套件它並將它整合到工具中。(儘管我希望 Sun 能將所有東西打包到 JDK 中。)
隨著 JUnit 變得越來越流行,其他語言也想要一個。我記得 Michael Feathers 為 C++ 組合了 CppUnit,這可能是第一個移植。隨後出現了許多移植,幾乎每種語言都至少有一個 JUnit 移植。我想,它最終也作為一個真正的架構「移植」回 Smalltalk 是不可避免的。
這些移植各不相同。有些是原始 JUnit 的逐行改寫,幾乎沒有對目標語言做出讓步。第一版的 NUnit 甚至有一個「isVAforJava」方法,它源自 Visual Age for Java 的特殊處理。其他方法則更複雜:NUnit 2.0 因其在 C# 中使用屬性而受到 Anders Heljsberg 的讚揚,隨著 Java 開發註解,這種經驗已回饋給 Java 社群和 JUnit 本身。