单元测试中Assert详解-xUnit

x33g5p2x  于2022-04-06 转载在 其他  
字(2.6k)|赞(0)|评价(0)|浏览(476)

前一篇:详谈单元测试-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()
        {
            // Arrange
            var programmer = new Programmer();

            // Act
            var result = programmer.IsPM;

            // Assert
            Assert.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()
{
    //Arrange
    var programmer = new Programmer();

    //Act
    programmer.Languages = new List<string>()
    {
        "GO",
        "JAVA",
        "C#"
    };

    Assert.Contains("JAVA", programmer.Languages); // 期望会 Java
    Assert.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); //期望是同一个实例
}

相关文章