閱讀目錄
- 什么是單元測試?
- 為什么使用單元測試?
- NUint使用詳解:
- VS配置:
- 后記
什么是單元測試?
單元測試(Unit Testing)是針對最小的可測試軟件元素(單元)的,它所測試的內容包括單元的內部結構(如邏輯和數據流)以及單元的功能和可觀測的行為。通俗一點講,就是我們編程的時候,編寫的一個測試方法用于檢測功能是否正確的代碼段,通常而言,一個單元測試是用于判斷某個特定條件(或者場景)下某個特定函數的行為。
比如我們在編寫代碼的時候,寫一個功能的實現代碼,然后再編寫一個Test方法用于測試這個功能的代碼正確性,其實這個Test方法就是單元測試,又如在制造飛機的時候,通常會先生產飛機的零部件,然后再把這些成千上萬的零部件進行組裝,但是在組裝之前,通常會對每個飛機零部件進行測試,通過了才能稱為真正的飛機零部件,這個零部件測試其實就是“單元測試”。換個角度思考,如果再飛機組裝后再進行測試,你會發現這是多么的愚蠢,這也說明了“單元測試”的重要性。
一般認為,在結構化程序時代,單元測試所說的單元是指函數,在當今的面向對象時代,單元測試所說的單元是指類。以類作為測試單位,復雜度高,可操作性較差,因此仍然主張以函數作為單元測試的測試單位,但可以用一個測試類來組織某個類的所有測試函數。單元測試不應過分強調面向對象,因為局部代碼依然是結構化的。單元測試的工作量較大,簡單實用高效才是硬道理。
有一種看法是,只測試類的接口(公有函數),不測試其他函數,從面向對象角度來看,確實有其道理,但是,測試的目的是找錯并最終排錯,因此,只要是包含錯誤的可能性較大的函數都要測試,跟函數是否私有沒有關系。
注:上面部分概念來源百度百科。
為什么使用單元測試?
為什么使用使用單元測試?簡單來說,原因就像孕婦做“胎前檢查”一樣。我們在開發項目的過程中,做某一模塊的功能,代碼寫完了,然后生成一下就丟給測試人員去測試,最后測試人員就提出一大堆的Bug,雖然代碼的語義上沒有問題,但是并不代表代碼實現功能沒問題,這時候就需要做“單元測試”了,在提交給測試人員之前確保“代碼功能”實現沒有問題,當然需求錯誤就是另一方面的問題了,這是“單元測試”所測試不了的。
關于“單元測試”,很多程序員很少主動的去做,至少我是這樣,為什么?
- 太麻煩了
- 花費太多時間
- 只是說明代碼沒有問題
- 我寫的代碼肯定沒問題
上面幾條一般是我們抵制“單元測試”的幾個主要原因,說白了,就是我們太自信、太懶了,關于“單元測試”的好處就不多說了,就像上面的例子一樣,如果你不做“胎前檢查”,等到你的孩子生下來身體有所“缺陷”,你后悔也來不及,這也就是使用“單元測試”的原因。
NUint使用詳解
NUint是我們做“單元測試”常用框架之一,官網地址:http://www.nunit.org/,官網上也提供相關文檔,可以下載參考下:NUnit-2.6.3-docs.zip,NUint在項目中的安裝使用主要有三種方式:
- NUnit-2.6.3.msi:程序包安裝,會添加到注冊表,這個在配置VS的時候會用到。
- NUnit-2.6.3.zip:壓縮包解壓,需要在項目中添加NUint引用。
- NuGet安裝命令:install-package nunit。
示例
關于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:在當前測試類的每一個測試函數運行后調用。
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,這樣就可以在編寫代碼的過程中很方便的進行”單元測試“了,怎么配置?請接著往下看。
External Tools
”擴展工具條“這種方式只是在VS中可以方便打開NUint程序,其實并沒有方便多少,但是還是比上面常規方式奧方便些。
在VS中按下面方式配置:工具-外部工具,打開后添加如下命令:
命令:NUint的安裝路徑,參數:$(TargetName)表示目標文件路徑,$(TargetExt)表示目標文件擴展名,初始目錄:$(ProjectDir)表示當前程序的物理路徑,后面加”\bin\Debug“,也就是表示當前項目的生成路徑。點擊確定后,在工具條中會發現多了”NUint“工具:
這邊需要注意的是,在點擊”NUint“這個工具之前,需要在代碼窗體中打開需要測試的項目,比如當前代碼窗體是”Class.cs“,那么打開”NUint“工具條,自動打開的就是”Class.cs“所在的項目。
Visual Nunit 2010
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插件測試結果:
NUnit Test Adapter
通過上面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幾年前都存在了,奈何小菜現在才開始接觸,只恨自己生于太晚,但也為時未晚,本篇都是一些基礎的知識或配置,希望大神們看到莫笑,如果能幫像菜鳥我一樣的你,那真是莫大榮幸,本篇也只是開始,接下來會在項目中使用“單元測試”,到時候再做些總結或感想與大家分享,還請關注。
如果你覺得本篇文章對你有所幫助,請點擊右下部“推薦”,^_^
參考資料:
- http://www.nunit.org/
- http://www.cnblogs.com/chwkai/archive/2006/03/23/356326.html
- http://www.cnblogs.com/jara/p/3369142.html
- http://www.cnblogs.com/kesalin/archive/2012/03/07/vs2010_nunit.html
- http://www.codeguru.com/csharp/.net/using-nunit-with-visual-studio-2012-unit-test-projects.htm
- http://www.marthijnvandenheuvel.com/2010/06/09/using-nunit-in-visual-studio-2010/
文章列表