介紹MS Test和NUnit Test架構的一些差別。
前言:
項目中進行Unit Test時,肯定會用到架構,因為這樣能夠更快捷、友善的進行測試。
.Net環境下的測試架構非常多,在這裡隻是對MS Test和NUnit Test進行一下比較,
因為這兩個架構用的較多,也有大蝦想過同時隻是這兩種架構的方法。
一、簡介
MS Test架構是Visual Studio自帶的測試架構,可以通過建立一個Unit Test Project工程,
也可以建一個Class Libary,然後添加對Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll的引用。
然後就是建立測試用例,進行測試即可。
NUnit Test架構是一個xUnit家族種的第4個主打産品,完全由C#語言來編寫,支援所有的.Net語言。
使用NUnit架構,我們需要下載下傳安裝包,安裝後使用獨立用戶端進行使用。使用方法與MS Test類似,
建立一個Class Libary,然後添加對nunit.framework.dll的引用,最後建立測試用例,在用戶端中進行測試。
二、特性标簽對比
所有的測試架構都共享相同的核心特性:Test Declaration, Test Execution, and Assertions.
在.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] | 定義辨別分組。 |
三、同時支援NUnit和MSTest
通過上面的介紹,我們可以看到這兩個架構隻是标簽的寫法不一樣,它們的具體功能都是一樣的。
是以可以通過宏判斷來同時支援這兩個架構。
1、添加兩種架構的DLL
MSTest: Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
NUnit : nunit.framework.dll
2、在測試前添加以下代碼:
#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
四、斷言對比
同上,大部分都是一樣的,有些地方不太一樣而已。
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
五、其他
1、整合Visual Studio和NUnit
在Visual Studio 2010中,通過安裝NUnit插件,可以不使用外部用戶端,直接運作測試。
有興趣的可以看一下這篇文章:5分鐘實作VS2010整合NUnit進行單元測試。
當然,貌似在最新版本的VS2012中,安裝過NUnit之後,就可以在不需要安裝插件的情況下,
運作NUnit的測試。
2、運作時差別
看網上的文章講,NUnit不是并行執行測試的,所有的測試都是放在一個線程當中。
而MSTest中每個測試都被放在單獨的線程當中。
3、關于ClassCleanup和TestFixtureTearDown
在NUnit中,TestFixtureTearDown在最後一個測試執行完畢後,馬上執行。
而在MSTest中,ClassCleanup在AssemblyCleanup前執行,但是并不是最後一個測試完畢後馬上執行。
4、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
最後,這是最近總結學習的一篇文章,裡面肯定有沒有提到、或者錯誤的地方。希望大家發現錯誤一起讨論。
另外也希望對正在學習的有點幫助。
作者:
ColdJokeLife出處:http://www.cnblogs.com/ColdJokeLife/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,請聯系我,非常感謝。