• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 軟件測試NUnit 快速入門

    發表于:2010-02-26來源:作者:點擊數: 標簽:軟件測試nunitNUnitNunitNUNIT
    軟件測試 NUnit 快速入門 注: 本頁是基于原來的QuickStart.doc文檔,你可以在早期的NUnit發布中找到它。已經指出它并不是一個非常好的 TDD 實例。盡管如此,我們仍然將它保留在文檔中,因為它的的確確描述了使用NUnit的基

    軟件測試NUnit 快速入門

    注:本頁是基于原來的QuickStart.doc文檔,你可以在早期的NUnit發布中找到它。已經指出它并不是一個非常好的TDD實例。盡管如此,我們仍然將它保留在文檔中,因為它的的確確描述了使用NUnit的基礎。我們會在以后的版本中重新審查或替換它。

    讓我們從一個簡單的實例開始吧。假設我們正在編寫一個空應用程序,并且我們有一個基本的領域類-Aclearcase/" target="_blank" >ccount。Account提供了儲蓄,取款,以及轉帳等操作。Account類可能如下:

    namespace bank
    {
      public class Account
      {
        private float balance;
        public void Deposit(float amount)
        {
          balance+=amount;
        }
    
        public void Withdraw(float amount)
        {
          balance-=amount;
        }
    
        public void TransferFunds(Account destination, float amount)
        {
        }
    
        public float Balance
        {
          get{ return balance;}
        }
      }
    }

    現在讓我們為此類編寫第一個測試-AccountTest。我們即將測試的第一個方法是TransferFunds。

    namespace bank
    {
      using NUnit.Framework;
    
      [TestFixture]
      public class AccountTest
      {
        [Test]
        public void TransferFunds()
        {
          Account source = new Account();
          source.Deposit(200.00F);
          Account destination = new Account();
          destination.Deposit(150.00F);
    
          source.TransferFunds(destination, 100.00F);
          Assert.AreEqual(250.00F, destination.Balance);
          Assert.AreEqual(100.00F, source.Balance);
    	
        }
      }
    }

    我們注意到的第一件事情就是此類包含一個[TestFixture]屬性與之關聯-這是一種描述類包含測試代碼的方法(此屬性可以被繼承)。此類必須為public,并且對于其超類沒有任何限制。此類也必須有個一缺省的構造子。

    此類包含一個唯一的方法-TransferFunds,而且有一個[Test]屬性與之關聯-它標志了該方法是一個測試方法。測試方法必須返回void,并且不能帶有參數。在我們的測試方法中,我們對一個需要測試的對象進行了普通的初始化,執行以測試的業務方法,并且檢查了業務對象的狀態。Assert類定義了一組方法,這些方法用來檢查前置條件,在我們的例子里,我們使用AreEqual方法保證在轉帳之后,2個帳戶都有正確的余額(本方法有許多重載方法,在本示例中的版本有如下參數:第一個參數是一個期望值,第二個參數是實際值)。

    編譯并運行此實例。假設你已經將你的測試代碼編譯為一個bank.dll。啟動NUnit GUI(安裝文件會在桌面和“Program Files"上創建一個快捷方式)。在GUI啟動之后,選擇File->Open菜單,并指向bank.dll所在的路徑,在”Open“對話框打開選擇該文件。當bank.dll文件加載之后,你 會在左邊的面板上看到一個測試樹形結構 ,在右邊會有一組狀態。點擊Run按鈕,狀態條以及測試樹的TransferFunds節點會變紅-我們的測試失敗了?!盓rror and Failures"面板顯示如下信息:

        TransferFunds : expected <250> but was <150>

    而且,棧跟蹤面板會報告測試代碼中的失敗之處:

        at bank.AccountTest.TransferFunds() in C:\nunit\BankSampleTests\AccountTest.cs:line 17

    這正是我們期望的:測試失敗是因為我們并沒有實現TransferFunds方法?,F在我們讓它工作吧。不要關閉此GUI,返回你的IDE并修復此代碼,讓你的TransferFunds方法如下:

    public void TransferFunds(Account destination, float amount)
    {
    	destination.Deposit(amount);
    	Withdraw(amount);
    }

    現在,重新編譯代碼,再一次點擊GUI上的按鈕-狀態條以及測試樹變綠了。(注意GUI是如何為您重新加載程序集的;我們會一直打開GUI,并在IDE中繼續編寫代碼,寫出更多的測試)。

    讓我們在Account代碼里加入一些錯誤的檢查。我們為帳戶加入最小的余額,保證銀行可以繼續讓他們的錢可以支付最小額度的透支。在Account類里增加一個最小余額的屬性:

    private float minimumBalance = 10.00F;
    public float MinimumBalance
    {
    	get{ return minimumBalance;}
    }

    我們使用一個異常來描繪一個透支:

    namespace bank
    {
      using System;
      public class InsufficientFundsException : ApplicationException
      {
      }
    }

    在AccountTest類里加入一個新的方法:

    [Test]
    [ExpectedException(typeof(InsufficientFundsException))]
    public void TransferWithInsufficientFunds()
    {
    	Account source = new Account();
    	source.Deposit(200.00F);
    	Account destination = new Account();
    	destination.Deposit(150.00F);
    	source.TransferFunds(destination, 300.00F);
    }

    本測試處理[Test]屬性,還有一個[ExpectedException ]屬性與之關聯-這是一種用來描述測試代碼期望某種特定異常的方式。如果這種異常在執行的過程中沒有拋出-測試就失敗。編譯你的代碼并返回到GUI。在你編譯測試代碼的同時,GUI變灰,并且收緊測試樹,因為測試還沒有運行(當測試樹結構改變時,GUI會觀察測試的程序集的改變,并更新它自己-例如,加入新的測試等)。點擊“Run”按鈕-我們又有一個紅色的狀態條。我們會得到如下失?。?

        TransferWithInsufficentFunds : InsufficientFundsException was expected

    讓我們再一次修復Account代碼,按如下方法修改TransferFunds:

    public void TransferFunds(Account destination, float amount)
    {
    	destination.Deposit(amount);
    	if(balance-amount<minimumBalance)
    		throw new InsufficientFundsException();
    	Withdraw(amount);
    }

    編譯并運行測試-綠色的狀態條。成功了!但是等等,看看我們剛才編寫的代碼,我們會發現銀行可能在每個沒有成功的轉帳操作失去一筆錢。讓我們編寫一個測試來證明我們的疑慮,增加如下測試方法:

    [Test]
    public void TransferWithInsufficientFundsAtomicity()
    {
    	Account source = new Account();
    	source.Deposit(200.00F);
    	Account destination = new Account();
    	destination.Deposit(150.00F);
    	try
    	{
    		source.TransferFunds(destination, 300.00F);
    	}
    	catch(InsufficientFundsException expected)
    	{
    	}
    
    	Assert.AreEqual(200.00F,source.Balance);
    	Assert.AreEqual(150.00F,destination.Balance);
    }

    我們正測試業務方法的事務屬性-要么都成功,要么都失敗。編譯并運行-紅條。OK,我們已經讓$300.00蒸發了((1999.com déjà vu?)-源帳戶有一個正確余額150.00,但是目標帳戶則是$450.00.我們如何修復?我們僅需要將最小余額檢查調用放在更新的前面即可:

    public void TransferFunds(Account destination, float amount)
    {
    	if(balance-amount<minimumBalance) 
    		throw new InsufficientFundsException();
    	destination.Deposit(amount);
    	Withdraw(amount);
    }

    如果Withdraw()方法拋出另外一個異常怎么辦?我們應該在捕獲代碼段中執行一個追加的業務,或是依賴我們的事務管理器來恢復對象的狀態?關于這點,我們需要回答一些問題,但不是現在。同時,我們應該對失敗的測試最些什么呢?刪除它?一個比較好的方式是暫時忽略它,在測試代碼中加入如下屬性:

    [Test]
    [Ignore("Decide how to implement transaction management")]
    public void TransferWithInsufficientFundsAtomicity()
    {
    	// code is the same
    }

    編譯并運行-黃色的狀態條。點擊“Tests Not Run”,在列表里你會看到e bank.AccountTest.TransferWithInsufficientFundsAtomicity() ,而且帶有測試忽略的原因:

    看一下我們的測試代碼,我們會發現某些重構是有順序的。所有測試方法都共享一組通用的測試對象。我們將這個初始化代碼提取到一個setup方法里,并在所有測試中重用它。我們測試類的重構版本如下:

     

    namespace bank
    {
      using System;
      using NUnit.Framework;
    
      [TestFixture]
      public class AccountTest
      {
        Account source;
        Account destination;
    
        [SetUp]
        public void Init()
        {
          source = new Account();
          source.Deposit(200.00F);
          destination = new Account();
          destination.Deposit(150.00F);
        }
    
        [Test]
        public void TransferFunds()
        {
          source.TransferFunds(destination, 100.00f);
          Assert.AreEqual(250.00F, destination.Balance);
          Assert.AreEqual(100.00F, source.Balance);
        }
    
        [Test]
        [ExpectedException(typeof(InsufficientFundsException))]
        public void TransferWithInsufficientFunds()
        {
          source.TransferFunds(destination, 300.00F);
        }
    
        [Test]
        [Ignore("Decide how to implement transaction management")]
        public void TransferWithInsufficientFundsAtomicity()
        {
          try
          {
            source.TransferFunds(destination, 300.00F);
          }
          catch(InsufficientFundsException expected)
          {
          }
    
          Assert.AreEqual(200.00F,source.Balance);
          Assert.AreEqual(150.00F,destination.Balance);
        }
      }
    }

    盡管Init方法有一個通用的初始化代碼,但是它返回一個void類型,沒有參數。它標記為[SetUp]屬性。編譯并運行-同樣是黃色的狀態條。

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>