簡介
它能夠讓你有選擇性的運行單個測試或單個套件,並且當你修改以及編譯你代碼時它會自動重新載入。下面的截屏是nunit-gui正在運行與前面例子相同的mock-assembly.dll.
正如你所見,沒有運行的測試標記為一個黃色的圓圈,而那些成功運行顏色為綠色。如果任何測試失敗,他們會標記為紅色。
NUnit屬性
TestFixture 屬性
本屬性標記一個類包含測試。做為一個測試的類,這個類還有一些限制:
1、必須是Public,否則NUnit看不到它的存在。
2、它必須有一個預設的構造函式,否則是NUnit不會構造它。
3、構造函式應該沒有任何副作用,因為NUnit在運行時經常會構造這個類多次。
Test 屬性
Test屬性用來標記一個類(已經標記為TestFixture)的某個方法是可以測試的。
1、測試方法必須為Public。
2、測試方法必須沒有參數。
3、測試方法不返回任何參數。
SetUp/TearDown 屬性
用於在測試開始時初始化,和測試後清除。標記為SetUp/TearDown 屬性方法必須為public。
ExpectedException屬性
這裡是一個驗證這個假設的測試。在這個屬性里,你可以在執行過程中捕獲你期望的異常類型。如果這個方法在沒有拋出期望異常的情況下完成了,這個測試失敗。使用這個屬性幫助我們寫程式設計師測試驗證邊界條件(Boundary Conditions)。
Ignore 屬性
由於種種原因,有一些測試我們不想運行。當然,這些原因可能包括你認為這個測試還沒有完成,這個測試正在重構之中,這個測試的需求不是太明確。但你有不想破壞測試,不然進度條可是紅色的喲。怎么辦?使用Ignore屬性。你可以保持測試,但又不運行它們。
TestFixtureSetUp / Down屬性
有時,一組測試需要的資源太昂貴。例如,資料庫連線可能是一個關鍵資源,在一個test fixture的每個測試中,打開/關閉資料庫連線可能非常慢。這就是我在開始提到的問題。
如何解決?NUnit有一對類似於前面討論的SetUp/TearDown的屬性: TestFixtureSetUp/TestFixtureTearDown。正如他們名字表明的一樣,這些屬性用來標記為整個test fixture初始化/釋放資源方法一次的方法。
例如,如果你想為所有test fixture的測試共享相同的資料庫連線對象,我們可以寫一個打開資料庫連線的方法,標記為TestFixtureSetUp屬性,編寫另外一個關閉資料庫連線的方法,標記為TestFixtureTearDown屬性。
Explicit屬性
本屬性忽略一個test和test fixture,直到它們顯式的選擇執行。如果test和test fixture在執行的過程中被發現,就忽略他們。所以,這樣一來進度條顯示為黃色,因為有test或test fixture忽略了。
Category屬性
對於測試來說,你有的時候需要將之分類,此屬性正好就是用來解決這個問題的。
測試生命周期
FixtureSetUp
SetUp
Test Method1
TearDown
SetUp
Test Method2
TearDown
FixtureTearDown
Assert Class
提供了一系列的 static methods,讓你可以用來驗證主要程式的結果與預期的是否一樣。
常用的 Assert 斷言有:
1、Assert.AreEqual(object expected,object actual[string message]):驗證兩個對象是否相等,如Assert.AreEqual(2,1+1);
2、Assert.AreSame(object expected,object actual[string message]):驗證兩個引用是否指向同一對象,如
object expected=new object();
object actual =expected;
Assert.AreSame(expected,actual);
3、Assert.IsFalse(bool):驗證bool值是否為false,如Assert.IsFalse(false);
4、Assert.IsTrue(bool):驗證bool值是否為true,如Assert.IsTrue(true);
5、Assert.IsNotNull(object):驗證對象是否不為null,如Assert.IsNotNull(new object());
6、Assert.IsNull(object):驗證對象是否為null,如Assert.IsNull(null);
NUnit使用方法
NUnit的官方網站下載地址為:www.nunit.org,如果是結合.net使用,最好下載win.net版。
在vs2005中新建一個class library工程,add 一個class,定義一個取數組最大值的函式,具體定義如下:
public class Class1
{
public int FindMax(int[] arr)
{
int i;
int max=arr[0];
for(i =1; i<arr.Length; i++)
{
if(arr >max)
{
max =arr ;
}
}
return max;
}
}
第二步:就該編寫test code了。add 一個新的class,命名為Class1Test。再編寫code之前,需要給該工程添加一個NUnit的引用,具體為:右鍵點擊 reference->add reference->選擇nunit.framework,然後在Class1Test檔案中添加一個引用:using NUnit.Framework。當然,添加引用的前提是已經安裝了NUnit了。下面我們就可以開始code test了。
[TestFixture]
public class Class1Test
{
[Test]
public void FindMaxTest()
{
int[] arr1 ={ 1, 3, 10, 4 };
int[] arr2 ={ 3, 10, 4, 1 };
int[] arr3 ={ 1, 10, 4, 3 };
int[] arr4 ={ -1, -3, -5 };
Class1 myclass =new Class1();
Assert.AreEqual(10, myclass.FindMax(arr1));
Assert.AreEqual(10, myclass.FindMax(arr2));
Assert.AreEqual(10, myclass.FindMax(arr3));
Assert.AreEqual(-1, myclass.FindMax(arr4));
}
}
我們先來解析一下這個類吧:[TestFixture]是NUnit的一個重要的屬性,可以說是NUnit的一個標記吧,它向編譯工具“宣布”:我要測試啦。[Test]一般用在一個函式之前,而且這個函式必須是public類型,而且無返回值,即void。
類與測試類寫完了。編譯好之後,可以得到一個dll檔案。
打開NUnit,點擊file->open,選擇剛剛編譯的dll檔案,這樣就把檔案載入到NUnit了,在它的界面的左邊,我們可以看到剛才編寫的測試函式FindMaxTest,選擇工程項目,或是檔案,或是測試函式,然後點擊界面右邊的Run,如果一路綠燈,測試通過!