在上一篇文章“NUnit之Assertion詳解”中,給大家介紹了NUnit的斷言,現(xiàn)在接著給大家介紹Attribute在NUnit中的具體作用。
Attribute是C#一個(gè)重要的語言特征,園子里應(yīng)該有不少這方面的文章,如果對(duì)Attribute不太了解,建議先去稍稍了解一下,親手做個(gè)小程序感受一下Attribute的作用。
我們?cè)谑褂肗Unit編寫測試用例時(shí),離不開兩個(gè)基本的Attribute,例如,我們要測試一個(gè)類的Add方法,使用的代碼如下:
[TestFixture]public class MyTest{ [Test] public void TestAdd() { int a = 99; int b = 1; int value = MyMath.Add(a,b); Assert.AreEqual(value, 100); } Public void TestDel() { int value = MyMath.del(99,1); Assert.AreEqual(value, 98); }}
上面的代碼中,已經(jīng)使用了兩個(gè)Attribute,即[TestFixture]和[Test],其中[TestFixture]的作用是聲明MyTest類是一個(gè)含有測試方法的類,而[Test]則說明TestAdd是一個(gè)測試方法,而TestDel由于沒有用[Test]聲明,所以它不是測試方法,雖然它以Test開頭。
對(duì)于編譯后的Assembly文件,NUnit是通過查找[TestFixture]和[Test]這類它支持的與測試相關(guān)的Attribute來確定哪些類包含了測試方法,以及這些類中的哪些方法是測試方法。
對(duì)于上面的例子,如果用NUnit的圖形化界面打開其編譯后的Assembly,應(yīng)該看到如下的界面,TedtAdd方法以及它所屬的命名空間按照樹的形式展開,而TestDel方法由于沒有[Test]的聲明,所以它只是一個(gè)普通的方法,也沒有在樹中展現(xiàn):
點(diǎn)擊Run按鈕后,NUnit會(huì)運(yùn)行所有的測試方法,運(yùn)行后的界面如下
通過上面的小例子,我們知道了[TestFixture]和[Test]這兩個(gè)Attribute的作用,對(duì)它支持的Attribute有了初步了解。
如果查看NUnit的源代碼(大家可以去官網(wǎng)注冊(cè)然后下載),可以知道,在NUnit.Framework這個(gè)命名空間中,有TestFixtureAttribute和TestAttribute兩個(gè)類,它們負(fù)責(zé)解析帶有[TestFixture]和[Test]聲明的類和方法(在C#語法規(guī)范中,要實(shí)現(xiàn)一個(gè)名稱為[ABC]的Attribute,必須建立名稱為ABCAttribute的類,并繼承于Attribute這個(gè)基類)。
NUnit支持的Attribute遠(yuǎn)不止上面兩個(gè),我大致把它們分為四大類,分別是控制類、數(shù)值類、平臺(tái)類和其它類,下面逐一介紹
一:控制類
這些Attribute控制測試類或者測試方法,而且成對(duì)出現(xiàn),功能基本相比,了解一個(gè)自然了解另外一個(gè)。
[TestFixture]/[Explicit]:聲明一個(gè)類是測試類/聲明一個(gè)類只有在UI界面被選中時(shí)才執(zhí)行
[TestFixtureSetup]/[TestFixtureTearDown]:在測試開始前/結(jié)束后要執(zhí)行的操作,一個(gè)TestFixture只能有一個(gè)TestFixtureSetup或TestFixtureTearDown。
[Test]/[Ignore]:是測試方法/忽略掉,測試時(shí)不執(zhí)行
[Setup]/[TearDown]:每個(gè)測試方法在執(zhí)行前/結(jié)束后要執(zhí)行的操作
二:數(shù)值類
數(shù)值類Attribue是NUnit的一大亮點(diǎn),善于使用這些Attribue,將使測試方法變得清晰、簡潔、可讀性強(qiáng)、可擴(kuò)展性強(qiáng),有利于進(jìn)行數(shù)據(jù)驅(qū)動(dòng)下的測試。
為了說明下面的例子,使用下面的方法,也是打印輸出輸入值及其數(shù)據(jù)類型,這樣便于把執(zhí)行的結(jié)果通過打印的方式在NUnit中輸出
Console.WriteLine(t + ", its type:" + typeof(T));
[Values]:以參數(shù)的形式傳入一組值,NUnit會(huì)把這組值分解成相應(yīng)數(shù)量的子測試。
例如下面的代碼,分別在[Values]中傳入三組共8個(gè)值,在執(zhí)行時(shí)便一共會(huì)分解成8個(gè)子測試方法,例如
TestPrintInt([Values(1, 2, 3)] int x)會(huì)被分解為TestPrintInt(1)TestPrintInt(2)TestPrintInt(3)三組
如下圖,當(dāng)選中ValueDemo這個(gè)節(jié)點(diǎn),然后點(diǎn)擊Run按鈕后,會(huì)看到一共測試了8個(gè)測試用例。
當(dāng)了解了這個(gè)Attribue的設(shè)計(jì)思路后,以后的其它Attribute也很容易理解了,往往通過它們的命名可以猜出一二。