一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

NUNIT

 barbarossia 2006-11-08

 

NUNIT

1.       NUNIT簡介

NUnit是一個(gè)為Net準(zhǔn)備的自動(dòng)化單元測(cè)試框架,它的作用就是幫助你方便的完成單元測(cè)試工作,同鼎鼎有名的JUnit一樣,都是xUnit家族的成員。它的下載地址是:http://www.。

NUnit Framework(NUnit 單元測(cè)試框架)簡介
.NET
引進(jìn)了一個(gè)新的程序開發(fā)的概念 ─ Attributes(屬性),解決了這個(gè)煩人的問題。Attributes讓你可以在你的程序代碼之上再加入metadata(元數(shù)據(jù),描述程序代碼的 資料)。一般來說Attributes不會(huì)影響到主要程序代碼的執(zhí)行,其功能是在你所寫程序代碼之上添加了額外的信息。Attributes主要使用在 documenting your code(注釋你的程序代碼),但是Attributes也可以用來提供有關(guān)Assembly的額外信息,其它的程序就算沒有見過這個(gè)Assembly, 也可以使用這些信息。這基本上就是NUnit 2.1所作的事。在NUnit 2.1里面,有一個(gè)Test Runner Application(負(fù)責(zé)執(zhí)行Unit Tests的程序),這個(gè)Test Runner會(huì)掃描你已經(jīng)compile(編譯)好的程序代碼,并且從Attribute里面知道哪些classestest classes,哪些methods是需要執(zhí)行的test methods. 然后,Test Runner使用.NETReflection技術(shù)(在.NET Framework中提供了System.Reflection命名空間,這樣就使得我們可以方便的獲得.NET組件的信息。當(dāng)你想獲得正在使用的組件的 詳細(xì)信息,或者在運(yùn)行期間查詢一個(gè)組件信息的時(shí)候,這個(gè)功能將變的十分有用)來執(zhí)行這些test methods。因?yàn)檫@個(gè)原因,你就不再需要讓你的test classes繼承自所謂的common base class。你唯一需要作的事,就是使用正確的Attribute來描述你的test classestest methods。NUnit提供了許多不同的attributes,讓你可以自由的寫你想要的unit tests。這些attributes可以用來定義test fixtures(見下一段解釋)、test methods,以及setupteardownmethods(預(yù)備及善后工作的methods)。除此之外,還有其它的attributes可以 來設(shè)定預(yù)期發(fā)生的exceptions,或者要求Test Runner跳過某些test method不執(zhí)行。

 

 TestFixture Attribute簡介
  
  TestFixture attribute
主要是用在class上,其作用是標(biāo)志該class含有需要執(zhí)行的test methods。當(dāng)你在一個(gè)class的定義里加上這個(gè)attribute,Test Runner就會(huì)檢查該class,看看這個(gè)class是否含有test methods。底下這段程序代碼示范了如何使用TestFixture Attribute。
  
  namespace UnitTestingExamples
  {
  
  using System;
   using NUnit.Framework;
  
  [TestFixture]
   public class SomeTests
   {
   }
  }

  使用TextFixture Attributeclass需要符合另一項(xiàng)唯一附加的限制,就是需要有一個(gè)publicdefault constructor(或者是沒有定義任何的constructor,這其實(shí)是相同的意思)。

 

TestFixtureSetUp TestFixtureTearDown簡介     
  
這兩個(gè)主 要用在TestFixture里面,其作用是提供一組函數(shù)執(zhí)行任何測(cè)試運(yùn)行之前(TestFixtureSetUP)和最后一個(gè)測(cè)試執(zhí)行后 TestFixtureTearDown)。每一個(gè)TestFixture只能有一個(gè)TestFixtureSetUp方法和 TestFixtureTearDown方法。如果一個(gè)以上的TestFixtureSetUpTestFixtureTearDown方法,可以通過 編譯但是不會(huì)執(zhí)行。注意一個(gè)TestFixture可以擁有一個(gè)TestFixtureSetUp和一個(gè)SetUp,也可以擁有一個(gè) TestFixtureTearDown和一個(gè)TearDown方法。
    TestFixtureSetUp
TestFixtureTearDown 被用在不方便使用SetUpTearDown方法。   
  
一般情況使用 SetUp TearDown attributes。

底下這段程序代碼示范了如何使用TestFixtureSetUp/TestFixtureTearDown
  
  namespace UnitTestingExamples
  {
  
   using System;
   using NUnit.Framework;
  
  [TestFixture]
  public class SomeTests
  {
  [TestFixtureSetUp]
  public void RunBeforeAllTests() 
  {  
  Console.WriteLine( “TestFixtureSetUp” );   
  }   
  

````[TestFixtureTearDown]  
  public void RunAfterAllTests()   
  {   
  Console.WriteLine( “TestFixtureTearDown” );   
  }   

```  [SetUp]   
  public void RunBeforeEachTest()   
  {   
  Console.WriteLine( “SetUp” );   
  }
  
  [TearDown]   
  public void RunAfterEachTest()   
  {   
  Console.WriteLine( “TearDown” );   
  }
  
  [Test]   
  public void Test1()   
  {  
  Console.WriteLine( “Test1” );   
  }   

 [Test]   
  public void Test2()   
  {  
  Console.WriteLine( “Test2” );   
  }   

  }   
  }      
 
  
程序的輸出將是下面的結(jié)果::
  
  TestFixtureSetUp
  
  SetUp
  
  Test1
  
  TearDown
  
  SetUp
  
  Test2
  
  TearDown
  
  TestFixtureTearDown
  
  
如果Test2單獨(dú)執(zhí)行輸出的結(jié)果將是:
  
  TestFixtureSetUp
  
  SetUp
  
  Test2
  
  TearDown
  
  TestFixtureTearDown

 

Test Attribute簡介
  
  Test attribute
主要用來標(biāo)示在text fixture中的method,表示這個(gè)method需要被Test Runner application所執(zhí)行。有Test attributemethod必須是public的,并且必須return void,也沒有任何傳入的參數(shù)。如果沒有符合這些規(guī)定,在Test Runner GUI之中是不會(huì)列出這個(gè)method的,而且在執(zhí)行Unit Test的時(shí)候也不會(huì)執(zhí)行這個(gè)method。上面的程序代碼示范了使用這個(gè)attribute的方法。

 

 SetUp Teardown Attributes簡介
  
  
在寫Unit Tests的時(shí)候,有時(shí)你會(huì)需要在執(zhí)行每一個(gè)test method之前(或之后)先作一些預(yù)備或善后工作。當(dāng)然,你可以寫一個(gè)privatemethod,然后在每一個(gè)test method的一開頭或最末端呼叫這個(gè)特別的method?;蛘?,你可以使用我們要介紹的SetUpTeardown Attributes來達(dá)到相同的目的。如同這兩個(gè)Attributes的名字的意思,有Setup Attributemethod會(huì)在該TextFixture中的每一個(gè)test method被執(zhí)行之前先被Test Runner所執(zhí)行,而有Teardown Attributemethod則會(huì)在每一個(gè)test method被執(zhí)行之后被Test Runner所執(zhí)行。一般來說,Setup AttributeTeardown Attribute被用來預(yù)備一些必須的objects(對(duì)象),例如database connection、等等。上面的程序代碼示范了使用這個(gè)attribute的方法。

 

 ExpectedException Attributes簡介
  
  
有的時(shí)候,你希望你的程序在某些特殊的條件下會(huì)產(chǎn)生一些特定的exception。要用Unit Test來測(cè)試程序是否如預(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è)exceptiontype(類型信息) InvalidOperationException 的話,這個(gè)test就會(huì)順利通過驗(yàn)證。如果你預(yù)期你的程序代碼會(huì)產(chǎn)生多個(gè)exception的話,你也可以一次使用多個(gè) ExpectedException attribute。但是,一個(gè)test method應(yīng)該只測(cè)試一件事情,一次測(cè)試多個(gè)功能是不好的做法,你應(yīng)該盡量避免之。另外,這個(gè)attributes并不會(huì)檢查inheirtance 關(guān)系,也就是說,如果你的程序代碼產(chǎn)生的exception是繼承自InvalidOperationException subclass(子類化)的話,這個(gè)test執(zhí)行的時(shí)候?qū)⒉粫?huì)通過驗(yàn)證。簡而言之,當(dāng)你使用這個(gè)attribute的時(shí)候,你要明確的指明所預(yù)期的 exception是哪個(gè)type(類型信息)的。

 

 Ignore Attributes簡介
  
  
這個(gè)attribute你大概不會(huì)經(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é)果里面,也會(huì)提醒你這個(gè)被略過的test method的存在。

 

 NUnit Assert Class簡介
  
  
除了以上所提到的這些用來標(biāo)示測(cè)試程序所在的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();
  
  
使用這個(gè)類的示例如下:
  
  namespace UnitTestingExamples
  {
   using System;
   using NUnit.Framework;
  
   [TestFixture]
   public class SomeTests
   {
   [Test]
  
   public void TestEventLengthString()
  
   {
  
   // Should return true
  
   bool bResult1 = Class1.CheckPalindrome("ABCCBA");
  
   Assert.IsTrue(bResult1);
  
   // Should return false
  
   bool bResult2 = Class1.CheckPalindrome("ABCDBA");
  
   Assert.IsFalse(bResult2);
  
   }
  
   [Test]
  
   public void TestOddLengthString()
  
   {
  
   //should return true;
  
   Assert.IsTrue(Class1.CheckPalindrome("ABCDCBA"));
  
   // Should return false
  
   Assert.IsFalse(Class1.CheckPalindrome("ABCDEBA"));
  
   }
  
  }
  }

 

好,現(xiàn)在我們已經(jīng)討論過寫Unit Tests的基本步驟及方法,現(xiàn)在讓我們來看看如何執(zhí)行你所寫的Unit Tests。事實(shí)上非常簡單。NUnit里面有兩個(gè)已經(jīng)寫好的Test Runner applications:一個(gè)是窗口GUI程序,一個(gè)是console XML(命令列)程序。你可以自由選擇你所喜歡的方式,基本上是沒有什么差別的。
  
如果你要使用窗口GUITest Runner app,你只需要執(zhí)行該程序,然后告訴它你要執(zhí)行的test method所在的assembly位置。這個(gè)包含有你所寫test methodsassembly是那一個(gè)class library(或是executable*.dll*.exe) assembly,其中含有前面談到的Test Fixtures。當(dāng)你告訴Test Runner你的assembly所在的位置,Test Runner會(huì)自動(dòng)load這個(gè)asembly,然后把所有的classtest methods都列在窗口的左欄。當(dāng)你按下’Run’按鍵時(shí),你就會(huì)自動(dòng)執(zhí)行所有列出來的test methods。你也可以double click其中的一個(gè)test class,或是一個(gè)test method之上,這樣會(huì)自動(dòng)只執(zhí)行該class或是該method。
  
底下是窗口GUI Test Runner執(zhí)行時(shí)的樣子:
  

2.       基本用法

a.       目前項(xiàng)目中的用法

1     初始化

[SetUp]

         public void InitializeOperands()

         {

              pub=new PUB();

                                   

}

可以對(duì)需要初始化才能使用的類,進(jìn)行初始化。例如,與數(shù)據(jù)庫相關(guān)的操作。

 

2    簡單測(cè)試

[Test]

         public void ReqToRes_Test()

         {

              string reqfile="REQ-CKI-CIQU-123456789-20060317.csv";

              string resfile=null;

              bool returnVal=pub.ReQToRes(reqfile,ref resfile);

              Assert.IsFalse(returnVal);

             

}

 

3   對(duì)拋出的異常做測(cè)試

[Test]

         [ExpectedException(typeof(Exception))]

         public void Check_bgdh_test()

         {

              string b="125698300";

              ciq.Check_bgdh(b);

             

}

 

b.       未使用的用法

 [TestFixtureSetUp]

[TestFixtureTearDown]

當(dāng)整個(gè)測(cè)試框架都需要引用某個(gè)類是,可以在 [TestFixtureSetUp]中將它初始化,然后在[TestFixtureTearDown]中將它釋放。

 

c.       不建議使用:

[Ignore("We‘re skipping this one for now.")],因?yàn)檫@樣可能會(huì)忽略這個(gè)被測(cè)函數(shù)。

 

3.       解決方案

a.新生成一個(gè)解決方案

b.添加測(cè)試項(xiàng)目

c.設(shè)置屬性

 

d.NUNITGUI環(huán)境下調(diào)試

通過【運(yùn)行】按鈕,在NUNITGUI下調(diào)試

 

 

e.注意:這種方法在調(diào)試過程中如果發(fā)生錯(cuò)誤,必須在原來的項(xiàng)目中修改,然后再將源文件復(fù)制到NUNIT項(xiàng)目中再進(jìn)行測(cè)試。否則的話,容易發(fā)生混淆。

 

4.       其它的解決方案

a.       在原有的解決方案上新增加一個(gè)項(xiàng)目

b.       添加一個(gè)測(cè)試類

c.       導(dǎo)入所需要的引用

包括測(cè)試類:NUNIT.FRAMEWORD和需要被測(cè)試的項(xiàng)目

 

d.       添加引用:

e.       接下來就可以測(cè)試了。

 

f.這種測(cè)試方法比較適用于測(cè)試人員。

 

5.       測(cè)試用例

a.  條件判斷

1:對(duì)參數(shù)為NULL值進(jìn)行測(cè)試

         [Test]

         public void CheckFileName_Test_null()

         {

              string reqfile=null;

              string asktype=null;

              bool returnVal=pub.CheckFileName(ref reqfile,ref asktype);

              Console.WriteLine(asktype);

              Assert.IsFalse(returnVal);

         }

2:對(duì)參數(shù)為空字符串進(jìn)行測(cè)試

         [Test]

         public void CheckFileName_Test_empty()

         {

              string reqfile="";

              string asktype="DCL";

              bool returnVal=pub.CheckFileName(ref reqfile,ref asktype);

              Console.WriteLine(asktype);

              Assert.IsFalse(returnVal);

         }

3:對(duì)不合法的參數(shù)進(jìn)行測(cè)試(報(bào)關(guān)單號(hào)不足9位)

         [Test]

         public void CheckFileName_Test1()

         {

              string reqfile="REQ-CKI-DCL-12345679-20060317.csv";

              string asktype= "DCL";

              bool returnVal=pub.CheckFileName(ref reqfile,ref asktype);

              Console.WriteLine(asktype);

              Assert.IsFalse(returnVal);

//            Assert.IsTrue(returnVal);

         }

4:對(duì)不合法的參數(shù)進(jìn)行測(cè)試2(日期長度不符合)

[Test]

         public void CheckFileName_Test2()

         {

              string reqfile="REQ-CKI-DCL-123456789-2006031.csv";

              string asktype= "DCL";

              bool returnVal=pub.CheckFileName(ref reqfile,ref asktype);

              Console.WriteLine(asktype);

              Assert.IsFalse(returnVal);

         }

 

b.  數(shù)據(jù)庫操作

         [Test]

         public void getConnectionSQl_test()

         {

              bool returnVal=pub.GetConnectionSQL();

              Assert.IsTrue(returnVal);

         }

對(duì)數(shù)據(jù)庫操作的測(cè)試,需要對(duì)數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行修改,才可以對(duì)不同的數(shù)據(jù)進(jìn)行測(cè)試。

 

6.對(duì)今后的項(xiàng)目提出的一些建議和改善:

a.       需求分析

首先,將項(xiàng)目需求進(jìn)行分析,從中搞清楚輸入和輸出,流程圖,錯(cuò)誤信息等。最好將它文檔化。

 

例:FTP處理主要分為幾個(gè)功能

1.  顯示FTP目錄下需要處理的文件名:public string[] getFileList(string mask)

2.  將選中的文件下載到本地:public void download(string remFileName,string path)

輸入:需要下載的文件名:string remFileName,路徑:string path

輸出:在本地生成一個(gè)同名的文件

3.  將生成的回執(zhí)文件上傳:public void upload(string fileName)

將上傳的回執(zhí)文件改名:public void renameRemoteFile(string oldFileName,string newFileName)

4.  將請(qǐng)求文件在FTP上刪除:public void deleteRemoteFile(string fileName)

 

b.       函數(shù)細(xì)化

例:將選中的文件下載到本地:public void download(string remFileName,string path)

其中對(duì)下載作了3個(gè)重載函數(shù),以適應(yīng)于不同的需要。

a. public void download(string remFileName,string path)

下載到本地路徑

b. public void download(string remFileName,string path,string locFileName)

:下載到本地路徑,支持改名

c. public void download(string remFileName,//遠(yuǎn)程文件名

                        string locFileName,//本地文件名

                        Boolean resume)//是否續(xù)傳

:下載到本地路徑,支持改名,支持續(xù)傳

其中前兩個(gè)函數(shù)是對(duì)第三個(gè)函數(shù)的變種,都是調(diào)用第三個(gè)函數(shù),只是限制了某些功能。這樣可以增加函數(shù)的靈活性。

其中DOWNLOAD函數(shù)使用了如下幾個(gè)獨(dú)立的子函數(shù)來完成的

 

1.  LOGIN

if(!logined)

                   {   

                       login();

                           

     }

 

2.  生成SOCKET連接

Socket cSocket = createDataSocket();

 

3.  發(fā)送下載命令

sendCommand("RETR " + remFileName);

 

4.  接受數(shù)據(jù)

while(true) //開始下載

                   {

                       bytes = cSocket.Receive(buffer, buffer.Length, 0);

                       output.Write(buffer,0,bytes);

                       if(bytes <= 0)

                       {

                            break;

                       }

     }//while

 

5.  判斷是否下載完成

if (!isDownComplete())

                  {

                       throw new Exception(replay);

         }   

 

c.       異常處理

1.  自定義異常

a. 實(shí)現(xiàn)自己的異常類  MyImportantException

1: using System;
2:
3: public class MyImportantException:Exception
4: {
5:  public MyImportantException()
6:   :base() {}
7:
8:  public MyImportantException(string message)
9:   :base(message) {}
10:
11:  public MyImportantException(string message, Exception inner)
12:   :base(message,inner) {}
13: }

2.  異常的分類處理:引用上面一個(gè)例子,FTP下載是一個(gè)公用的函數(shù),而通過對(duì)它的細(xì)分,可以將它分為幾個(gè)較小的獨(dú)立的私有函數(shù)。所以自定義異常就可以在這里發(fā)揮作用,每個(gè)獨(dú)立的私有函數(shù)都可以拋出各自定義的異常,而在FTP下載這個(gè)公有函數(shù)中將捕獲被拋出的異常,并對(duì)它們進(jìn)行處理或者拋給它的上一級(jí)函數(shù)。

 

d. 通過對(duì)函數(shù)的細(xì)化,分解出一個(gè)個(gè)獨(dú)立的、只完成特定功能的函數(shù)。并且通過結(jié)構(gòu)化的異常處理可以使測(cè)試簡單化。

 

7.  總結(jié)

a.如果將UNIT作為測(cè)試用途的化,它可以起到自動(dòng)化的作用,減輕測(cè)試人員的工作量。如果發(fā)生功能改變或BUG修正,需要修改源代碼時(shí),利用自動(dòng)化測(cè)試可以大量減輕測(cè)試人員工作量。

建議:提供功能函數(shù)的接口給測(cè)試人員,這樣在不改變函數(shù)名的情況下,僅修改函數(shù)內(nèi)部的邏輯。而測(cè)試人員僅需要增加或修改測(cè)試用例,就可以保持新版本的測(cè)試。

b.如果將UNIT作為測(cè)試驅(qū)動(dòng)的話,就使得程序員對(duì)測(cè)試給予足夠的重視,從而可以編寫較高質(zhì)量的程序。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲一区二区精品免费视频| 国产又黄又爽又粗视频在线| 亚洲一区二区三区av高清| 一区二区三区日韩在线| 熟女一区二区三区国产| 麻豆看片麻豆免费视频| 九九热精品视频在线观看| 国产日韩欧美综合视频| 精品视频一区二区不卡| 亚洲综合天堂一二三区| 日韩一区二区三区在线日| 欧美又大又黄刺激视频| av免费视屏在线观看| 久久精品色妇熟妇丰满人妻91 | 欧美午夜不卡在线观看| 在线视频三区日本精品| 国产精品刮毛视频不卡| 亚洲精品国产主播一区| 久久精品偷拍视频观看| 99热在线精品视频观看| 国产一级内片内射免费看 | 日本淫片一区二区三区| 免费福利午夜在线观看| 国产成人国产精品国产三级| 大香蕉伊人一区二区三区| 性感少妇无套内射在线视频| 精品人妻一区二区三区免费看| 亚洲欧美日韩另类第一页| 伊人网免费在线观看高清版| 精品精品国产欧美在线| 色婷婷中文字幕在线视频| 亚洲精品成人午夜久久| 暴力性生活在线免费视频| 日韩女优精品一区二区三区| 男人把女人操得嗷嗷叫| 久久精品伊人一区二区| 亚洲日本韩国一区二区三区| 国产免费操美女逼视频| 色哟哟哟在线观看视频| 免费特黄一级一区二区三区| 五月婷婷综合激情啪啪|