.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言

系列目录html

使用前面讲过的方法基本上可以完成工做中的大部分任务了,然而有些功能实现起来仍是比较麻烦的,好比说字符串相等性比较不区分大小写,字符串是否匹配某一正则规则,集合中的每个(某一个)元素是否符合特定规则等,Nunit提供了一些特定的方法用来实现一些用普通断言比较难以实现的扩展类型和方法.单元测试

下面介绍一下StringAssert类型下面的方法

StringAssert.AreEqualIgnoringCase(string expected,string actual)

此方法用于断言两个字符串在不区分大小写状况下是否相等,须要提供两个参数,第一个是期待的结果,第二个是实际结果.这个方法比较简单,再也不提供示例.测试

须要注意的是Nunit里有许多须要提供两个参数的方法,通常状况下都是第一个是期待的结果,第二个是实际结果ui

StringAssert.Contains

用于断言一个字符串是否包含另外一字符串,其中第一个参数为被包含的字符串,第二个为实际字符串,这个方法语义不是特别明确,须要注意code

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

这段代码片断会返回成功htm

StringAssert.StartsWith

用于断言字符串是否以某(几)字符开始对象

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

StringAssert.EndsWith

与StringAssert.StartsWith相似,string类也有此方法,相信你们都比较熟悉blog

StringAssert.IsMatch

用于断言指定字符串是否匹配某一正则规则element

[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等是否唯一,若是是类类型则须要重载equalsgethashcode可是一般咱们并不这样作,而是在类外部提供一个比较器,若是判断复杂类型是否唯一,咱们在之后再介绍

下面举一个例子说明这个问题

[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,这里再也不罗列