NUnit 3引入擴展能力與并行執行特性
.NET測試框架 NUnit最近推出了版本3 ,其中引入了并行執行與擴展能力。Charlie Poole作為NUnit的維護者已超過10年了,InfoQ與Charlie進行了一次訪談,以了解這次發布的更多內容。
InfoQ:在經過了兩年時間的開發,推出了5個alpha版本,5個beta版本和2個發布候選版本之后,最終版本終于在上個月正式發布了。作為一個主要的版本更新,新版本的主要目標有哪些?
Charlie Poole:在回答這一問題之前,我首先必須說的是,這個版本的開發時間比預想中長了很多,尤其是基于已發布的alpha和beta版本來看。我在 2007年于馬德里舉辦的Mono Summit會議上第一次向公眾透露了關于NUnit 3.0的想法。Mono的開發者們確實是非常優秀的聽眾,他們為我提出了許多優秀的點子。平心而論,在當時看來,Mono的開發者們比起整個.NET社區更能夠拓展他們的思維。
NUnit如今已經經歷了十五個年頭了。基本上,這次發布的目標是為了讓NUnit為今后10年的發展做好準備。在2002年時推出的NUnit 2.0經過了全部的重寫,而新版本則是我們第二次經過代碼的全部重寫。所謂的主要版本,就是要這樣劇烈的改變。
為了讓NUnit能夠繼續發展,在我看來,它必須變得更為模塊化。我們希望它能夠變成一個真正的測試平臺,而不僅僅是一個框架而已。但同時,如果用戶依然只想把它當做一個框架使用,他們還是能夠這么做。這也意味著,我們必須添加一些特性,以支持更多類型的測試,而不僅僅是單元測試而已。 3.0版本中包含了非常出色的特性集,不過我認為以上這些只是這一版本中全部變更的冰山一角而已。
如今,3.0的生產版本已正式亮相了,我們將以更快的速度發布特性,正如我們過去十年間對NUnit V2所做的更新一樣。實際上,我們剛剛才發布了NUnit 3.0.1,這是一個專門修復bug的版本。
InfoQ:對于這次發布的版本,有哪些特性是使用者最希望看到的?
CP:其中之一是并行測試執行,它通過屬性進行控制。我們支持兩種級別的并行性:在獨立的進程中并行執行多個程序集,或是在同一個進程中執行多個線程。這兩種級別的并行各有適合的應用場景。
另一個主要特性是NUnit現在提供了一個TestEngine,并提供一套已發布的API,任何人都可以在自己的程序中調用它以運行測試。這一特性在過去是不存在的,如果你要在NUnit中以編程的方式運行測試,必須要使用內部類。而這些內部類在每次發布中都可能會產生變化,這對于第三方測試執行器的開發者來說無疑是加大了開發的難度。
第三個特性是關于擴展能力。NUnit V2中引入了一種“NUnit插件”機制,但編寫這種插件非常復雜。NUnit 3.0去除了這一機制,并提供另兩種級別的擴展能力:
- 第一種方式是創建一個新的框架級別的屬性,并實現某些已定義的接口,以獲得某種期望的行為。順便說一句,這種方式受到了MbUnit的啟發,好點子的共享正是開源項目進行創新的方式之一。
- 第二種方式是為引擎創建一個擴展,這種方式能夠更進一步擴展NUnit的能力。舉例來說,某個引擎驅動擴展允許在NUnit 3.0中執行NUnit V2的測試。如果你愿意,你還可以為xUnit、msTest甚至是junit編程擴展。在今后的發布中,我們還將利用這一功能實現遠程或在設備中運行測試。
InfoQ:在NUnit 3中支持哪些新的平臺?
CP:我們為這一框架打造了一個可移植的庫,可以在.NET 4.5、.NET Core(包括Win 10以上版本的統一Windows應用,或DNX Core 5以上版本)、Windows 8、Windows Phone 8(基于Silverlight)、統一應用(包括Windows Phone 8.1以上版本,或Windows 8.1以上版本),以及Xamarin(包括MonoTouch、MonoAndroid以及Xamarin iOS統一應用)。
當然,我們也將繼續支持各種遺留平臺,包括.NET 2.0、Silverlight和.NET Compact Framework 3.5。不過,我們最終還是取消了對.NET 1.1和.NET CF 2.0的支持。
InfoQ:哪一項成就是最令你感到驕傲的?
CP:最令我感到驕傲的就是能夠讓NUnit得以繼續發展!在2005年前后,就有人開始預測NUnit將會消亡。最主要的因素就是微軟推出了一個“官方”的測試框架,它宣稱能夠統一當時所有的開源單元測試項目。結果這當然沒有成真,而對于NUnit的死亡預測反倒讓我們產生了更大的創新動力,尤其是設計出了NUnit測試開發平臺,即NUnit 3.0。
第二大成就則是這一項目找到了大量的參與者、貢獻者和社區成員,并從他們那里獲得了大量的支持。作為一名技術人員,這種來自于社區的貢獻是我始料未及的,這令我對于促成這一項目的發展感到驕傲。如果NUnit能夠繼續發展至2020年之后,屆時我就將要70多歲了,恐怕已無力繼續它的開發,因此我很高興有其他貢獻者能夠讓它保持繼續發展。我要特別提到Rob Prouse,他如今已是這個項目在GitHub上的共同所有人,并且已經成功地管理了多次發布。
InfoQ:還有哪些想要補充的嗎?
CP:在2002年時,我出于工作的目的需要尋找一個開源的測試項目。最終,我基本認定了NUnit,因為我與開發團隊建立了良好的關系。最終我也加入了這一項目,并且如你所見,我是那批開發者中最后一個還在繼續維護它的人。幸運的是,新人在陸續地加入這一項目,這樣在我離開時也能夠放心地把項目交給他們了。
NUnit的源代碼可以在 GitHub 上找到,其中也包含了 NUnit 3的文檔 ,包括一篇 升級指南 。
查看英文原文: NUnit 3 Brings Extensibility and Parallel Execution: Interview with Charlie Poole