程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Visual Studio 2008單元測試實踐

Visual Studio 2008單元測試實踐

編輯:.NET實例教程

單元測試作為直接對代碼的測試是整個軟件測試的基礎。在面向對象編程中,單元測試一般針對類來實施。Visual Studio 2008既支持對類的公開接口進行測試,也能對私有屬性和方法進行測試。在軟件開發過程中,程序員一般都不願意進行單元測試,認為單元測試要寫很多“無用”的代碼,“浪費”他們寶貴的開發時間。Visual Studio 2008提供了對單元測試的良好支持,只需要寫少量的代碼就可以完成單元測試,極大的提高了單元測試的效率。

 

       關鍵字:單元測試,Visual Studio 2008

 

  單元測試是在軟件開發過程中要進行的最低級別的測試活動,在單元測試活動中,軟件的獨立單元將在與程序的其他部分相隔離的情況下進行測試。

 

在一種傳統的結構化編程語言中,比如C,要進行測試的單元一般是函數或子過程。在象C++這樣的面向對象的語言中, 要進行測試的基本單元是類。對Ada語言來說,開發人員可以選擇是在獨立的過程和函數,還是在Ada包的級別上進行單元測試。單元測試的原則同樣被擴展到第四代語言(4GL)的開發中,在這裡基本單元被典型地劃分為一個菜單或顯示界面。

 

       單元測試不僅僅是作為無錯編碼的一種輔助手段在一次性的開發過程中使用,單元測試必須是可重復的,無論是在軟件修改,或是移植到新的運行環境的過程中。因此,所有的測試都必須在整個軟件系統的生命周期中進行維護。

 

Visual Studio 2008 單元測試功能介紹

 

一、測試代碼與被測代碼分離成獨立的兩個項目

 

單元測試中,測試的代碼不能對被測試的代碼施加影響。如果將測試代碼寫入被測試的代碼中,測試完成後再刪除的話,測試的正確性將得不到保證。因此,在Visual Studio 2008種提供了一種“Test Project”的項目,測試代碼寫在Test Project中,並且測試工程可以進行重復使用。

 

二、測試代碼的自動生成

 

書寫測試代碼是一件很煩瑣的事情,這些代碼沒有像程序代碼一樣具有“創造性”,因此該部分代碼可以進行自動化生成。Visual Studio 2008就提供了一個自動生成測試代碼的測試框架。利用Visual Studio 2008自動生成的代碼,只需要很少的改動就可以完成整個測試程序。

 

三、測試管理

 

Visual Studio 2008提供了測試列表來進行測試工作的管理工作,我們需要一個反映目前測試狀況的工具,那些測試通過了,那些沒有通過,應該提供一個列表來為我們改進測試手段,進行更全面的測試提供指導。

 

利用Visual Studio 2008來進行單元測試

  假設我們有一個類BankAccount,該類定義了一個銀行的賬戶,私有屬性_currentBalance是銀行儲戶的賬戶金額,depositMoney是存款方法,對帳戶增加一筆資金,makePayment是支付方法,對賬戶減少一筆資金。代碼如下:

 



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace BankAccountDemo.Business

...{

    class BankAccount

    ...{

        private float _currentBalance;

   public float CurrentBalance

        ...{

            get ...{ return _currentBalance; }

            set ...{ _currentBalance = value; }

        }

        public BankAccount(float initialBalance)

        ...{

            this._currentBalance = initialBalance;

        }

        public void depositMoney(float depositAmount)

        ...{

            this._currentBalance += depositAmount;

        }

        public void makePayment(float paymentAmount)

        ...{

            this._currentBalance -= paymentAmount;

        }

 

    }

}

要對BankAccount類進行單元測試,只需要在BankAccount的定義處鼠標右鍵,在菜單中選擇“Create Unit Tests”即可進入測試項目的創建工作。如下圖所示:

 

 

 

在彈出的創建單元測試的對話框中,對需要創建測試的方法和屬性進行選擇,然後點擊“OK”按鈕,如圖所示:

緊接著在出現的文本框中輸入測試項目的名稱“BankAccountDemo.Business.Tests”,點擊確定後,測試項目被創建。在這裡“BankAccountDemo.Business.”只是用於更好的對命名空間進行規劃,完全可以直接使用“BankAccountDemoTest”來作為測試項目的名字。
生成的測試代碼如下,為了緊湊的表現代碼,將注釋代碼作了刪除。

這個時候的代碼並不能開始測試,而需要我們按照測試用例的要求將測試用例的數據加入到測試方法中,並進行結果的比較,修改後的depositMoneyTest方法如下:

 

[TestMethod()]

public void depositMoneyTest()

{

    float initialBalance = 0F; // TODO: Initialize to an appropriate value

    BankAccount target = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

    float depositAmount = 100F; // TODO: Initialize to an appropriate value

    target.depositMoney(depositAmount);

    Assert.AreEqual(initialBalance + depositAmount, target.CurrentBalance, "Deposit Test: Deposit not applIEd correctly");

 }

 鼠標右鍵在depositMoneyTest方法內任意位置單擊,在彈出的菜單中選擇“Run Tests”,即可以對該方法進行測試。在“Test Results”窗口中顯示測試的結果,如下圖所示:

 

 

可以看出,Visual Studio 2008給我們提供了一個功能強大,操作簡單的單元測試功能。利用該功能,程序員在編寫代碼後,可以馬上對所編寫的類進行單元測試,通過了程序員自行組織的單元測試後再將代碼交給測試人員進行進一步測試。

 

總結:微軟將單元測試功能從Visual Studio 2005 Team System開始集成到開發環境中,是經過了微軟公司多年的實踐經驗證明的。如今,開發環境從以前的單一開發功能,將關注點分散到軟件的整個生命周期過程中來,已經成為一個ALM平台。軟件開發人員不僅需要做開發工作,而且需要對自己開發的代碼進行單元測試,不能將所有的問題全部拋給測試人員。測試人員可以將更多的精力放在系統一級的測試工作上面。



using BankAccountDemo.Business;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BankAccountDemo.Business.Tests

...{

    [TestClass()]

    public class BankAccountTest

    ...{

        private TestContext testContextInstance;

 

        public TestContext TestContext

        ...{

            get

            ...{

                return testContextInstance;

            }

            set

            ...{

                testContextInstance = value;

            }

        }

 

        Additional test attributes#region Additional test attributes

        #endregion

 

 

        [TestMethod()]

        public void CurrentBalanceTest()

        ...{

            float initialBalance = 0F; // TODO: Initialize to an appropriate value

            BankAccount target = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

            float expected = 0F; // TODO: Initialize to an appropriate value

            float actual;

            target.CurrentBalance = expected;

            actual = target.CurrentBalance;

            Assert.AreEqual(expected, actual);

            Assert.Inconclusive("Verify the correctness of this test method.");

        }

 

        [TestMethod()]

        public void makePaymentTest()

        ...{

            float initialBalance = 0F; // TODO: Initialize to an appropriate value

            BankAccount target = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

            float paymentAmount = 0F; // TODO: Initialize to an appropriate value

            target.makePayment(paymentAmount);

            Assert.Inconclusive("A method that does not return a value cannot be verifIEd.");

        }

 

        [TestMethod()]

        public void depositMoneyTest()

        ...{

            float initialBalance = 0F; // TODO: Initialize to an appropriate value

            BankAccount target = new BankAccount(initialBalance); // TODO: Initialize to an appropriate value

            float depositAmount = 0F; // TODO: Initialize to an appropriate value

            target.depositMoney(depositAmount);

            Assert.Inconclusive("A method that does not return a value cannot be verifIEd.");

        }

[TestMethod()]

        public void BankAccountConstructorTest()

        ...{

            float initialBalance = 0F; // TODO: Initialize to an appropriate value

            BankAccount target = new BankAccount(initialBalance);

            Assert.Inconclusive("TODO: Implement code to verify target");

        }

    }

}

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved