單元測試(Unit Testing)是針對最小的可測試軟件元素(單元)的,它所測試的內容包括單元的內部結構(如邏輯和數據流)以及單元的功能和可觀測的行爲。通俗一點講,就是咱們編程的時候,編寫的一個測試方法用於檢測功能是否正確的代碼段,一般而言,一個單元測試是用於判斷某個特定條件(或者場景)下某個特定函數的行爲。visual-studio
好比咱們在編寫代碼的時候,寫一個功能的實現代碼,而後再編寫一個Test方法用於測試這個功能的代碼正確性,其實這個Test方法就是單元測試,又如在製造飛機的時候,一般會先生產飛機的零部件,而後再把這些成千上萬的零部件進行組裝,可是在組裝以前,一般會對每一個飛機零部件進行測試,經過了才能稱爲真正的飛機零部件,這個零部件測試其實就是「單元測試」。換個角度思考,若是再飛機組裝後再進行測試,你會發現這是多麼的愚蠢,這也說明了「單元測試」的重要性。 單元測試
通常認爲,在結構化程序時代,單元測試所說的單元是指函數,在當今的面向對象時代,單元測試所說的單元是指類。以類做爲測試單位,複雜度高,可操做性較差,所以仍然主張以函數做爲單元測試的測試單位,但能夠用一個測試類來組織某個類的全部測試函數。單元測試不該過度強調面向對象,由於局部代碼依然是結構化的。單元測試的工做量較大,簡單實用高效纔是硬道理。測試
有一種見解是,只測試類的接口(公有函數),不測試其餘函數,從面向對象角度來看,確實有其道理,可是,測試的目的是找錯並最終排錯,所以,只要是包含錯誤的可能性較大的函數都要測試,跟函數是否私有沒有關係。
注:上面部分概念來源百度百科。
爲何使用使用單元測試?簡單來講,緣由就像孕婦作「胎前檢查」同樣。咱們在開發項目的過程當中,作某一模塊的功能,代碼寫完了,而後生成一下就丟給測試人員去測試,最後測試人員就提出一大堆的Bug,雖然代碼的語義上沒有問題,可是並不表明代碼實現功能沒問題,這時候就須要作「單元測試」了,在提交給測試人員以前確保「代碼功能」實現沒有問題,固然需求錯誤就是另外一方面的問題了,這是「單元測試」所測試不了的。
關於「單元測試」,不少程序員不多主動的去作,至少我是這樣,爲何?
上面幾條通常是咱們抵制「單元測試」的幾個主要緣由,說白了,就是咱們太自信、太懶了,關於「單元測試」的好處就很少說了,就像上面的例子同樣,若是你不作「胎前檢查」,等到你的孩子生下來身體有所「缺陷」,你後悔也來不及,這也就是使用「單元測試」的緣由。
NUint是咱們作「單元測試」經常使用框架之一,官網地址:http://www.nunit.org/,官網上也提供相關文檔,能夠下載參考下:NUnit-2.6.3-docs.zip,NUint在項目中的安裝使用主要有三種方式:
關於NUint的使用,先貼一段最簡單的「單元測試」的代碼:
1 [TestFixture] 2 public class Test1 3 { 4 [Test] 5 public void TestMethod() 6 { 7 Assert.AreEqual("1", "2"); 8 } 9 }
能夠看到在測試類和測試方法前有TestFixture和Test屬性,TestFixture表示須要測試的類,也就是說測試的單元,Test表示測試用例,也就是測試方法,NUint中的TestFixture和Test屬性是咱們最經常使用的屬性,固然除了他們倆以外NUint還提供了其餘的一些屬性,用來標註測試。
NUnit 屬性 | 屬性說明 |
TestFixture | 標識測試類 |
Test | 標識測試用例(TestCase) |
TestFixtureSetup | 標識測試類初始化函數 |
TestFixtureTearDown | 標識測試類資源釋放函數 |
Setup | 標識測試用例初始化函數 |
TearDown | 標識測試用例資源釋放函數 |
N/A | 標識測試用例說明 |
Ignore | 標識忽略該測試用例 |
ExpectedException | 標識該用例所指望拋出的異常 |
Explicit | 標識測試用例是否須要顯式執行 |
Category | 標識測試用例的分類 |
關於NUint的屬性詳細使用能夠去官網的說明文檔中查看,除了TestFixture和Test屬性經常使用外,還有幾個用於測試用例初始化的屬性:
TestFixtureSetup對應TestFixtureTearDown,Setup對應TearDown,Setup在AutoMapper源碼使用以下,用於AutoMapper的初始化:
1 [SetUp] 2 public void SetUp() 3 { 4 Mapper.Reset(); 5 }
從咱們一開始貼的簡單測試示例中能夠看出,除了TestFixture和Test屬性,還有就是這段代碼:Assert.AreEqual("1", "2");,這就是NUint的另外一個概念-斷言,什麼是斷言?」斷「是判斷的意義,」言「能夠看作是測試用例的描述,也就是說用於測試用例的判斷,如上段代碼就是判斷」1「和」2「是否相等,NUint經常使用斷言:
斷言 | 說明 | 示例 |
Assert.AreEqual(object expected, object actual[, string message]) | 驗證兩個對象是否相等 | Assert.AreEqual(2, 1+1) |
Assert.AreSame(object expected, object actual[, string message]) | 驗證兩個引用是否指向贊成對象 | object expected = new object(); object actual = expected; Assert.AreSame(expected, actual) |
Assert.IsFalse(bool) | 驗證bool值是否爲false | Assert.IsFalse(false) |
Assert.IsTrue(bool) | 驗證bool值是否爲true | Assert.IsTrue(true) |
Assert.IsNotNull(object) | 驗證對象是否不爲null | Assert.IsNotNull(new object()) |
Assert.IsNull(object) | 驗證對象是否爲null | Assert.IsNull(null); |
若是NUint安裝好了,測試用例也編寫好了,下面咱們就要使用NUint進行」單元測試「了,若是選用的是NUint安裝程序,咱們能夠直接在桌面打開」nunit.exe「程序,先生成一下咱們編寫的測試用例,能夠是類庫項目也能夠是應用程序,而後在打開的NUint程序中選擇:」File「-」Open Project「,選擇生成的dll或是exe,打開後點擊」Run「就開始測試了:
從測試結果看出,咱們編寫的測試用例是不經過的,由於」1!=2「,在測試結果中會有錯誤提示,好比:Expected: "1",But was: "2",咱們修改下測試用例:Assert.AreEqual("1", "1");,而後再生成下,看下測試結果:
從測試結果看出,咱們編寫的測試用例是測試經過的,由於」1=1「,這邊注意一下,若是咱們指定了測試dll或是exe,在生成後,不須要從新打開項目,直接能夠點擊」Run「進行測試,由於咱們在編寫代碼的時候就進行」單元測試「了,這種常規的測試隊程序員來講很不方便,咱們但願能夠再VS中集成NUint,這樣就能夠在編寫代碼的過程當中很方便的進行」單元測試「了,怎麼配置?請接着往下看。
」擴展工具條「這種方式只是在VS中能夠方便打開NUint程序,其實並無方便多少,可是仍是比上面常規方式奧方便些。
在VS中按下面方式配置:工具-外部工具,打開後添加以下命令:
命令:NUint的安裝路徑,參數:$(TargetName)表示目標文件路徑,$(TargetExt)表示目標文件擴展名,初始目錄:$(ProjectDir)表示當前程序的物理路徑,後面加」\bin\Debug「,也就是表示當前項目的生成路徑。點擊肯定後,在工具條中會發現多了」NUint「工具:
這邊須要注意的是,在點擊」NUint「這個工具以前,須要在代碼窗體中打開須要測試的項目,好比當前代碼窗體是」Class.cs「,那麼打開」NUint「工具條,自動打開的就是」Class.cs「所在的項目。
Visual Nunit 2010是NUint在VS的擴展插件,注意此插件只適用VS2010,下載地址:http://visualstudiogallery.msdn.microsoft.com/c8164c71-0836-4471-80ce-633383031099,安裝後須要重啓VS,打開:視圖-其餘窗口-Visual Nunit,或者按」Ctrl+F7「快捷鍵打開:
打開Visual Nunit後,會有幾個選項:Project、Mamespace和Fixture,分別表示測試項目、測試項目命名空間和測試用例,仍是上面的示例,適用Visual Nunit插件測試結果:
經過上面Visual Nunit的使用,你會發現其插件仍是蠻好用的,但遺憾的是隻支持VS2010,找」Visual Nunit 2012「找了很久也沒找到。最後發現,在VS2012中使用Nunit變了一種方式,就是NUnit Test Adapter,什麼意思?顧名思義,就是NUnit測試適配器的意思,網上有人說使用」NUnit Test Adapter「,測試項目必須是微軟的」單元測試項目「,我試了下類庫和應用程序都是能夠測試的。
使用」NUnit Test Adapter「,須要在VS2012中添加其擴展:工具-擴展和更新-聯機-搜索」NUnit Test Adapter「:
安裝完成後,在測試-窗口-測試資源管理器中打開其窗口,仍是咱們上面的測試用例,測試結果:
示例代碼下載:http://pan.baidu.com/s/1nt0oKUP
關於「單元測試」,以及NUint幾年前都存在了,奈何小菜如今纔開始接觸,只恨本身生於太晚,但也爲時未晚,本篇都是一些基礎的知識或配置,但願大神們看到莫笑,若是能幫像菜鳥我同樣的你,那真是莫大榮幸,本篇也只是開始,接下來會在項目中使用「單元測試」,到時候再作些總結或感想與你們分享,還請關注。
若是你以爲本篇文章對你有所幫助,請點擊右下部「推薦」,^_^
參考資料: