前一篇:详谈单元测试-xUnit


简介

Assert 是基于代码的返回值、对象的最终状态、事件是否发生等情况来评估测试的结果。Assert 的结果可能是 Pass 或者 Fail。如果所有的 Asserts 都通过了,那么整个测试就通过了。如果任何 Asserts 失败了,那么结果就失败了。

一个 Test 里应该有多少个 Asserts ? 一种简易的做法是,每个 Test 方法里面只有一个 Asserts 。而还有一种建议就是,每个 Test 里面可以有多个 Asserts ,只要这些 Asserts 都是针对同一个行为。

类型

Assert 提高了许多的 API 分别可以对不同的类型进行操作:bool、string、int、object 、collection 等

演示示例:先建一个 .net core 或者 standard 类库项目,再建立一个 xunit 测试项目,创建一个 Programmer(程序员) 类

Bool

Assert.True、Assert.False 用于判断期望结果是 true 或者 false。首先给程序员加个属性是否是同时又是 PM:public bool IsPM { get; set; },接着创建 IsPm 的单元测试

    public class ProgrammerTests{[Fact]public void IsPm(){// Arrangevar programmer = new Programmer();// Actvar result = programmer.IsPM;// AssertAssert.True(result);}}

Assert.True 代码当结果 result 是 true 的时候,单元测试时通过的。反之, Assert.False 亦然。接着运行单元测试,可以看到是未通过的,并且提示我们期望的结果是 true 时间结果是 false
接着在单元测中,给 Programmer 的 IsPM 属性赋值 true ,然后运行单元测试,可以看到是通过的

字符串

string 类型提供的 api 相对较多,如: Assert.Equal - 等于、Assert.StartsWith - 已开头、Assert.EndsWith - 以结尾 、Assert.Contains - 包含、Assert.NotEqual - 不相等、Assert.Matches - 正则匹配等等

[Fact]
public void FullName()
{var programmer = new Programmer();programmer.FirstName = "Nick";programmer.LastName = "Carter";var fullName = programmer.FullName;Assert.Equal("Nick Carter", fullName); //相等Assert.StartsWith("Nick1", fullName);//以开头Assert.EndsWith("Carter", fullName);//以结尾Assert.Contains("Carter", fullName);//包含Assert.Contains("Car", fullName);Assert.NotEqual("CAR", fullName);//不相等Assert.Matches(@"^[A-Z][a-z]*\s[A-Z][a-z]*", fullName);//正则表达式
}

数字

数字包括 int、double 等类型,提供 Assert.Equal - 相等、Assert.InRange - 范围 等等 API

[Fact]
public void Age()
{var programmer = new Programmer();programmer.Age = 25;var age = programmer.Age;Assert.Equal(25, age); //判断是否相等Assert.InRange(age, 24, 35);//判断是否在某一范围内
}

Null

空可以判断值类型与引用类型、提供了 Assert.NotNull - 期望非空、Assert.Null - 期望空

[Fact]
public void Null()
{var programmer = new Programmer();programmer.FirstName = "Nick";Assert.NotNull(programmer); // 期望不是空Assert.Null(programmer.FirstName); // 期望是空
}

集合

Assert 也支持集合,Contains 期望集合含有某个元素,DoesNotContain 期望集合不含有某个元素,如下

[Fact]
public void Languages()
{//Arrangevar programmer = new Programmer();//Actprogrammer.Languages = new List<string>(){"GO","JAVA","C#"};Assert.Contains("JAVA", programmer.Languages); // 期望会 JavaAssert.DoesNotContain("C#", programmer.Languages); // 期望不会 C#
}

对象

面对复杂对象 Assert 也同样支持,IsNotType 实例是否是某种类型、IsAssignableFrom 实例是否继承某种类型、NotSame 两个实例是否是同一个实例。如下

[Fact]
public void Programmer()
{var p = new Programmer();var p2 = new Programmer();Assert.IsNotType<Person>(p); //期望是不是 Person 类型Assert.IsType<Programmer>(p); //期望是 Programmer 类型Assert.IsAssignableFrom<Person>(p); //期望对象 p 继承自 Person 类型Assert.NotSame(p, p2); //期望不是同一个实例Assert.Same(p, p2); //期望是同一个实例
}

单元测试中Assert详解-xUnit相关推荐

  1. C++ assert() 详解

    C++ assert 宏的应用方式将会在这篇文章中进行详解 相信对此有兴趣的朋友们应该可以根据我们介绍的内容充分掌握这方面的应用技巧.  作为一个经验丰富的编程人员来说,对于C++编程语言应该不会陌生 ...

  2. MyBatis中resultMap详解

    MyBatis 中 resultMap 详解 resultMap 是 Mybatis 最强大的元素之一,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中.如在实际应用中,有一个表 ...

  3. 函数中{}输出格式详解(C#)

    Console.WriteLine()函数中{}输出格式详解(C#) Console.WriteLine()函数的格式一直没怎么注意.今天同事问起Console.WriteLine({0:D3},a) ...

  4. Java中CAS详解

    转载自  Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...

  5. 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

    转自:图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 ...

  6. oracle itl解析,oracle数据块dump文件中ITL详解

    oracle数据块dump文件中ITL详解 dump出Oracle block后,可以看到事物槽,包含有事物槽号(ITL),XID,UBA,FLAG,LCK,SCN. 本文主要讨论FLAG标记的规则, ...

  7. android中getSystemService详解

    原文地址:android中getSystemService详解作者:邹斌 http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blo ...

  8. Oracle中CONCAT详解

    Oracle中CONCAT详解 1.什么是CONCAT 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写 ...

  9. Java中LinkedList详解

    Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...

最新文章

  1. 华为于璠:新一代AI开源计算框架MindSpore的前世与今生 | AI ProCon 2019
  2. URL存在http host头攻击漏洞-修复方案
  3. VTK:平面源用法实战
  4. 博客园添加一个分享的
  5. mxGraph实现按住ctrl键盘拖动图形实现复制图形功能
  6. python-if判断的本质
  7. Hibernate的发展和特点以及Hibernate的工作原理简介
  8. matlab slice
  9. 类的加载过程详解之过程四:类的Using使用
  10. Java中 Cloneable 、Serializable 接口详解
  11. delphi cxgrid读取本地image_读取多个(海康\大华)网络摄像头的视频流 (使用opencv-python),解决实时读取延迟问题...
  12. Android之Http通信——1.初识Http协议
  13. android矢量地图画法_Android 百度地图,手绘图形
  14. onedrive 添加到本地硬盘_Win10系统OneDrive映射到本地磁盘的解决设置技巧
  15. 网易 产品策划( 杭州研究员) 笔试题解
  16. MySQL——MySQL逻辑架构
  17. hdu5769Substring
  18. UG/NX二次开发 判断圆柱面是不是孔的方法
  19. BCIduino转载|3D打印机使用的日常问题汇总
  20. js前端下载文件,利用download.js或者,纯js下载文件,图片,视频,pdf等

热门文章

  1. 键盘鼠标是计算机标准输入输出设备,微型计算机输入输出设备之键盘和鼠标(ppt 32页).ppt...
  2. 惠普打印机2132故障灯大全图解_绝对干货!二手打印机选购攻略!
  3. latex排版——博雅编辑室
  4. C++的数据复合类型
  5. STM32 SWD模式下SPI3无法使用的问题
  6. 分布式系统的性能优化方法
  7. Esp32 TCA9555 基于Arduino基于 microByte
  8. Rockchip Linux PCIe 开发指南
  9. 智慧非智能,智慧园区智慧在哪里?
  10. 在修改了PS1环境变量后,系统终端出现不换行问题解决