1. 程式人生 > 其它 >C#單元測試工具

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