zoukankan      html  css  js  c++  java
  • ASP.NET Core搭建多层网站架构【3-xUnit单元测试之简单方法测试】

    2020/01/28, ASP.NET Core 3.1, VS2019, xUnit 2.4.0

    摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构【3-xUnit单元测试之简单方法测试】
    使用xUnit编写单元测试,测试上一章节的基础公共库

    文章目录

    此分支项目代码

    上一章节已经建立了Common公共类库,本章节介绍编写简单的单元测试,对上一章节的公共类库中EnumExtension方法编写单元测试,同时也是介绍上一章节中公共类库EnumExtension的使用方法
    官方文档对测试的最佳实践

    新建测试项目

    在tests解决方案文件夹下,新建xUnit测试项目,存放在解决方案tests路径下:

    我这里测试项目名称规则为"测试目标项目名称+Tests",这里测试的是Common项目,所以测试项目取名CommonTests
    项目新建成功后,记得要引用MS.Common类库

    新建一个枚举用于测试

    既然是为了测试枚举方法,当然需要先有一个枚举StatusCodeEnum.cs类,就存放在测试项目下:

    using System.ComponentModel;
    
    namespace CommonTests
    {
        public enum StatusCode
        {
            [Description("已删除")]
            Deleted = -1,//软删除,已删除的无法恢复,无法看见,暂未使用
            [Description("生效")]
            Enable = 0,
            [Description("失效")]
            Disable = 1//失效的还可以改为生效
        }
    }
    

    编写枚举方法测试代码

    把原先的UnitTest1.cs删除,新建EnumExtensionTest.cs类:
    可以看到我这里测试类命名规则为"测试目标类名称+Test",这里测试的是EnumExtension类,所以取名为EnumExtensionTest
    将EnumExtensionTest类修改为pulic类型
    在其中添加测试一个测试方法:

    [Fact]
    [Trait("GetEnum", "itemName")]
    public void GetEnum_EnumName_ReturnCorrespondEnum()
    {
        //Arrange
        StatusCode statusCode = StatusCode.Deleted;
    
        //Act
        string actual = statusCode.ToString();
    
        //Assert
        Assert.Equal(statusCode, actual.GetEnum<StatusCode>());
    }
    
    • 测试类必须是public类型
    • 测试用例需要打上[Fact]特性标记,Fact特性还可以给测试用例取别名
    • Trait特性可以对测试用例进行分组说明
    • 更多特性和使用方法可以搜索相关资源
    • 测试方法命名规则为"要测试的方法的名称+测试的方案+调用方案时的预期行为":
      • 此处测的是GetEnum方法,使用Enum名称,获取对应的枚举
      • 所以叫GetEnum_EnumName_ReturnCorrespondEnum
      • 整体方法名要易于理解测试的目的
    • 测试要分为三部分(AAA):Arrange、Act、Assert:
      • 安排对象,根据需要对其进行创建和设置
      • 作用于对象
      • 断言某些项按预期进行

    运行测试

    在VS中"测试"-"测试资源管理器",打开测试资源管理器:

    在测试资源管理器中已经可以看到我们刚刚写的测试用例。
    点击运行所有测试:

    等待测试结束,便会给出测试结果:

    以上便是最简单的单元测试流程
    针对EnumExtension方法完整的测试用例代码:

    using MS.Common.Extensions;
    using Xunit;
    
    namespace CommonTests
    {
        public class EnumExtensionTest
        {
            [Fact]
            [Trait("GetEnum", "itemName")]
            public void GetEnum_EnumName_ReturnCorrespondEnum()
            {
                //Arrange
                StatusCode statusCode = StatusCode.Deleted;
    
                //Act
                string actual = statusCode.ToString();
    
                //Assert
                Assert.Equal(statusCode, actual.GetEnum<StatusCode>());
            }
            [Fact]
            [Trait("GetEnum", "itemValue")]
            public void GetEnum_EnumValue_ReturnCorrespondEnum()
            {
                //Arrange
                StatusCode statusCode = StatusCode.Disable;
    
                //Act
                int actual = statusCode.GetHashCode();
    
                //Assert
                Assert.Equal(statusCode, actual.GetEnum<StatusCode>());
            }
    
            [Fact]
            [Trait("GetEnumName", "itemValue")]
            public void GetEnumName_EnumValue_ReturnCorrespondEnumName()
            {
                //Arrange
                StatusCode statusCode = StatusCode.Enable;
    
                //Act
                int actual = statusCode.GetHashCode();
    
                //Assert
                Assert.Equal(statusCode.ToString(), actual.GetEnumName<StatusCode>());
            }
    
            [Fact]
            [Trait("GetEnumValue", "itemName")]
            public void GetEnumValue_EnumName_ReturnCorrespondEnumValue()
            {
                //Arrange
                StatusCode statusCode = StatusCode.Disable;
    
                //Act
                string actual = statusCode.ToString();
    
                //Assert
                Assert.Equal(statusCode.GetHashCode(), actual.GetEnumValue<StatusCode>());
            }
    
            [Fact]
            [Trait("GetDescription", "Enum")]
            public void GetDescription_Enum_ReturnCorrespondEnumDescription()
            {
                //Arrange
                StatusCode statusCode = StatusCode.Deleted;
    
                //Assert
                Assert.Equal("已删除", statusCode.GetDescription());
            }
        }
    }
    

    添加了一个简单的单元测试用例,介绍了最基本的单元测试流程和方法

    项目完成后,如下图所示

  • 相关阅读:
    delphi XE5下安卓开发技巧
    Android开发者必备的42个链接
    STORM_0007_Multi-Lang protocol of Storm/多语言协议的翻译
    STORM_0006_第二个storm_topology:WordCountTopology的代码与运行
    STORM_0005_第一个非常简单的storm topology的提交运行
    STORM_0004_windows下zookeeper的伪集群的搭建
    STORM_0003_linux_zookeeper_storm_遇到的几个问题
    数据结构与算法题目集(中文)7-19 求链式线性表的倒数第K项 (20分)
    数据结构与算法题目集(中文)7-11 关键活动 (30分) (关键路径!!!!)
    数据结构与算法题目集(中文)7-18 银行业务队列简单模拟 (25分)
  • 原文地址:https://www.cnblogs.com/kasnti/p/12237965.html
Copyright © 2011-2022 走看看