文章目錄
這幾天,在網上找了些關於單元測試的使用說明(NUnit).由於初學,就拿自己的測試案例來說說吧.
1. TDD的簡介 首先什麼是TDD呢?Kent Beck在他的<<測試驅動開發 >>(Addison-Wesley Professional,2003)一書中,使用下面2個原則來定義TDD: · 除非你有一個失敗的自動化的測試,永遠不要寫一單行代碼. · 阻止重複 我想第一個原則是顯而易見的.在沒有失敗的自動化的測試下就不要寫代碼.因為測試是嵌入在代碼必須滿足的需求中.如果沒有需求,就沒有必要實現任何東西.所以這個原則阻止我們去實現那些沒有測試和在解決方案中不需要的功能. 第二個原則說明了在一個程式中,不應該包含重複的代碼.如果代碼重複,我想這就是不好的軟體設計的象徵.隨著時間的流逝,它會對程式造成不一致的問題,並且使代碼變非常混亂 ,因為我們時常不會記得重複代碼的位置.如果發現代碼重複,我想我們應該立即刪除代碼重複.其實這就涉及到重構了.在這裡我就不多講了. 一般來說,測試分為2種類型,一是程式員自己的測試,另外一種是客戶的測試.關於客戶測試,我推薦一個FIT的架構,非常不錯。在這裡,我們講的TDD就是程式員測試.那麼什麼是程式員測試呢?我認為就是我們常說的單元測試.既然是單元測試,在.NET裡勢必會用到某些工具,目前最著名恐怕就是我即將介紹的NUnit了, 2.NUnit的介紹 NUnit是一個單元測試架構,專門針對於.NET來寫的.其實在前面有
JUnit(Java),CPPUnit(C++),他們都是xUnit的一員.最初,它是從JUnit而來.現在的版本是2.2.接下來我所用的都是基於這個版本.NUnit最初是由James W. Newkirk, Alexei A. Vorontsov 和Philip A. Craig, 後來Team Dev逐漸龐大起來.在開發過程中, Kent Beck 和Erich Gamma2位牛人也提供了許多協助.看來對於NUnit還真是下了一番力氣了.J NUnit是xUnit家族種的第4個主打產品,完全由C#語言來編寫,並且編寫時充分利用了許多.NET的特性,比如反射,客戶屬性等等. 最重要的一點是它適合於所有.NET語言. 如果你還沒有下載,可以到http://www.nunit.org/去下載.2.1 NUnit的介紹 Ok,下面正式講解NUnit.在講解之前,看看幾張圖片: 圖1 NUnit啟動並執行效果
圖2 NUnit啟動並執行另外一個效果 從中我們可以非常容易發現,右邊是個狀態條,圖1是紅色的,圖2是綠色的.為什麼會這樣呢?因為如果所有測試案例運行成功,就為綠色,反之如果有一個不成功,則為紅色,但也有黃色的.左面的工作域內則是我們寫的每一個單元測試.通過上面的圖片,我想你對NUnit有個總的瞭解了.接下來還是分為2個部分,一是NUnit的布局,另外一部分就是它的核心概念.首先熟悉一下NUnit GUI的布局.讓我們更進一步看一下測試回合器視窗的布局。在右邊面板的中間,可以看到測試進度條。進度條的顏色反映了測試執行的狀態:
綠色 描述目前所執行的測試都通過
黃色 意味某些測試忽略,但是這裡沒有失敗
紅色 表示有失敗 底部的狀態條表示下面的狀態:
狀態.說明了現在運行測試的狀態。當所有測試完成時,狀態變為
Completed.運行測試中,狀態是
Running: <
test-name> (<
test-name>是正在啟動並執行測試名稱)。
Test Cases說明載入的程式集中測試案例的總個數。這也是測試樹裡葉子節點的個數。
Tests Run 已經完成的測試個數。
Failures 到目前為止,所有測試中失敗的個數.
Time 顯示運行測試時間(以秒計) File主菜單有以下內容:
New Project允許你建立一個新工程。工程是一個測試程式集的集合。這種機制讓你組織多個測試程式集,並把他們作為一個組對待。
Open 載入一個新的測試程式集,或一個以前儲存的NUnit工程檔案。
Close關閉現在載入的測試程式集或現在載入的NUnit工程。
Save 儲存現在的Nunit工程到一個檔案。如果正工作單個程式集,本功能表項目允許你建立一個新的NUnit工程,並把它儲存在檔案裡。
Save As允許你將現有NUnit工程作為一個檔案儲存。
Reload 強制重載現有測試程式集或NUnit工程。NUnit-Gui自動監測現載入的測試程式集的變化。 當程式集變化時,測試回合器重新載入測試程式集。(當測試正運行時,現在載入的測試程式集不會重新載入。在測試回合之間測試程式集僅可以重新載入。一個忠告:如果測試程式集依賴另外一個程式集,測試回合器不會觀察任何依賴的程式集。對測試回合器來說,強制一個重載使全部依賴的程式集變化可見。
Recent Files 說明5個最近在NUnit中載入的測試程式集或NUnit工程(這個列表在Windows註冊表,由每個使用者維護,因此如果你共用你的PC,你僅看到你的測試)。最近程式集的數量可以使用Options功能表項目修改,可以訪問Tool主菜單。
Exit退出。 View菜單有以下內容:
Expand一層層擴充現在樹中所選節點
Collapse 摺疊現在樹中選擇的節點
Expand All遞迴擴充樹中所選節點後的所有節點
Collapse All遞迴摺疊樹中所選節點後的所有節點
Expand Fixtures擴充樹中所有代表測試fixture的節點。
Collapse Fixtures 摺疊樹中所有代表測試fixture的節點。
Properties 顯示樹中現所選節點的屬性。 Tools 菜單由這些項:
Save Results as XML作為一XML檔案儲存運行測試的結果。
Options讓你定製NUnit的行為。 現在看看右邊,你已經熟悉Run按鈕和進度條。這裡還有一個緊跟Run按鈕的Stop按鈕:點擊這個按鈕會終止執行正啟動並執行測試。進度條下面是一個文字視窗,在它上方,由以下4個標籤:
Errors and Failures 視窗顯示失敗的測試。在我們的例子裡,這個視窗是空。
Tests Not Run 視窗顯示沒有得到執行的測試。
Console.Error 視窗顯示運行測試產生的錯誤訊息。這些此訊息是應用程式代碼使用
Console.Error輸出資料流可以輸出的。
Console.Out視窗顯示運行測試列印到
Console.Error輸出資料流的簡訊。 2.2 一些常用屬性 接下來,我將講述這個架構如何使用.同時也涉及到一些非常重要的概念,我想其客戶屬性是非常重要的.在NUnit裡,有以下幾種屬性:
下面我將對每種屬性一一講解.TestFixtureAttribute 本屬性標記一個類包含測試,當然setup和teardown方法可有可無.(關於setup 和teardown方法在後面介紹) 做為一個測試的類,這個類還有一些限制
- 必須是Public,否則NUnit看不到它的存在.
- 它必須有一個預設的建構函式,否則是NUnit不會構造它.
- 建構函式應該沒有任何副作用,因為NUnit在運行時經常會構造這個類多次,如果要是建構函式要什麼副作用的話,那不是亂了.
舉個例子
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using System.Collections;
using System.IO;
namespace TestNUnit
{
[TestFixture]
public class NUnitStart
{
//寫測試方法
}
}
TestAttribute Test屬性用來標記一個類(已經標記為TestFixture)的某個方法是可以測試的.為了和先前的版本向後相容,頭4個字元(“test”)忽略大小寫.
[Test]
public void TestGetSubjectDetailList()
{
}
從上面可以看出,這個方法沒有任何參數,其實測試方法必須沒有參數.如果我們定義方法不對的話,這個方法不會出現在測試方法列表中.也就是說在NUnit的介面左邊的工作域內,看不到這個方法.還有一點就是這個方法不返回任何參數,並且必須為Public.
測試案例下次拷貝出來.