TestDriven.NET 2.0——單元測試的好助手 - TerryLee's Tech Space - 博客園

在軟件開發領域,測試驅動開發(Test Driven Development,TDD)技術在逐漸爲廣大開發者所接受,它是在添加新代碼之前讓你的測試代碼出錯的一種開發技術。在開始編寫代碼之前首先要寫你的測試代碼,然後再編寫代碼讓你的測試通過,可以想象,如果沒有一個好的單元測試工具,這項工作其實是無法完成的。相信很多.NET開發人員者對於開源的NUnit都不陌生,但是它並不能很好的與Visual Studio.NET IDE集成起來。

這裏我將向大家介紹另一款優秀的單元測試工具——TestDriven.NET 2.0。它是以插件的形式集成在Visual Studio.NET IDE中的單元測試工具,能夠兼容各種Visual Studio版本,並且集成了多種單元測試框架諸如NUnit,MbUnit,以及Visual Studio Team System適配器等。

TestDriven.NET的前身是NUnitAddIn,由Jamie Cansdale大師開發,一開始作者只是想做一個NUnit插件集成到Visual Studio中,經過多次版本更新,NUnitAddIn在2004年9月底更名爲TestDriven.NET,並在當年的12月初發布了它的第一個Release版本,即TestDriven.NET 1.0。由於它在開發中的出色表現,讓很多開發人員期待它的下一個版本的發佈,這一等待卻足足等了兩年,在今年的10月底,終於迎來了姍姍來遲的TestDriven.NET 2.0版本。然而這一等待卻是值得的,在2.0中,給我們帶來了太多的驚喜,它集成了.NET Reflector、NConver、NConverExplorer、TypeMock.NET等,功能更加強大,下面我將一一介紹TestDriven.NET 2.0中湧現出的這些亮點。

安裝完TestDriven.NET 2.0 後,重新啓動Visual Studio 2005,可以發現在Visual Studio.NET IDE的右鍵菜單中會多出一些新項,所有的操作都是直接通過這些右鍵菜單來完成。我們先來編寫一小段簡單的測試代碼:

    ClassA ca = new ClassA();

    int result = ca.GetResult();

    Assert.AreEqual(expected, result);

在以前如果您使用NUnit進行單元測試,對於這樣一個簡單的測試,首先需要運行NUnit GUI,加載當前的程序集,並點擊Run按鈕運行測試,測試通過後再回到IDE繼續編寫代碼:

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

現在有了TestDriven.NET 2.0,就不會有這麼麻煩了,我們不用額外運行任何程序,只需要在Visual Studio 2005 IDE中右擊並選擇Run Test菜單命令就可以運行測試,日常開發中我們都已經習慣了在IDE中進行這種操作,所以這樣更加符合我們的開發習慣,也不用頻繁在應用程序之間切換窗口。

TestDriven.NET 2.0

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

稍微寫過一點單元測試代碼的朋友都知道,實際開發中的每一個測試,測試方法都不可能只有一個斷言(Assert),在以前使用NUnit時,測試如果通不過,我們無法根據錯誤信息快速準確的定位到代碼中的某一個斷言,有了TestDriven.NET 2.0,當測試出現錯誤時,您只需要在Output窗口中雙擊錯誤提示,就可以直接定位到出錯的斷言代碼行,極大的提高了排錯的效率。

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

在上面的測試代碼中,我們僅僅是點擊了右鍵菜單Run Test,並沒有選擇運行哪一個測試方法或者測試類,那麼TestDriven.NET 2.0是如何選擇並運行測試的呢?其實這跟我們點擊鼠標的位置有關,點擊鼠標的位置如果在標記爲Test的測試方法內,它只會執行該測試方法;點擊鼠標的位置如果在方法之外而在標記爲TestFixture的類裏面,它會執行該類中所有標記爲Test的測試方法;點擊鼠標的位置如果在類之外,而在某一個命名空間裏面,則它會執行該命名空間下所有標記爲TestFixture的測試類。

在開發中,我們常常會遇到跟蹤一些變量的值和某些方法的返回值,一般情況下大家都會選擇使用Command Window,這種方式需要通過輸入一些命令來查看,未免有些麻煩。TestDriven.NET 2.0爲我們提供了一鍵操作的功能,讓我們可以隨時隨地的跟蹤方法的返回值等,而不用輸入任何命令。在普通的方法中TestDriven.NET 2.0也可以運行測試(Run Test),不管方法的作用域是public還是private,是實例方法還是static方法。如果測試方法是實例方法,它會使用默認的構造函數創建一個類的對象,在執行測試完成時再釋放掉該對象。如果方法有返回值,將會顯示在Output窗口中。運行下面的測試:

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

在運行測試的過程中,有時候需要調試跟蹤一些信息,如果使用NUnit,由於它沒有集成在IDE中,也就無法設置斷點。在TestDriven.NET 2.0提供了以Debug模式進行測試,可以在測試代碼中設置斷點,並進行跟蹤,這時我們需要選擇Test with | Debugger菜單命令。

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

在運行測試過程中,有時候會有創建一些應用程序域,但並沒有被釋放,這樣會有部分程序集被加載該應用程序域中並且已經鎖定,所以可能會造成編譯失敗。這時需要釋放掉一些測試進程來可以繼續編譯。在任務欄的右下角,所有的測試進程都會顯示在這裏,點擊右鍵,選擇Stop菜單命令可以結束測試進程。

.NET Reflector是一個.NET平臺下的類瀏覽器和反編譯工具,我們可以用它來瀏覽程序集的類和方法,可以分析由這些類和方法生成的中間語言 (MSIL),相信大家都用過,但它仍然是作爲一個獨立的工具存在的,在TestDriven.NET 2.0中它被很好的集成在了Visual Studio.NET IDE,通過右鍵菜單,就可以直接使用.NET Reflector。

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客
集成代碼覆蓋率分析工具

在做單元測試的時候,我們總是希望知道自己的代碼有多少覆蓋到了,哪些代碼是沒有測試到的,如果沒有安裝Visual Studio Team System,無法用Team Converage進行代碼覆蓋率的分析,這時使用大名鼎鼎的NConver是一個不錯的選擇,並且使用NconverExplorer可以去查看分析結果,所有這些仍然需要運行新的應用程序,TestDriven.NET 2.0把這一切都集成到了IDE中,可以在沒有安裝Team System的環境下使用Team Converage,也不用單獨安裝NConver。

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

重複運行測試可以說是TestDriven.NET 2.0的一大亮點。TestDriven.NET2.0出現之前,如果在運行測試的過程中,測試代碼不能通過,這時我們會花幾秒鐘時間去修改測試代碼,並再次運行測試,但是往往卻發現找不到剛纔測試的是哪個代碼塊,這時您可以使用重複運行測試命令,不管你鼠標點擊的位置在哪兒,它都會直接運行上一次的測試。

在.NET平臺下,單元測試框架有很多,TestDriven.NET 2.0不可能把所有的單元測試框架盡收其中,但是它提供了一種很好的可插拔的機制。當你安裝一種新的測試框架後,TestDriven.NET 2.0會自動在它的菜單中出現這一項,在測試項目上點右鍵選擇Test With菜單命令,可以選擇使用哪一個單元測試框架。

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

在做單元測試的過程中,最麻煩的部分就是我們的測試代碼必須依賴於系統的其他部分,如數據庫等。這時候我們會使用一類替代品來代替這些真實的對象,即使用Mock對象,幸運的是我們不用每次都去實現自己的Mock對象,在.NET平臺下,有很多款Mock對象的框架供我們選擇。在TestDriven.NET 2.0 出現之前,使用哪個Mock對象的框架,我們需要去下載並安裝它們,在TestDriven.NET 2.0 中已經集成了TypeMock.NET框架,這使得我們可以很方便的直接使用而不用再去自行選擇。

TestDriven.NET 2.0——單元測試的好助手 - TerryLees Tech Space - 博客園 - 孫焱 - 孫焱的博客

如果只做單元測試,我會選擇Nunit;如果要進行類庫反編譯,我會選擇.NET Relector;如果要分析代碼的覆蓋率,我會選擇NConver;如果要查看代碼覆蓋率的分析結果,我會選擇NConverExplorer,但如果要把以上所有的事情集成在IDE中一起去做,那毫無疑問,我會選擇TestDriven.NET 2.0。希望我這篇文章能拋磚引玉,引領大家使用TestDriven.NET 2.0,走上單元測試之路。當然對於TestDriven.NET 2.0它的專業版和開發版已經開始收費,只有個人版仍然可以免費下載使用。

有關TestDriven.NET 2.0的詳細信息請訪問:


發表評論
有個問題哦 ,TESTDRIVEN.NET只能用在WEBAPPLICATION,只能用在VS2005總 VWD EXPRESS不行,
WEBSITE不能用所以有點麻煩,大家快去裝SP1,或者WEB APPLICATION的補丁吧.我怎麼裝了最新TestDriven.NET-2.0.1948 RTM 沒見TYPE MOCK啊


希望TerryLee能貼出一個包含測試代碼的工程,小弟對單元測試很不熟悉,看了你的文章後,下了一個TestDriven.NET 2.0裝上了,正在學習,但學習資料太少了,都是講NUnit的,希望TerryLee能從基礎上講講TestDriven.NET 2.0.

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章