nunit單元測試詳解


在粗略看了代碼后,下面就詳細說明相應的測試標記(屬性)的用法。

  1. [TestFixture(arguments)]屬性標記類為測試類,若沒有填寫參數,則測試類必須含有無參構造函數,否則需要相應的有參構造函數。也可以多個測試[TestFixture(1), TestFixture("a")]

  2. [Test]屬性標記方法為測試方法,中添加Description參數可以給我們測試的功能添加描述信息。

  3. [TestCase(arguments)]屬性標記有參數無返值方法為測試方法(泛型方法一樣標記),想要多次測試可用逗號隔開([TestCase(1,2), TestCase(2,3)])。

  4. [TestCase(arguments,Result = value)屬性標記帶參數與返回值的方法為測試方法,執行的時候把預期的返回值也告訴NUnit,如果返回值不對,測試同樣無法通過。

  5. [Suite](測試套件,僅對屬性與索引器標記有效):可以將多個測試類組合到一起,同時執行多個測試。本版本的開發人員的一個信念就是減少這個的需要,可以使用[Category]來替代它。

  6. [Explicit]屬性標記測試方法需要在UI界面顯式執行,如果不想對某個方法進行單元測試,只是在它被選中時才進行測試的話,可以調用該特性。

  7. [Ignore]屬性標記一個測試方法或一個測試類被忽略,如果測試類被忽略,其內中的測試方法也會被忽略。

  8. [ExpectedException(Type)]屬性標記測試方法在運行時拋出一個期望的異常,如果是則測試通過,否則不通過。

  9. [Category("")]屬性標記用於將測試分類(便於只測試需要的類別),可在方法與類上進行標記,在NUnit-GUI界面的Categories選項卡中對要測試種類進行添加,Run時僅測試該類別的測試。

  10. [TestFixtureSetUp]屬性標記方法為類級別設置(初始化)方法,在整個測試類中執行一次初始化,所有的測試方法共享初始化數據。

  11. [TestFixtureTearDown]屬性標記方法為類級別拆卸方法,在整個測試類中執行一次拆卸.當測試類中的所有測試方法執行完成,就會執行拆卸方法,用於清除數據、釋放資源。

  12. [TearDown]屬性標記方法為函數級別的拆卸方法,在執行完每個測試方法后,執行該拆卸方法。一個測試類可以僅有一個TearDown/Setup/TestFixtureSetUp/TestFixtureTearDown方法。如果有多個定義,測試類也會編譯成功,但是測試時不會運行這些標記過的方法。

  13. [SetUp]屬性標記方法為函數級別的設置方法,在執行每個測試方法前,執行該設置方法。

  14. 每執行一次Run,就是new一個新的實例在測試。

  15. [Maxtime]/[Timeout]屬性標記測試用例的最大執行時間,前者超時時不取消測試,而后者會強行中斷,用法如:[Test, Maxtime(2000)],[Test, Timeout(2000)]。

  16. [Repeat]屬性標記測試方法重復執行多少次,如:[Test, Repeat(100)]。

  17. [RequiresMTA]/[RequiresSTA]/[RequiresThread]屬性標記測試用例必須的在多線程、單線程、獨立的線程狀態下運行。

  18. [Values]屬性標記測試用例的參數,以參數的形式傳入一組值,NUnit會把這組值分解成相應數量的子測試。當測試用例的2個參數都使用[Values]進行標記,NUnit默認生成2組數量乘積的用例,需要使用[Sequential]標記測試用例才能按順序生成一一對應的n(n=2組中最大數組長度)個子測試用例。

  19. [ValueSource]屬性標記測試用例的參數,指定參數的數據源來自哪里,在使用[ValueSource]指定數據源時,該數據源必須實現了IEnumerable接口,數據源可以是屬性、無參方法、實例或靜態成員。
    更多屬性標記與詳細說明,可以查閱NUnit官網提供的說明文檔。一個方法的測試可能要寫很多個測試用例,這都是正常的,如果一個測試用例包含多個斷言,那些緊跟失敗斷言的斷言都不會執行,因為通常每個測試方法最好只有一個斷言。

TestFixture

本屬性標記一個類包含測試,當然setup和teardown方法可有可無.(關於setup 和teardown方法在后面介紹)
做為一個測試的類,這個類還有一些限制

  • 必須是Public,否則NUnit看不到它的存在.
  • 它必須有一個缺省的構造函數,否則是NUnit不會構造它.
  • 構造函數應該沒有任何副作用,因為NUnit在運行時經常會構造這個類多次,如果要是構造函數要什么副作用的話,那不是亂了.

Test

Test屬性用來標記一個類(已經標記為TestFixture)的某個方法是可以測試的.為了和先前的版本向后兼容,頭4個字符(“test”)忽略大小寫.(參看http://nunit.org/test.html)

Assert

在NUnit中,用Assert(斷言)進行比較,Assert是一個類,它包括以下方法:AreEqual,AreSame,Equals, Fail,Ignore,IsFalse,IsNotNull,具體請參看NUnit的文檔。

1)、測試二個參數是否相等

Assert.AreEqual;

Assert.AreEqual;

2)、測試二個參數是否引用同一個對象

Assert.AreSame;

Assert.AreNotSame;

3)、測試一個對象是否被一個數組或列表所包含

Assert.Contains;

4)、測試一個對象是否大於另一個對象

Assert.Greater;

5)、測試一個對象是否小於另一個對象

Assert.Less;

6)、類型斷言:

Assert.IsInstanceOfType;

Assert.IsAssignableFrom;

7)、條件測試:

Assert.IsTrue;

Assert.IsFalse;

Assert.IsNull;

Assert.IsNotNull;

Assert.IsNaN;用來判斷指定的值是否為數字。

Assert.IsEmpty;

Assert.IsNotEmpty;

Assert.IsEmpty;

Assert.IsNotEmpty;

8)、其他斷言:

Assert.Fail;方法為你提供了創建一個失敗測試的能力,這個失敗是基於其他方法沒有封裝的測試。對於開發你自己的特定項目的斷言,它也很有用。

Assert.Pass;強行讓測試通過

字符串斷言(StringAssert):提供了許多檢驗字符串值的有用的方法

StringAssert.Contains;

StringAssert.StartsWith;

StringAssert.EndsWith;

StringAssert.AreEqualIgnoringCase;

CollectionAssert類

CollectionAssert.AllItemsAreInstancesOfType;集合中的各項是否是某某類型的實例

CollectionAssert.AllItemsAreNotNull:集合中的各項均不為空

CollectionAssert.AllItemsAreUnique;集合中的各項唯一

CollectionAssert.AreEqual;兩個集合相等

CollectionAssert.AreEquivalent;兩個集合相當

CollectionAssert.AreNotEqual;兩個集合不相等

CollectionAssert.AreNotEquivalent;兩個集合不相當

CollectionAssert.Contains;

CollectionAssert.DoesNotContain;集合中不包含某對象

CollectionAssert.IsSubsetOf:一個集合是另外一個集合的子集

CollectionAssert.IsNotSubsetOf:一個集合不是另外一個集合的子集

CollectionAssert.IsEmpty;集合為空

CollectionAssert.IsNotEmpty;集合不為空

CollectionAssert.IsOrdered;集合的各項已經排序

FileAssert

FileAssert.AreEqual;

FileAssert.AreNotEqual;

DirectoryAssert

DirectoryAssert.AreEqual;

DirectoryAssert.AreNotEqual;

DirectoryAssert.IsEmpty;

DirectoryAssert.IsNotEmpty;

DirectoryAssert.IsWithin;

DirectoryAssert.IsNotWithin;

ExpectedException

這里是一個驗證這個假設的測試.有的時候,我們知道某些操作會有異常出現,例如, 在實例中增加除法,某個操作被0除,拋出的異常和.NET文檔描述的一樣.參看以下源代碼.


免責聲明!

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



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