.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();
        }
    }