系列目录

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

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

下面看如何使用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();
}
}

.net持续集成测试篇之Nunit that断言的更多相关文章

  1. .net持续集成测试篇之Nunit常见断言

    系列目录 Nunit测试基础之简单断言 在开始本篇之前需要补充一些内容,通过前面搭建Nunit测试环境我们知道要使一个方法成为单元测试方法首先要在此方法所在类加上TestFixture注解,并且在该方 ...

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

    使用前面讲过的方法基本上能够完成工作中的大部分任务了,然而有些功能实现起来还是比较麻烦的,比如说字符串相等性比较不区分大小写,字符串是否匹配某一正则规则,集合中的每一个(某一个)元素是否符合特定规则等 ...

  3. .net持续集成测试篇之Nunit 测试配置

    系列目录 在开始之前我们先看一个陷阱 用到的Person类如下 public class Person:IPerson { public string Name { get; set; } publi ...

  4. .net持续集成测试篇之Nunit参数化测试

    系列目录 在进行单元测试的时候,很多时候,很多时候我们都是在单元测试方法内部提供特定的值,但是这样测试往往造成样本数不足从而导致覆盖的结果不够全面,很多时候我们更想提供来自外部的,满足条件的一组值来进 ...

  5. .netcore持续集成测试篇之开篇简介及Xunit基本使用

    系列目录 为了支持跨平台,微软为.net平台提供了.net core test sdk,这样第三方测试框架诸如Nunit,Xunit等只需要按照sdk提供的api规范进行开发便可以被dotnet cl ...

  6. .netcore持续集成测试篇之web项目验收测试

    系列目录 通过前面的单元测试,我们能够保证项目的基本模块功能逻辑是正常的,通过集成测试能够保证接口的请求是正常的.然而最终项目交付我们还需要对项目进行页面的行为进行测试,比如页面布局是否正常,按钮是否 ...

  7. .netcore持续集成测试篇之搭建内存服务器进行集成测试一

    系列目录 在web项目里,我们把每一层的代码的单元测试都通过并不代表程序能正常运行,因为这个过程缺失了http管道,很多时候我们还还需要把项目布在iis环境中或者在vs里启动iis express服务 ...

  8. .netcore持续集成测试篇之Xunit结合netcore内存服务器发送post请求

    系列目录 Web项目中,很多与用户数据交互的请求都是Post请求,想必大家都用过HttpClient构造过post请求,这里并不对HttpClient做详细介绍,只介绍一些常用的功能.并结合AutoF ...

  9. .netcore持续集成测试篇之MVC测试

    前面我们讲的很多单元测试的的方法和技巧不论是在.net core和.net framework里面都是通用的,但是mvc项目里有一种比较特殊的类是Controller,首先Controller类的返回 ...

随机推荐

  1. oh-my-zsh自定义配置

    oh-my-zsh主题配置 默认的zsh主题robbyrussell已经很棒了, 简洁高效, 能很好的显示git的相关信息, 比如branch信息, 修改, 删除, 添加等操作. 但是多用户的话就不能 ...

  2. centOS7.3 6忘记密码/修改root密码

    RedHat最近升级了centos linux操作系统,更新为centos7,更新幅度之大,连红帽官方的认证RHCE也进行了升级,认证必须使用rhel7,可见红帽官方对centos7的重视程度. 最新 ...

  3. JS处理时间戳、前台拿到日期时间戳,时间戳转日期格式

    今晚做分页的时候,遇到后台往前台传日期类型,会出现这种情况,好像是微软为了解决操作系统兼容性问题,将日期全部转换为从1970年1月1日至现在时间的时间戳.为了解决这个问题,特意百度了一番,整理了处理日 ...

  4. 消息驱动式微服务:Spring Cloud Stream & RabbitMQ

    1. 概述 在本文中,我们将向您介绍Spring Cloud Stream,这是一个用于构建消息驱动的微服务应用程序的框架,这些应用程序由一个常见的消息传递代理(如RabbitMQ.Apache Ka ...

  5. 小容量单片机生成pdf文件

    工作上要求使用小容量单片机生成直接生成pdf文件.经过一段时间的摸索,其中参考了libharu,库太大,不适合在单片机上使用页参考了与非网上一位前辈的库,占用的RAM太大,不适合小容量单片机,主要资料 ...

  6. .NET Core 3.0之深入源码理解Kestrel的集成与应用(二)

      前言 前一篇文章主要介绍了.NET Core继承Kestrel的目的.运行方式以及相关的使用,接下来将进一步从源码角度探讨.NET Core 3.0中关于Kestrel的其他内容,该部分内容,我们 ...

  7. .Net Core 学习路由和请求参数传递

    一.配置默认路由方式 {Controller=Home}/{action=Index}/{id?} 默认请求地址:http://localhost:xxx/home/index /id? 是可选项例如 ...

  8. spring系列(一):超级经典入门

    一  spring是什么 Spring是一个开源框架,它由RodJohnson创建.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情. ...

  9. CDQZ集训DAY7 日记

    并没有考试然而心情比考试还糟糕…… 上午讲的基本就听不懂,讲课人迷之停顿.根本让人跟不上趟,声音好奇怪的说……好不容易讲到反演,Hzoi集体上线,等待装逼时刻的到来.然而,讲课人再次迷之停顿,讲一个p ...

  10. Spring Cloud Alibaba | Sentinel: 服务限流基础篇

    目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...