天天看點

.net持續內建測試篇之Nunit檔案斷言、字元串斷言及集合斷言

.net持續內建測試篇之Nunit檔案斷言、字元串斷言及集合斷言

使用前面講過的方法基本上能夠完成工作中的大部分任務了,然而有些功能實作起來還是比較麻煩的,比如說字元串相等性比較不區分大小寫,字元串是否比對某一正則規則,集合中的每一個(某一個)元素是否符合特定規則等,Nunit提供了一些特定的方法用來實作一些用普通斷言比較難以實作的擴充類型和方法.

下面介紹一下StringAssert類型下面的方法

StringAssert.AreEqualIgnoringCase(string expected,string actual)

此方法用于斷言兩個字元串在不區分大小寫情況下是否相等,需要提供兩個參數,第一個是期待的結果,第二個是實際結果.這個方法比較簡單,不再提供示例.

需要注意的是Nunit裡有許多需要提供兩個參數的方法,一般情況下都是第一個是期待的結果,第二個是實際結果

StringAssert.Contains

用于斷言一個字元串是否包含另一字元串,其中第一個參數為被包含的字元串,第二個為實際字元串,這個方法語義不是特别明确,需要注意

[Test]
    public void DemoTest()
    {
        StringAssert.Contains("hello", "hello,world");
    }           

這段代碼片段會傳回成功

StringAssert.StartsWith

用于斷言字元串是否以某(幾)字元開始

[Test]
    public void DemoTest()
    {
        StringAssert.StartsWith("h", "hello,world");
    }           

StringAssert.EndsWith

與StringAssert.StartsWith類似,string類也有此方法,相信大家都比較熟悉

StringAssert.IsMatch

用于斷言指定字元串是否比對某一正則規則

[warning]這個方法并沒有大小寫開關

下面介紹兩個與檔案(目錄)有關的斷言類FileAssert和DirectoryAssert.兩個類下面的斷言方法基本一樣,隻是一個是斷言檔案,一個是斷言目錄.下面以FileAssert為例說明

FileAssert.AreEqual

這個方法用于斷言兩個檔案是否是同一個檔案,接受字元串參數

需要說明的是,字元串路徑必須指向檔案,而不能是目錄或者不存在的檔案.

FileAssert.Exists

用于斷言某個檔案是否存在,接受字元串參數或者FileInfo作為參數

DirectoryAssert方法類似,并且這些方法都對應的有相反方向的斷言,方法名包含Not,很容易了解

單元測試過程中,我們很多時候都要處理集合,Nunit裡提供了一個 CollectionAssert 類用于處理對集合類型的斷言

下面介紹一下這個類下面的斷言方法

CollectionAssert.AllItemsAreInstancesOfType

用于斷言集合裡面的元素是否都是某一特定類型.

[Test]
    public void DemoTest()
    {
        ArrayList ar = new ArrayList {"a", "b", "c"};
        CollectionAssert.AllItemsAreInstancesOfType(ar, typeof(string));
    }           

以上斷言會傳回成功,因為我們向ArrayList裡添加的全是string類型的元素

需要注意,很多斷言方法第一個參數是期待類型,第二個是實際類型,而此方法則相反,第一個是實際集合,第二個是期待的類型

這裡的類型支援父類,比如說如果是typeof(object)也同樣能通過,語義上來講,元素是string類型,也是object類型,講得通的

CollectionAssert.AllItemsAreNotNull

用于斷言集合裡的元素全部不是Null,也即集合不包含null元素,這個方法隻有一個參數,傳入我們要判斷的集合即可

CollectionAssert.AllItemsAreUnique

用于斷言集合裡面的元素全部是惟一的,即集合裡沒有重複元素.

[warning]需要注意的是,這個方法并沒有提供一個重載支援自定義比較器,它隻能用于斷言簡單類型,如string,int,datetime等是否惟一,如果是類類型則需要重載equals和gethashcode但是通常我們并不這樣做,而是在類外部提供一個比較器,如果判斷複雜類型是否惟一,我們在以後再介紹

下面舉一個例子說明這個問題

[Test]
    public void DemoTest()
    {
        Person[] psn = new Person[] {
            new Person { Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)},
            new Person { Name="sto",Age=32,BirthDay=DateTime.Today.AddYears(-10)}};
        CollectionAssert.AllItemsAreUnique(psn);
    }           

以上代碼測試會通過,因為兩個new出來的Persn不是同一個對象,但實際業務中,兩個對象的屬性完全相等時我們就認為它們是相等的,以上我們期待的結果是 不通過

CollectionAssert.AreEqual

用于斷言兩個集合是否相等,如果兩個集合裡的元素都是簡單對象,如果是複雜對象用這個方法并不是很友善(雖然此方法提供提供IComparer作為參數,然而IComparer對集合并不是很友善)

[warning]這裡的兩個集合相等第一集合元素個數必須相等(不用多說),第二集合元素的順序必須一緻的

還有一點需要說明還有一點需要說明,如以上所說,兩個集合元素順序一緻,并且在運作時類型是一緻的就會被認為是相等,這兩個集合的類型不必一樣,比如說一個是array,一個是list,泛型參數也不必須一樣

隻要在運作時類型是一緻的即可

請看下面一段代碼

[Test]
    public void DemoTest()
    {
        int[] a = {3, 4, 5};
        List<object> b =new List<object> {3, 4, 5};
        CollectionAssert.AreEqual(a, b);
    }           

a和b兩個集合的集合類型不一樣,泛型類型也不一樣,但是運作的時候卻是一樣的,是以以上代碼執行會傳回成功狀态

CollectionAssert.AreEquivalent

這個方法用來判斷兩個集合的元素是否等價,如果兩個集合元素類型相同,個數也相同,即視為等價,與上面的方法相比,它不關心順序

[Test]
    public void DemoTest()
    {
        int[] a = {3, 4, 5};
        List<object> b =new List<object> {4,3, 5};
        CollectionAssert.AreEquivalent(a, b);
    }           

以上代碼測試是通過的

CollectionAssert.Contains

用于斷言集合是否包含某一進制素

需要說明的是.要判斷集合中是否包含某一進制素,隻要集合運作時有特定元素和指定元素類型相同,并且值相同,即認為集合包含這一進制素

請看以下代碼片段

[Test]
    public void DemoTest()
    {
        int[] a = {3, 4, 5};
        object element = 4;
        List<object> b =new List<object> {element,3, 5};
        CollectionAssert.Contains(b, 4);
    }           

以上代碼段中b集合雖然不包含值為4的int類型元素,隻有object類型的值為4的元素,然而它在運作時真正的類型是int,是以以上測試也是通過的.

CollectionAssert.IsEmpty

用于斷言某一集合是空集合,即元素個數為0

CollectionAssert.IsOrdered

用于斷言集合元素是否按正序排列,所謂正序列,是指按阿拉伯數字或者字元表順序正序排列.

CollectionAssert.IsSubsetOf

用于判斷一個集合是否為另一個集合的子集,與以上相同的是,這兩個集合不必是同一類集合(可以一個是array,一個是list),隻要一個集合的元素完全包含在另一個集合中,即認為它是另一個集合的子集

隻要一個集合元素完全包含在另一個集合中即可,順序不必相同

CollectionAssert.IsSupersetOf

用于斷言一個集合是否是另一個集合的父集,與子集判斷用法一樣.

以上大部分方法都有一個判斷相反的方法,名稱中多一個Not,這裡不再羅列

原文位址

https://www.cnblogs.com/tylerzhou/p/11300896.html

繼續閱讀