您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > Nunit
nunit使用資料
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2012/12/14 15:03:43 ] 推薦標(biāo)簽:

本文講述了如何用NUnit書寫和組織測(cè)試代碼的步驟。

簡(jiǎn)單的Test Case
書寫測(cè)試代碼的步驟:

1.  創(chuàng)建TestCase的一個(gè)實(shí)例;

2.  Override方法RunTest();

3.  如要檢查某值,則調(diào)用Assert。

例如,測(cè)試“兩個(gè)Money對(duì)象之和與包含它們之和的對(duì)象相等”的測(cè)試代碼如下:

public void TestSimpleAdd() {

    Money m12CHF= new Money(12, "CHF");

    Money m14CHF= new Money(14, "CHF");

    Money expected= new Money(26, "CHF");

    Money result= m12CHF.Add(m14CHF);

    Assert(expected.Equals(result));

}

如果要寫的測(cè)試與以前寫的測(cè)試非常像,那么寫一個(gè)Fixture來(lái)代替。如果想在一個(gè)測(cè)試中運(yùn)行更多的東西,創(chuàng)建一個(gè)Suite。

Fixture
如果有兩個(gè)或兩個(gè)以上的測(cè)試作用于相同或類似的對(duì)象集,我們?cè)撛趺崔k呢?測(cè)試作用于一個(gè)已知的對(duì)象集,這個(gè)對(duì)象集被稱為fixture。一般建立這個(gè)fixture的時(shí)間比實(shí)際測(cè)試的時(shí)間多得多。

       當(dāng)有個(gè)公共的fixture時(shí),我們可以這么做:

1.  創(chuàng)建TestCase的子類。

2.  為fixture的每部分加入一個(gè)實(shí)例變量。

3.  Override SetUp()初始化這些變量。

4.  Override TearDown()釋放任何在SetUp中分配的資源。

例如,編寫用來(lái)與12 Swiss Francs,14 Swiss Francs和28 US Dollars不同組合一起工作的TestCase時(shí),首先創(chuàng)建一個(gè)fixture:

public class MoneyTest: TestCase {

    private Money f12CHF;

    private Money f14CHF;

    private Money f28USD;

  

    protected override void SetUp() {

        f12CHF= new Money(12, "CHF");

        f14CHF= new Money(14, "CHF");

        f28USD= new Money(28, "USD");

    }

}

一旦準(zhǔn)備好Fixture,可書寫任意多的測(cè)試用例。

Test Case
當(dāng)有一個(gè)Fixture如何書寫和調(diào)用一個(gè)獨(dú)立的Test Case呢?書寫一個(gè)沒(méi)有的fixture測(cè)試用例是非常簡(jiǎn)單的——只需在TestCase 的一個(gè)子類中override RunTest。為一個(gè)Fixture書寫測(cè)試用例是同樣的方法,通過(guò)為set up代碼制造一個(gè)TestCase的子類,然后為每個(gè)獨(dú)立的測(cè)試用例制造不同的子類。然而,不久你會(huì)注意到這些代碼中的大部分成為了語(yǔ)法的犧牲品。

NUnit為書寫一個(gè)基于Fixture的測(cè)試提供了簡(jiǎn)明的方法:

1.  在fixture類中書寫一個(gè)public的測(cè)試方法。在此,必須確保這個(gè)方法是public的,否則它將不能通過(guò)reflection被調(diào)用。

2.  創(chuàng)建這個(gè)TestCase的一個(gè)實(shí)例,并把這個(gè)測(cè)試方法的名字傳給它的constructor。

例如,測(cè)試一個(gè)Money對(duì)象與另一個(gè)MoneyBag的和:

public void TestMoneyMoneyBag() {

    // [12 CHF] + [14 CHF] + [28 USD] == {[26 CHF][28 USD]}

    Money bag[]= { new Money(26, "CHF"), new Money(28, "USD") };

    MoneyBag expected= new MoneyBag(bag);

    AssertEquals(expected, f12CHF.Add(f28USD.Add(f14CHF)));

}

創(chuàng)建MoneyTest的實(shí)例:

new MoneyTest("TestMoneyMoneyBag")

當(dāng)這個(gè)測(cè)試運(yùn)行起來(lái)時(shí),測(cè)試會(huì)查找測(cè)試方法的名字并調(diào)用它。一旦有多個(gè)測(cè)試,可以把他們組織成一個(gè)Suite。

Suite
如何一次進(jìn)行多個(gè)測(cè)試?NUnit提供了TestSuite,它可以一次運(yùn)行任意數(shù)目的測(cè)試。例如,運(yùn)行一個(gè)單獨(dú)的測(cè)試用例:

TestResult result= (new MoneyTest("TestMoneyMoneyBag")).Run();

創(chuàng)建一個(gè)有兩個(gè)測(cè)試用例的suite并且一次運(yùn)行它們:

TestSuite suite= new TestSuite();

suite.AddTest(new MoneyTest("TestMoneyEquals"));

suite.AddTest(new MoneyTest("TestSimpleAdd"));

TestResult result= suite.Run();

另一種方法是讓NUnit從一個(gè)TestCase吸取出一個(gè)suite,只需把你的TestCase傳給TestSuite的constructor即可:

TestSuite suite= new TestSuite(typeof(MoneyTest));

TestResult result= suite.Run();

當(dāng)創(chuàng)建只包含一個(gè)測(cè)試用例子類的suite時(shí),使用手工方法。否則采用自動(dòng)方法,它避免了在每增加新的測(cè)試用例時(shí)都要改變suite的創(chuàng)建代碼。

TestSuites并不是只能包含TestCase類。它可以包含實(shí)現(xiàn)了ITest的任意對(duì)象。例如,你可以在你的代碼中創(chuàng)建一個(gè)TestSuite,同樣我也可以在我的代碼中這樣做。那么我們可以創(chuàng)建一個(gè)包含它們的TestSuite來(lái)一次運(yùn)行它們:

TestSuite suite= new TestSuite();

suite.AddTest(Kent.Suite());

suite.AddTest(Erich.Suite());

TestResult result= suite.Run();

TestRunner
如何運(yùn)行這些測(cè)試并收集結(jié)果呢?NUnit提供了定義suite運(yùn)行和顯示結(jié)果的工具。為了使你的suite對(duì)于TestRunner時(shí)可存取的,必須定義一個(gè)返回測(cè)試suite 的static property Suite。

例如,在MoneyTest中加入以下代碼使MoneyTest suite對(duì)于TestRunner可用:

public static ITest Suite {

  get {

    TestSuite suite= new TestSuite();

    suite.addTest(new MoneyTest("TestMoneyEquals"));

    suite.addTest(new MoneyTest("TestSimpleAdd"));

    return suite;

  }

}

如果一個(gè)TestCase類不定義一個(gè)suite方法,TestRunner將自動(dòng)產(chǎn)生用所有方法來(lái)填充的suite,并在這些方法名字前加上前綴“Test”。NUnit提供兩種TestRunner:GUI和字符版本。

GUI窗口包含:填寫包含測(cè)試類的DLL 或EXE名字的文本框;填寫在DLL 或EXE中擁有Suite屬性的類名。如下圖:


在reload已編譯類的動(dòng)態(tài)編程環(huán)境中,你可以不需要NUnit窗口。在其他環(huán)境中,你必須為每次運(yùn)行不斷重啟GUI版本。這是非常乏味和費(fèi)時(shí)的工作,這在將來(lái)的版本中會(huì)得到改進(jìn)。

同樣,有一個(gè)NUnit的批處理接口。為了使用命令行的NUnit,可以在系統(tǒng)提示符下鍵入NUnitConsole后跟包含Suite屬性的類所在的裝配體。例如,使用批處理TestRunner測(cè)試MoneyTest:

C:NUnitConsole NUnit.Samples.Money.MoneyTest,NUnitSamples.dll

批處理接口將結(jié)果以文本的方式輸出。另一個(gè)可選方法是在你的TestCase類的main方法中調(diào)用批處理接口。如下:

public static void Main(String[] args) {

    NUnit.TextUI.TestRunner.Run(Suite);

}

這樣,只需在系統(tǒng)提示符下鍵入MoneyTest 可運(yùn)行測(cè)試。

軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd