.net持續集成測試篇之Nunit that斷言

系列目錄html

that是Nunit的新語法,語義上不如簡單斷言,使用上也更加複雜,可是其功能更增強大.
其基本語法以下代碼片斷示:app

[Test]
        public void DemoTest()
        {
            bool b = 3 + 2 == 5;
            Assert.That(b, Is.True);
           
        }

如上代碼片斷未,第一部分爲要判斷的對象,能夠是一個變量,也能夠是lambda表達式,第二個是約束條件.若是參數有多個,That語義更加清析.測試

That幾乎包含全部簡單斷言裏的語法,它除了支持變量,還支持表達式,更爲強大的是它還支持自定義約束,若是第二個參數預約義的約束沒法知足咱們的需求時,咱們能夠自定義.code

That裏的約束很是多,不少是和簡單斷言裏面同樣的(好比Is.True與Assert.True()方法同樣,Is.Positive和Assert.Positive方法同樣,相似的還有不少,你們不妨找一找),這裏再也不一一列舉,只給出幾個用簡單斷言沒法完成或者實現起來很麻煩的斷例子.htm

例1

先看一下代碼斷對象

[Test]
        public void DemoTest()
        {
            double d1 = 1.1;
            double d2 = 2.2;
            Assert.AreEqual(3.3, d1 + d2);
        }

你們猜一下以上測試結果是失敗仍是成功?答案是失敗,因爲精度的問題,以上很簡單的測試都會失敗blog

avatar

下面看如何使用That解決這個問題get

[Test]
        public void DemoTest()
        {
            double d1 = 1.1;
            double d2 = 2.2;
            Assert.That(3.3, Is.EqualTo(d1 + d2).Within(0.000001));
        }

Is.EqualTo和areEqual方法相似,可是它支持再串一個Within方法提供一個容差值,這樣測試就能過通了.string

例2

先看下面代碼片斷it

[Test]
        public void DemoTest()
        {
            string[] strs = { "a", "ab", "abc" };
            int[] lengths = { 1, 2, 3 };
        }

以上代碼a的長度爲1,ab的長度爲2,abc的長度爲3,咱們相要判斷集合strs裏的每一個元素的長度是否分別對應下面集合元素的值,若是要用普通方法須要很複雜的判斷.下面看看如何使用That結合Nunit提供的方法實現一行代碼判斷

[Test]
        public void DemoTest()
        {
            string[] strs = { "a", "ab", "abc" };
            int[] lengths = { 1, 2, 3 };
            Assert.That(new ListMapper(strs).Property(nameof(string.Length)), Is.EqualTo(lengths));
        }

分析以上代碼,經過獲取String類的Length屬性,Listmapper把strs集合轉成它的長度屬性值組成的集合,而後再和lengths屬性作比較.

這是官網上的一個例子,並非一個太好的例子,經過linq方法一樣能實現,而且這個方法語義也不是特別清析,在實際中若是有比較麻煩的問題能夠考慮下這個方法.

例子3

集合複雜元素相等性比較
看如下代碼片斷

[Test]
        public void DemoTest()
        {
            List<Person> studs = new List<Person>
            {
                new Person {Name = "baidu", Age = 24},
                new Person {Name = "sto", Age = 32},
                new Person {Name = "tencent", Age = 12},
                new Person {Name = "alibaba", Age = 32}
            };
            List<Person> students = new List<Person>()
            {
                new Person {Name = "baidu", Age = 24},
                new Person {Name = "sto", Age = 32},
                new Person {Name = "tencent", Age = 12},
                new Person {Name = "alibaba", Age = 32}
            };
            
        }

以上兩個集合的元素都是Person實例,而且它們包含的對應元素名稱和age都要等,若是隻要Name和Age相等就認爲兩個Person元素相等,咱們如何判斷以上兩個集合是否相等呢?

請看如下方法

[Test]
        public void DemoTest()
        {
            List<Person> studs = new List<Person>
            {
                new Person {Name = "baidu", Age = 24},
                new Person {Name = "sto", Age = 32},
                new Person {Name = "tencent", Age = 12},
                new Person {Name = "alibaba", Age = 32}
            };
            List<Person> students = new List<Person>()
            {
                new Person {Name = "baidu", Age = 24},
                new Person {Name = "sto", Age = 32},
                new Person {Name = "tencent", Age = 12},
                new Person {Name = "alibaba", Age = 32}
            };
            Assert.That(studs, Is.EqualTo(students).Using(new StudentEqualityComparer()));
        }

以上代碼測試經過,咱們看以上代碼,EqualTo後面串了Using方法,這個方法裏接受IComparer,Icomparer ,IEqualityComparer ,Comparison委託,Func<T,T,bool>委託等豐富的比較器

下面咱們把StudentEqualityComparer比較器的代碼貼出來

public class PersonEqualityComparer : IEqualityComparer<Person>
    {
        public bool Equals(Person x, Person y)
        {
            if (x == null || y == null) return false;
            return x.Name == y.Name && x.Age == y.Age;
        }

        public int GetHashCode(Person obj)
        {
            if (obj.Name == null)
            {
                return 0;
            }
            return obj.Name.GetHashCode();
        }
    }
相關文章
相關標籤/搜索