.Net开发人员应该下载的十种必备工具(二)
NUnit
NUnit 是為 .NET 框架生成的開放源代碼單元測(cè)試框架。NUnit 使您可以用您喜歡的語(yǔ)言編寫測(cè)試,從而測(cè)試應(yīng)用程序的特定功能。當(dāng)您首次編寫代碼時(shí),單元測(cè)試是一種測(cè)試代碼功能的很好方法,它還提供了一種對(duì)應(yīng)用程序進(jìn)行回歸測(cè)試的方法。NUnit 應(yīng)用程序提供了一個(gè)用于編寫單元測(cè)試的框架,以及一個(gè)運(yùn)行這些測(cè)試和查看結(jié)果的圖形界面。
編寫 NUnit 測(cè)試
作為示例,我將測(cè)試 .NET 框架中 Hashtable 類的功能,以確定是否可以添加兩個(gè)對(duì)象并且隨后檢索這些對(duì)象。我的第一步是添加對(duì) NUnit.Framework 程序集的引用,該程序集將賦予我對(duì) NUnit 框架的屬性和方法的訪問權(quán)。接下來,我將創(chuàng)建一個(gè)類并用 TestFixture 屬性標(biāo)記它。該屬性使 NUnit 可以知道該類包含 NUnit 測(cè)試:
| using System; using System.Collections; using NUnit.Framework; namespace NUnitExample { [TestFixture] public class HashtableTest { public HashtableTest() { } } }? |
? 下一步,我將創(chuàng)建一個(gè)方法并用 [Test] 屬性標(biāo)記它,以便 NUnit 知道該方法是一個(gè)測(cè)試。然后,我將建立一個(gè) Hashtable 并向其添加兩個(gè)值,再使用 Assert.AreEqual 方法查看我是否可以檢索到與我添加到 Hashtable 的值相同的值,如下面的代碼所示:
| [Test] public void HashtableAddTest() { Hashtable ht = new Hashtable(); ht.Add("Key1", "Value1"); ht.Add("Key2", "Value2"); Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!"); Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!"); } |
? 這將確認(rèn)我可以首先向 Hashtable 中添加值并隨后檢索相應(yīng)的值 — 這是一個(gè)很簡(jiǎn)單的測(cè)試,但能夠表現(xiàn) NUnit 的功能。存在許多測(cè)試類型以及各種 Assert 方法,可使用它們來測(cè)試代碼的每個(gè)部分。
要運(yùn)行該測(cè)試,我需要生成項(xiàng)目,在 NUnit 應(yīng)用程序中打開生成的程序集,然后單擊 Run 按鈕。圖 5 顯示了結(jié)果。當(dāng)我看到那個(gè)大的綠色條紋時(shí),我有一種興奮和頭暈的感覺,因?yàn)樗屛抑罍y(cè)試已經(jīng)通過了。這個(gè)簡(jiǎn)單的示例表明 NUnit 和單元測(cè)試是多么方便和強(qiáng)大。由于能夠編寫可以保存的單元測(cè)試,并且每當(dāng)您更改代碼時(shí)都可以重新運(yùn)行該單元測(cè)試,您不僅可以更容易地檢測(cè)到代碼中的缺陷,而且最終能夠交付更好的應(yīng)用程序。
圖 5 NUnit
NUnit 是一個(gè)開放源代碼項(xiàng)目,并且可以從 http://www.nunit.org 下載。還有一個(gè)優(yōu)秀的 NUnit Visual Studio .NET 外接程序,它使您可以直接從 Visual Studio 中運(yùn)行單元測(cè)試。您可以在 http://sourceforge.net/projects/nunitaddin 找到它。有關(guān) NUnit 及其在測(cè)試驅(qū)動(dòng)開發(fā)中的地位的詳細(xì)信息,請(qǐng)參閱文章“Test-Driven C#: Improve the Design and Flexibility of Your Project with Extreme Programming Techniques”(MSDN ?Magazine 2004 年 4 月刊)。
FxCop
.NET 框架非常強(qiáng)大,這意味著存在創(chuàng)建優(yōu)秀應(yīng)用程序的極大可能,但是也同樣存在創(chuàng)建劣質(zhì)程序的可能。FxCop 是有助于創(chuàng)建更好的應(yīng)用程序的工具之一,它所采用的方法是:使您能夠分析程序集,并使用一些不同的規(guī)則來檢查它是否符合這些規(guī)則。FxCop 隨附了由 Microsoft 創(chuàng)建的固定數(shù)量的規(guī)則,但您也可以創(chuàng)建并包括您自己的規(guī)則。例如,如果您決定所有的類都應(yīng)該具有一個(gè)不帶任何參數(shù)的默認(rèn)構(gòu)造函數(shù),則可以編寫一條規(guī)則,以確保程序集的每個(gè)類上都具有一個(gè)構(gòu)造函數(shù)。這樣,無論是誰(shuí)編寫該代碼,您都將獲得一定程度的一致性。如果您需要有關(guān)創(chuàng)建自定義規(guī)則的詳細(xì)信息,請(qǐng)參閱 John Robbins 的有關(guān)該主題的 Bugslayer 專欄文章(MSDN ? Magazine 2004 年 6 月刊)。
那么,讓我們觀察一下實(shí)際運(yùn)行的 FxCop,并且看一下它在我一直在處理的 NUnitExample 程序集中找到哪些錯(cuò)誤。當(dāng)您打開 FxCop 時(shí),您首先需要?jiǎng)?chuàng)建一個(gè) FxCop 項(xiàng)目,然后向其添加您要測(cè)試的程序集。在將該程序集添加到項(xiàng)目以后,就可以按 Analyze,FxCop 將分析該程序集。圖 6 中顯示了在該程序集中找到的錯(cuò)誤和警告。
圖 6
FxCop 在我的程序集中找到了幾個(gè)問題。您可以雙擊某個(gè)錯(cuò)誤以查看詳細(xì)信息,包括規(guī)則說明以及在哪里可以找到更多信息。(您可以做的一件有趣的事情是在框架程序集上運(yùn)行 FxCop 并查看發(fā)生了什么事情。)
FxCop 可以幫助您創(chuàng)建更好的、更一致的代碼,但它無法補(bǔ)償?shù)土拥膽?yīng)用程序設(shè)計(jì)或非常簡(jiǎn)單拙劣的編程。FxCop 也不能替代對(duì)等代碼檢查,但是因?yàn)樗梢栽谶M(jìn)行代碼檢查之前捕獲大量錯(cuò)誤,所以您可以花費(fèi)更多時(shí)間來解決嚴(yán)重的問題,而不必?fù)?dān)心命名約定。FxCop 由 Microsoft 開發(fā),并且可以從 http://www.gotdotnet.com/team/fxcop 下載。
Lutz Roeder 的 .NET Reflector
下一個(gè)必不可少的工具稱為 .NET Reflector,它是一個(gè)類瀏覽器和反編譯器,可以分析程序集并向您展示它的所有秘密。.NET 框架向全世界引入了可用來分析任何基于 .NET 的代碼(無論它是單個(gè)類還是完整的程序集)的反射概念。反射還可以用來檢索有關(guān)特定程序集中包含的各種類、方法和屬性的信息。使用 .NET Reflector,您可以瀏覽程序集的類和方法,可以分析由這些類和方法生成的 Microsoft 中間語(yǔ)言 (MSIL),并且可以反編譯這些類和方法并查看 C# 或 Visual Basic ?.NET 中的等價(jià)類和方法。
為了演示 .NET Reflector 的工作方式,我將加載和分析前面已經(jīng)顯示的 NUnitExample 程序集。圖 7 顯示了 .NET Reflector 中加載的該程序集。
圖 7 NUnitExample 程序集
在 .NET Reflector 內(nèi)部,有各種可用來進(jìn)一步分析該程序集的工具。要查看構(gòu)成某個(gè)方法的 MSIL,請(qǐng)單擊該方法并從菜單中選擇 Disassembler。
除了能夠查看 MSIL 以外,您還可以通過選擇 Tools 菜單下的 Decompiler 來查看該方法的 C# 形式。通過在 Languages 菜單下更改您的選擇,您還可以查看該方法被反編譯到 Visual Basic .NET 或 Delphi 以后的形式。以下為 .NET Reflector 生成的代碼:
| public void HashtableAddTest() { Hashtable hashtable1; hashtable1 = new Hashtable(); hashtable1.Add("Key1", "Value1"); hashtable1.Add("Key2", "Value2"); Assert.AreEqual("Value1", hashtable1["Key1"], "Wrong object returned!"); Assert.AreEqual("Value2", hashtable1["Key2"], "Wrong object returned!"); }? |
| public void HashtableAddTest() { Hashtable ht = new Hashtable(); ht.Add("Key1", "Value1"); ht.Add("Key2", "Value2"); Assert.AreEqual("Value1", ht["Key1"], "Wrong object returned!"); Assert.AreEqual("Value2", ht["Key2"], "Wrong object returned!"); } ? |
雖然該示例是一種顯示實(shí)際代碼與反編譯代碼之間對(duì)比的好方法,但在我看來⒉淮?.NET Reflector 所具有的最佳用途 — 分析 .NET 框架程序集和方法。.NET 框架提供了許多執(zhí)行類似操作的不同方法。例如,如果您需要從 XML 中讀取一組數(shù)據(jù),則存在多種使用 XmlDocument、XPathNavigator 或 XmlReader 完成該工作的不同方法。通過使用 .NET Reflector,您可以查看 Microsoft 在編寫數(shù)據(jù)集的 ReadXml 方法時(shí)使用了什么,或者查看他們?cè)趶呐渲梦募x取數(shù)據(jù)時(shí)做了哪些工作。.NET Reflector 還是一個(gè)了解以下最佳實(shí)施策略的優(yōu)秀方法:創(chuàng)建諸如 HttpHandlers 或配置處理程序之類的對(duì)象,因?yàn)槟梢粤私獾?Microsoft 工作組實(shí)際上是如何在框架中生成這些對(duì)象的。
.NET Reflector 由 Lutz Roeder 編寫,并且可以從 http://www.aisto.com/roeder/dotnet 下載。
From:? http://www.godist.cn/blog/article.asp?id=396總結(jié)
以上是生活随笔為你收集整理的.Net开发人员应该下载的十种必备工具(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理第三版中文版部分答案-冈萨雷
- 下一篇: VB2005.Net 环境下使用Jmai