對比MS Test與NUnit Test框架

前言:

項目中進行Unit Test時,確定會用到框架,由於這樣可以更快捷、方便的進行測試。php

.Net環境下的測試框架很是多,在這裏只是對MS Test和NUnit Test進行一下比較,html

由於這兩個框架用的較多,也有大蝦想過同時只是這兩種框架的方法。框架

 

1、簡介

MS Test框架是Visual Studio自帶的測試框架,能夠經過新建一個Unit Test Project工程,函數

也能夠建一個Class Libary,而後添加對Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll的引用。post

而後就是建立測試用例,進行測試便可。visual-studio

NUnit Test框架是一個xUnit家族種的第4個主打產品,徹底由C#語言來編寫,支持全部的.Net語言。單元測試

使用NUnit框架,咱們須要下載安裝包,安裝後使用獨立客戶端進行使用。使用方法與MS Test相似,學習

新建一個Class Libary,而後添加對nunit.framework.dll的引用,最後建立測試用例,在客戶端中進行測試。測試

 

2、特性標籤對比

全部的測試框架都共享相同的核心特性:Test Declaration, Test Execution, and Assertions.this

在.Net中通常使用特性標籤來添加額外的信息,下面就是MS Test和NUnit在特性標籤上不一樣的地方。

MS Test Attribute NUnit Attribute 用途
[TestClass] [TestFixture] 定義一個測試類,裏面能夠包含不少測試函數和初始化、銷燬函數(如下全部標籤和其餘斷言)。
[TestMethod] [Test] 定義一個獨立的測試函數。
[ClassInitialize] [TestFixtureSetUp] 定義一個測試類初始化函數,每當運行測試類中的一個或多個測試函數時,這個函數將會在測試函數被調用前被調用一次(在第一個測試函數運行前會被調用)。
[ClassCleanup] [TestFixtureTearDown] 定義一個測試類銷燬函數,每當測試類中的選中的測試函數所有運行結束後運行(在最後一個測試函數運行結束後運行)。
[TestInitialize] [SetUp] 定義測試函數初始化函數,每一個測試函數運行前都會被調用一次。
[TestCleanup] [TearDown] 定義測試函數銷燬函數,每一個測試函數執行完後都會被調用一次。
[AssemblyInitialize] -- 定義測試Assembly初始化函數,每當這個Assembly中的有測試函數被運行前,會被調用一次(在Assembly中第一個測試函數運行前會被調用)。
[AssemblyCleanup] -- 定義測試Assembly銷燬函數,當Assembly中全部測試函數運行結束後,運行一次。(在Assembly中全部測試函數運行結束後被調用)
[DescriptionAttribute] [Category] 定義標識分組。

 

3、同時支持NUnit和MSTest

經過上面的介紹,咱們能夠看到這兩個框架只是標籤的寫法不同,它們的具體功能都是同樣的。

因此能夠經過宏判斷來同時支持這兩個框架。

一、添加兩種框架的DLL

     MSTest: Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll

     NUnit   : nunit.framework.dll

二、在測試前添加如下代碼:

#if !NUNIT 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Category = Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute; 
#else 
using NUnit.Framework; 
using TestClass = NUnit.Framework.TestFixtureAttribute; 
using TestMethod = NUnit.Framework.TestAttribute; 
using TestInitialize = NUnit.Framework.SetUpAttribute; 
using TestCleanup = NUnit.Framework.TearDownAttribute; 
using TestContext = System.Object; 
using ClassCleanup = NUnit.Framework.TestFixtureTearDownAttribute; 
using ClassInitialize = NUnit.Framework.TestFixtureSetUpAttribute; 
#endif

 

4、斷言對比

同上,大部分都是同樣的,有些地方不太同樣而已。

MS Test Assert NUnit Assert 用途

AreEqual

 

驗證值相等

AreNotEqual

 

驗證值不相等

AreSame

 

驗證引用相等

AreNotSame

 

驗證引用不相等

Inconclusive

 

暗示條件還未被驗證

IsTrue

 

驗證條件爲真

IsFalse

 

驗證條件爲假

IsInstanceOfType

Assert.IsInstanceOf<>

驗證明例匹配類型

IsNotInstanceOfType

Assert.IsNotInstanceOf<>

驗證明例不匹配類型

IsNotNull

 

驗證條件爲NULL

IsNull

 

驗證條件不爲NULL

Fail

 

驗證失敗

另外還有一些是NUnit中的,可是MS Test框架中是沒有的:

  • Assert.IsNaN
  • Assert.IsEmpty
  • Assert.IsNotEmpty
  • Assert.Greater
  • Assert.GreaterOrEqual
  • Assert.Less
  • Assert.LessOrEqual
  • Assert.IsAssignableFrom
  • Assert.IsNotAssignableFrom
  • Assert.Igore
  • CollectionAssert.IsEmpty
  • CollectionAssert.IsNotEmpty
  • StringAssert.AreEqualIgnoringCase
  • StringAssert.IsMatch
  • FileAssert.AreEqual
  • FileAssert.AreNotEqual

 

5、其餘

一、整合Visual Studio和NUnit

在Visual Studio 2010中,經過安裝NUnit插件,能夠不使用外部客戶端,直接運行測試。

有興趣的能夠看一下這篇帖子:5分鐘實現VS2010整合NUnit進行單元測試

固然,貌似在最新版本的VS2012中,安裝過NUnit以後,就能夠在不須要安裝插件的狀況下,

運行NUnit的測試。

二、運行時區別

看網上的帖子講,NUnit不是並行執行測試的,全部的測試都是放在一個線程當中。

而MSTest中每一個測試都被放在單獨的線程當中。

三、關於ClassCleanup和TestFixtureTearDown

在NUnit中,TestFixtureTearDown在最後一個測試執行完畢後,立刻執行。

而在MSTest中,ClassCleanup在AssemblyCleanup前執行,可是並非最後一個測試完畢後立刻執行。

四、NUnit支持測試類的繼承,可是MSTest不支持。

參考文章:Comparing the MSTest and Nunit Frameworks

     Migrating from NUnit to MSTest     

     Using both MSTest and NUnit?

     MSTest vs. NUnit with Visual Studio 2010 & TDD

 

 

最後,這是最近總結學習的一篇帖子,裏面確定有沒有提到、或者錯誤的地方。但願你們發現錯誤一塊兒討論。

另外也但願對正在學習的有點幫助。

相關文章
相關標籤/搜索