C#單元測試
2015-03-02 23:58 by xtechnet, ... 閱讀, ... 評論, 收藏, 編輯 1.使用vs自帶的單元測試組件。
項目引用Microsoft.VisualStudio.TestTools.UnitTesting。在測試類上標記TestClass附加屬性,在需要測試的方法上標記TestMethod附加屬性【測試】-【運行】-【所有測試】,如圖所示,也可以選擇分析代碼覆蓋率,看當前測試運行覆蓋的代碼比率。
說明:
1.在方法中使用Assert這個靜態類進行測試,里面提供了許多供測試使用的靜態方法:
2.測試的方法必須是void的,不帶有返回類型,如圖所示: 
2.使用NUnit
在http://www.nunit.org/index.php?p=download下載安裝包,安裝之后,在項目中引用安裝目錄中的nunit.framework.dll。然后在類中using NUnit.Framework;在測試類上標記TestFixture附加屬性,在需要測試的方法是標記Test附加屬性。測試操作有兩種形式
a.測試項目為exe或者dll類庫。編譯生成之后,打開nunit.exe程序,然后選擇Open PRoject,然后文件類型選擇程序集,打開C#項目編譯生成的exe或者dll文件:
b.打開項目的屬性頁,【調試】-【啟動操作】部分,選擇啟動外部程序,然后選擇nunit.exe程序。這樣F5調試的時候,可以直接用nunit打開,查看單元測試的執行信息

說明:
1.和Microsoft.VisualStudio.TestTools.UnitTesting的使用類似,也是使用Assert這個類中提供的靜態方法進行測試,稍有不同的是這個Assert不是靜態類:
對比Microsoft.VisualStudio.TestTools.UnitTesting的Assert靜態類,可以發現提供的靜態方法大體一致,甚至連形參名稱都相同。2.測試的方法同樣必須是void的。可以驗證:給一個有返回值的方法標記Test附加屬性。 [Test] public int TestNUnit4() { Assert.Greater(10, 11, "不知道具體結果"); return 1; }
運行之后,如圖所示,會提示相應的測試方法運行不了,(注意是Invalid,而不是斷言失敗的Failed),原因是方法有一個非空的返回類型,而nunit期望的是無返回結果的方法。

3.如果想讓某個方法暫時不運行測試(或者說測試的時候忽略),可以給它附加了Ignore屬性。
[Test] [Ignore("the method is not ready yet")]//方法標記Ignore屬性,會在nunit中忽略這個方法的運行,呈現黃色。 public void TestNUnit3() { Assert.AreEqual(10, 11, "it is not equal"); }
注意:Ignore屬性可以附加在方法上,也可以附加在類上,這樣整個類中的測試方法都會忽略測試運行。如下所示: [TestFixture] [Ignore("the class is not ready yet")] public class Test { [Test] public void TestNUnit() { Console.WriteLine("12121"); Assert.AreEqual(1, 2, "it is not equal"); } [Test] public void TestNUnit1() { Assert.AreEqual(1, 1 ,"it is not equal"); } [Test] public void TestNUnit2() { Assert.AreEqual(1, Assert.Counter); } . . . }

4.Errors and Failures中會顯示測試方法在發生錯誤和斷言失敗的情況下的信息如下代碼: [Test] public void Method1() { var a = 1; var b = 0; var test = a / b; Assert.Pass("assert pass"); }

5.Text Output中會顯示測試運行中輸出的內容。代碼如下: [TestFixture] public class Test { [Test] public void TestNUnit() { Console.WriteLine("12121"); Assert.AreEqual(1, 2, "it is not equal"); } //省略其他測試方法... [SetUp] public void SetUp() { Console.WriteLine("SetUp"); } [TearDown] public void TearDown() { Console.WriteLine("TearDown"); } }
運行效果如圖:

其中有SetUp、TearDown兩個輸出。附加屬性SetUp的作用是在每個測試運行之前執行,可用作初始化工作;TearDown則是在每個測試運行之后執行,可用作釋放資源。還有兩個附加屬性:TestFixtureSetUp和TestFixtureTearDown同樣提供相同的目的,不過是在test fixture范圍下。參考:http://confach.VEVb.com/archive/2005/06/20/177817.aspx