Test Attribute簡介
Test attribute主要用來標(biāo)示在text fixture中的method,表示這個(gè)method需要被Test Runner application所執(zhí)行。有Test attribute的method必須是public的,并且必須return void,也沒有任何傳入的參數(shù)。如果沒有符合這些規(guī)定,在Test Runner GUI之中是不會列出這個(gè)method的,而且在執(zhí)行Unit Test的時(shí)候也不會執(zhí)行這個(gè)method。上面的程序代碼示范了使用這個(gè)attribute的方法。
SetUp 和 Teardown Attributes簡介
在寫Unit Tests的時(shí)候,有時(shí)你會需要在執(zhí)行每一個(gè)test method之前(或之后)先作一些預(yù)備或善后工作。當(dāng)然,你可以寫一個(gè)private的method,然后在每一個(gè)test method的一開頭或末端呼叫這個(gè)特別的method;蛘,你可以使用我們要介紹的SetUp及Teardown Attributes來達(dá)到相同的目的。如同這兩個(gè)Attributes的名字的意思,有Setup Attribute的method會在該TextFixture中的每一個(gè)test method被執(zhí)行之前先被Test Runner所執(zhí)行,而有Teardown Attribute的method則會在每一個(gè)test method被執(zhí)行之后被Test Runner所執(zhí)行。一般來說,Setup Attribute及Teardown Attribute被用來預(yù)備一些必須的objects(對象),例如database connection、等等。上面的程序代碼示范了使用這個(gè)attribute的方法。
ExpectedException Attributes簡介
有的時(shí)候,你希望你的程序在某些特殊的條件下會產(chǎn)生一些特定的exception。要用Unit Test來測試程序是否如預(yù)期的產(chǎn)生exception,你可以用一個(gè)try..catch的程序區(qū)段來catch(捕捉)這個(gè)exception,然后再設(shè)一個(gè)boolean的值來證明exception的確發(fā)生了。這個(gè)方法固然可行,但是太花費(fèi)功夫。事實(shí)上,你應(yīng)該使用這個(gè) ExpectedException attribute來標(biāo)示某個(gè)method應(yīng)該產(chǎn)生哪一個(gè)exception,如同下面的范例所示:
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
[Test]
[ExpectedException(typeof(InvalidOperationException))]
public void Test1()
{
// Do something that throws an InvalidOperationException
}
}
}
如果上面的程序被執(zhí)行的時(shí)候,如果一旦exception發(fā)生,而且這個(gè)exception的type(類型信息)是 InvalidOperationException 的話,這個(gè)test會順利通過驗(yàn)證。如果你預(yù)期你的程序代碼會產(chǎn)生多個(gè)exception的話,你也可以一次使用多個(gè) ExpectedException attribute。但是,一個(gè)test method應(yīng)該只測試一件事情,一次測試多個(gè)功能是不好的做法,你應(yīng)該盡量避免之。另外,這個(gè)attributes并不會檢查inheirtance的關(guān)系,也是說,如果你的程序代碼產(chǎn)生的exception是繼承自InvalidOperationException 的subclass(子類化)的話,這個(gè)test執(zhí)行的時(shí)候?qū)⒉粫ㄟ^驗(yàn)證。簡而言之,當(dāng)你使用這個(gè)attribute的時(shí)候,你要明確的指明所預(yù)期的 exception是哪個(gè)type(類型信息)的。
Ignore Attributes簡介
這個(gè)attribute你大概不會經(jīng)常用的,但是一旦需要的時(shí)候,這個(gè)attribute是很方便使用的。你可以使用這個(gè)attribute來標(biāo)示某個(gè)test method,叫Test Runner在執(zhí)行的時(shí)候,略過這個(gè)method不要執(zhí)行。使用這個(gè)Ignore attribute的方法如下:
namespace UnitTestingExamples
{
using System;
using NUnit.Framework;
[TestFixture]
public class SomeTests
{
[Test]
[Ignore("We're skipping this one for now.")]
public void TestOne()
{
// Do something...
}
}
}
如果你想要暫時(shí)性的comment out一個(gè)test method的話,你應(yīng)該考慮使用這個(gè)attribute。這個(gè)attribute讓你保留你的test method,在Test Runner的執(zhí)行結(jié)果里面,也會提醒你這個(gè)被略過的test method的存在。
NUnit Assert Class簡介
除了以上所提到的這些用來標(biāo)示測試程序所在的attributes之外,NUnit還有一個(gè)重要的class你應(yīng)該要知道如何使用。這個(gè)class是Assert class。Assert class提供了一系列的static methods,讓你可以用來驗(yàn)證主要程序的結(jié)果與你所預(yù)期的是否一樣。Assert class代替了舊的Assertion class,下面是這個(gè)類的方法:
Assert.IsTrue( bool );
Assert.IsFalse( bool );
Assert.IsNull( bool );
Assert.IsNotNull( bool );
Assert.AreSame( object, object )
Assert.AreEqual( object, object );
Assert.AreEqual( int, int );
Assert.AreEqual( float, float, float );
Assert.AreEqual( double, double, double );
Assert.Fail();