前一篇:详谈单元测试-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); //期望是同一个实例
}