.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,这里不再罗列
.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言的更多相关文章
- .net持续集成测试篇之Nunit常见断言
系列目录 Nunit测试基础之简单断言 在开始本篇之前需要补充一些内容,通过前面搭建Nunit测试环境我们知道要使一个方法成为单元测试方法首先要在此方法所在类加上TestFixture注解,并且在该方 ...
- .net持续集成测试篇之Nunit that断言
系列目录 that是Nunit的新语法,语义上不如简单断言,使用上也更加复杂,但是其功能更加强大. 其基本语法如下代码片段示: [Test] public void DemoTest() { bool ...
- .net持续集成测试篇之Nunit 测试配置
系列目录 在开始之前我们先看一个陷阱 用到的Person类如下 public class Person:IPerson { public string Name { get; set; } publi ...
- .net持续集成测试篇之Nunit参数化测试
系列目录 在进行单元测试的时候,很多时候,很多时候我们都是在单元测试方法内部提供特定的值,但是这样测试往往造成样本数不足从而导致覆盖的结果不够全面,很多时候我们更想提供来自外部的,满足条件的一组值来进 ...
- .netcore持续集成测试篇之开篇简介及Xunit基本使用
系列目录 为了支持跨平台,微软为.net平台提供了.net core test sdk,这样第三方测试框架诸如Nunit,Xunit等只需要按照sdk提供的api规范进行开发便可以被dotnet cl ...
- .netcore持续集成测试篇之搭建内存服务器进行集成测试一
系列目录 在web项目里,我们把每一层的代码的单元测试都通过并不代表程序能正常运行,因为这个过程缺失了http管道,很多时候我们还还需要把项目布在iis环境中或者在vs里启动iis express服务 ...
- .netcore持续集成测试篇之web项目验收测试
系列目录 通过前面的单元测试,我们能够保证项目的基本模块功能逻辑是正常的,通过集成测试能够保证接口的请求是正常的.然而最终项目交付我们还需要对项目进行页面的行为进行测试,比如页面布局是否正常,按钮是否 ...
- .netcore持续集成测试篇之Xunit结合netcore内存服务器发送post请求
系列目录 Web项目中,很多与用户数据交互的请求都是Post请求,想必大家都用过HttpClient构造过post请求,这里并不对HttpClient做详细介绍,只介绍一些常用的功能.并结合AutoF ...
- .netcore持续集成测试篇之测试方法改造
系列目录 通过前面两节讲解,我们的测试类中已经有两个测试方法了,总体上如下 public class mvc20 { private readonly HttpClient _client; publ ...
随机推荐
- Dungeon Master POJ - 2251(bfs)
对于3维的,可以用结构体来储存,详细见下列代码. 样例可以过,不过能不能ac还不知道,疑似poj炸了, #include<iostream> #include<cstdio> ...
- 网络IO-阻塞、非阻塞、IO复用、异步
网络socket输入操作分为两个阶段:等待网络数据到达和将到达内核的数据复制到应用进程缓冲区.对这两个阶段不同的处理方式将网络IO分为不同的模型:IO阻塞模型.非阻塞模型.多路复用和异步IO. 一 阻 ...
- 用python的matplotlib和numpy库绘制股票K线均线的整合效果(含从网络接口爬取数据和验证交易策略代码)
本人最近在尝试着发表“以股票案例入门Python编程语言”系列的文章,在这些文章里,将用Python工具绘制各种股票指标,在讲述各股票指标的含义以及计算方式的同时,验证基于各种指标的交易策略,本文是第 ...
- 并发编程-concurrent指南-回环栅栏CyclicBarrier
字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行. java.util.concurrent.CyclicBarrier 类是一种同步机制,它能够对处理一些算法的线程实现同步 ...
- 在CentOS7下搭建Hadoop2.9.0集群
系统环境:CentOS 7 JDK版本:jdk-8u191-linux-x64 MYSQL版本:5.7.26 Hadoop版本:2.9.0 Hive版本:2.3.4 Host Name Ip User ...
- django基础知识之模板继承:
模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填 ...
- Java学习笔记之---static
Java学习笔记之---static static不能修饰类,局部变量 (一)静态成员的特征 static+属性 静态属性 无论实例化出来多少个对象,都会共用同一块静态空间,类对象共享 静态成员从第 ...
- 基于SpringBoot-Dubbo的微服务快速开发框架
简介: 基于Dubbo的分布式/微服务基础框架,为前端提供脚手架开发服务,结合前一篇--Web AP快速开发基础框架,可快速上手基于Dubbo的分布式服务开发,项目代码: https://github ...
- 无法在<fastCGI>应用程序配置中找到<handler> scriptProcessor
在打开php文件的时候发现iis7.5报错了 每次在切换php版本的时候不知道为什么会出现这个错误,有的时候就又不会报错直接可以正常使用,然而php版本确定已经下载好,才可能的打开这个页面,那么就是i ...
- Zeppelin0.5.6使用spark解释器
Zeppelin为0.5.6 Zeppelin默认自带本地spark,可以不依赖任何集群,下载bin包,解压安装就可以使用. 使用其他的spark集群在yarn模式下. 配置: vi zeppelin ...