zoukankan      html  css  js  c++  java
  • .net持续集成测试篇之Nunit that断言

    系列目录

    that是Nunit的新语法,语义上不如简单断言,使用上也更加复杂,但是其功能更加强大.
    其基本语法如下代码片段示:

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

    如上代码片段未,第一部分为要判断的对象,可以是一个变量,也可以是lambda表达式,第二个是约束条件.如果参数有多个,That语义更加清析.

    That几乎包含所有简单断言里的语法,它除了支持变量,还支持表达式,更为强大的是它还支持自定义约束,如果第二个参数预定义的约束无法满足我们的需求时,我们可以自定义.

    That里的约束非常多,很多是和简单断言里面一样的(比如Is.True与Assert.True()方法一样,Is.Positive和Assert.Positive方法一样,类似的还有很多,大家不妨找一找),这里不再一一列举,只给出几个用简单断言无法完成或者实现起来很麻烦的断例子.

    例1

    先看一下代码断

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

    大家猜一下以上测试结果是失败还是成功?答案是失败,由于精度的问题,以上很简单的测试都会失败

    avatar

    下面看如何使用That解决这个问题

            [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方法提供一个容差值,这样测试就能过通了.

    例2

    先看下面代码片段

     [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();
            }
        }
    
  • 相关阅读:
    typedef用法小结
    14种排序
    常用google产品
    去重排序
    双向链表
    IDEA上传一个项目到github
    IDEA上传一个项目到github
    Git的安装
    Hibernate 加载策略得总结
    hadoop -- fsck
  • 原文地址:https://www.cnblogs.com/tylerzhou/p/11306722.html
Copyright © 2011-2022 走看看