C#單元測試工具


C#單元測試相關的開源軟件中常用的有 NUnit、 和MsTest。

MsTest

1) 基本介紹

  MSTest是一款由微軟公司開發的單元測試框架,它能夠很好地被應用在Visual Studio中,並且集成在了Visual Studio單元測試框架中,操作簡單,上手容易。

 

MsTest中核心的概念有Test Class(測試類)、Test Method測試方法、斷言和初始化及清理方法。

  Test Class:通過使用[TestClass]屬性裝飾類來聲明測試類。該屬性用於標識包含測試方法的類,最佳做法規定測試類應僅包含單元測試代碼。

  Test Method:通過使用[TestMethod]屬性裝飾單元測試方法來聲明測試方法。該屬性用於標識包含單元測試代碼的方法,最佳實踐指出,單元測試方法應僅包含單元測試代碼。

  斷言:斷言是一段代碼,當運行於測試一個條件或行為針對預期的結果。通過調用Assert類中的方法來執行。

  初始化和清理方法:初始化和清理方法用於在運行之前准備單元測試,並在執行單元測試之后進行清除。初始化方法通過用[TestInitialize]屬性裝飾初始化方法來聲明,而清理方法通過用[TestCleanup]屬性聲明清理方法。

 

支持為測試用例設置分類,執行時執行指定分類的測試方法:[TestCategory]

  支持在一個或多個測試方法執行前后進行相關的准備、清理活動:[TestInitialize]和[TestCleanup]

  支持為測試用例設置參數:[DataRow]

  提供斷言方法,判定期望值和實際值是否一致

  支持使用斷言等方式,對返回異常的測試用例進行異常判斷:[ExpectedException]

圖2-1 MSTest中帶參及異常判斷實例

  支持通過注解等方式跳過執行帶有該注解的測試用例:[Ignore]

  支持設置超時時間,通過在TestMethod中的[Timeout]屬性可以設置單獨測試case的超時時間;也可以在.runSettings配置文件中為所有case設置全局的超時時間。

 

 

圖2-2 MSTest中timeout屬性實例

 

NUnit

  框架介紹

  (1)基本介紹

NUnit 是專門針對於.NET 的自動化單元測試框架,是 XUnit 家族的一個成員,最初是由Java的單元測是框架JUnit 而來,作者最終用C#對其進行重新編寫,NUnit完全由C# 編寫,使其更加符合C#習慣,並充分利用了.NET中反射、客戶屬性等特性。因此,該工具具有豐富的單元測試歷史的同時,也具有適當的C#風格。

  由於其獨立的歷史,NUnit還具有與其他工具良好交互的特點,並且在支持多種平台,包括:.NET Core、Xamarin Mobile、Compact Framework及Silverlight等。NUnit在快速測試運行方面也享有盛譽,並且還具有一些不錯的附加功能,例如允指定給定測試的多個輸入等。

  NUnit采用分層體系架構,主要有三層:測試運行器層(Test Runner)、測試引擎層(Test Engine)和框架層(Framework),其中,Test Runner層主要包含各種運行程序,包括獨立程序和在其它程序下運行的任務或者插件;Test Engine層則是NUnit平台的核心,它提供公共API,供希望查找,加載和運行測試並顯示測試結果的應用程序使用;Framework層主要是為了兼容各個版本的NUnit程序。

  NUnit中主要有三個抽象類:TestFixtureBuilderAttribute、TestCaseBuilderAttribute和IncludeExcludeAttribute。

  TestFixtureBuilderAttribute是任何知道如何從所提供的類中構建某種測試fixture的屬性的基類,testfixture是指基於用戶類的任何測試。

  TestCaseBuilderAttribute是任何知道如何從給定方法構建測試用例的屬性的基類。測試用例可以是簡單的(沒有參數)也可以是參數化的(接受參數),並且總是基於MethodInfo。

  IncludeExcludeAttribute是任何用於根據字符串屬性include、exclude和Reason來決定是在當前運行中包含測試還是排除的屬性的基類,抽象類是使這些屬性可供派生類使用,派生類負責對它們采取操作。

  在使用方面,NUnit可以通過控制台或自己獨立的GUI來運行,在使用Visual Studio作為IDE時,NUnit也提供了相應的適配器,可以更好地和Visual Studio搭配使用。

 

(2)工具特點

  NUnit2中有包含GUI界面;

  支持為測試用例設置分類,執行時執行指定分類的測試方法:使用[Category]屬性;

  支持在一個或多個測試方法執行前后進行相關的准備、清理活動:[SetUp]和[TearDown];

  提供斷言方法,如果斷言失敗,則方法調用不會有值返回並報告錯誤。如果一個測試包含多個斷言,那么在某次斷言失敗之后就終止,其后的任何斷言都不會執行;

  支持為測試用例設置參數:[TestCase]

圖2-3 NUnit帶參測試方法實例

  可以指定測試用例的執行順序:[Order]

  支持使用斷言等方式,對返回異常的測試用例進行異常判斷:Assert.That

圖2-4 NUnit排序及異常判斷方法實例

  支持通過注解等方式跳過執行帶有該注解的測試用例:[Ignore("Method is ignored")]

  支持設置超時時間,[Timeout]、[MaxTime]。[MaxTime] 標記測試用例的最大執行時間,超時時報錯但不取消測試;[Timeout] 標記測試用例的超時時間,超時中斷測試。

  TestSuite :UNIT3之后取消該屬性,因為namespace也可以實現相同的功能。

  支持對對接主流的代碼覆蓋率工具,執行完單元測試用例后自動生成覆蓋率報告。

 

 

  框架介紹

  (1)基本介紹

  XUnit .NET是一個開源的的單元測試工具,由NUnit v2的原始發明者編寫,支持C#,F# ,版以及其他.NET語言,由.NET基金會支持,它采用了一種非常獨特、現代和靈活的單元測試方法。

  XUnit .NET強調編寫具有較高的可讀性,簡單性的單元測試,與其它單元測試框架相比,有一些獨特的地方:

  XUnit比其他.Net單元測試框架更加靈活和可擴展,它允許創建新的屬性來控制測試。XUnit支持兩種類型的測試,[Fact]和[Theory],[Fact]通常用來測試不需要參數的方法,並且在XUnit中,用[Skip]屬性代替了[Ignore],並要求指定跳過該測試的原因;[Theory]支持數據驅動的測試,可以用[InlineData]屬性實現參數的傳遞,並支持多次執行同一個方法,是XUnit可擴展性強的一個重要體現。

圖2-5 帶參測試方法實例

  XUnit支持更好地進行隔離測試。與其它測試框架不同,在xUnit中,每個測試方法運行后都會進行實例化操作,執行后釋放相應的空間,測試之間更加獨立,可以以任何順序執行測試,而不必擔心一個測試對其他測試的影響,消除了不同測試方法之間的依賴性。

  XUnit取消了[SetUp]和[TearDown]方法,而采用構造函數進行初始化,使用IDisposable進行測試類的后處理等操作,讓每個測試對其需要的內容進行初始化。

  (2) 工具特點

  支持為測試用例設置分類,執行時執行指定分類的測試方法:[Trait("Category","UI")];

  支持為測試用例設置參數:[Theory] [InilineData];

  支持使用斷言等方式,對返回異常的測試用例進行異常判斷:Assert.Throws.Exception,長期使用[ExpectedException]會發現各種問題。首先,它沒有具體說明應該在哪一行代碼中引發異常,這會導致微妙且難以跟蹤的失敗,這些失敗會在通過測試時顯示出來。其次,由於處理不在測試的常規代碼流程之內,因此它沒有提供機會全面檢查異常本身的詳細信息。Assert.Throws允許您測試一組特定的代碼以引發異常,並在成功期間返回異常,以便您可以針對異常實例本身編寫進一步的斷言。

圖2-6 異常判斷實例

  支持通過注解等方式跳過執行帶有該注解的測試用例,[Fact(Skip="reason")]

  支持設置超時時間,[Fact(Timeout =10)]

 

 

本次調研重點研究的三款C#單元測試工具(MsTest、NUnit、)來說,使用區別度並不是很大,具體如下:

  MsTest作為內置的visual studio測試工具來講,操作簡單,易於使用;另外,如果已經使用visual studio作為編譯器,不用做任何的安裝即可使用,也是其較為明顯的優點之一。但是其也存在在帶參測試時不能同時支持異常判斷,以及無法對測試用例排序等缺點。

  NUnit作為比較成熟的C#單元測試工具,好處包括可以按名稱空間進行測試分組,添加測試用例注釋(使用相同的參數多次運行相同的測試)及對測試用例排序等功能,並且它與Opencover和Report Generator進行覆蓋分析的效果很好。主要的缺點是它沒有像MSTest那樣集成,但是通過Nuget現在在visual studio中使用NUnit已經成為一件比較容易的事情。NUnit還有一個不同於其它測試工具的特點是NUnit2中有自己的GUI,可以不通過VS來看單元測試結果,但是如上所說,GUI只在NUnit2中提供,而現在普遍使用的都是NUnit3。

  作為NUnit的進階簡化版,是一種和NUnit及其相似的簡單現代的單元測試框架。不同於其它測試工具的特點主要有兩個:一是取消了單元測試框架中的前后處理方法,為每個測試方法都創建測試類的新實例,即提高了測試用例之間的隔離性;二是用斷言替代了屬性的方式來捕捉異常,不采用Attribute的方式來捕捉異常有兩方面的好處:在代碼中直接斷言(Assert)能捕捉到更多種類的異常;遵守Arrange-Act-Assert (or "3A") 模式:即測試命名上“范圍-作用-斷言”規范。但是正是由於其簡化的特性,其缺點也顯而易見,即一些高階的測試可能無法用XUnit完成,並且和NUnit一樣,XUnit與VS的集成沒有MsTest那么自然。

總結

  本次調研重點測評了三款C#開源單元測試工具,對其特性及基本使用進行了介紹。其實在開源社區蓬勃發展的今天,眾多開源工具之間的區別也通過很多次迭代漸漸在縮小,如本次重點調研的三款工具雖各有優勢和劣勢,但是差異已經不再那么明顯,大家在使用時結合自身的業務背景來選擇合適的工具即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM