.net core中基于xUnit框架进行的单元测试(提高测试质量,减少bug,支持持续交付集成)

-- .net core中基于xUnit框架进行单元测试(提高测试质量,减少bug,支持持续交付集成)
【官网】:https://xunit.github.io/

应用场景

一般开发项目中随着产品越来越复杂,普通的人工测试,程序员自己写几个console测试无法满足测试的工作量了。为了提高测试效率,降低测试工作量,降低bug量,可充分利用xUnit进行单元测试。xUnit甚至还可以与git协作,实现质量控制下的可持续交付。

基础资源

Visual studio 2019,xUnit 

使用须知

请自行查找各vs版本与xUnit版本的对应关系。另外单元测试需要注意覆盖率,需要开发人员认真对待才能体现它的效果。

配置步骤

【步骤1:vs中安装xUnit】

如果已经安装则自动跳过该步骤...

在Nuget中搜索xunit,这里我们只选xUnit.net和xunit.runner.visualstudio包

   其中xUnit是框架,而xunit.runner.visualstudio是vs插件包,让我们可以方便的在vs中调试。安装xunit.runner.console也可以在CMD下调试,但是如果只支持这个,相信也没多少人会用这个框架,毕竟敲命令的方式严重拉低了Visual Studio的档次,所以这里也不做讲解。

装好xunit.runner.visualstudio之后,打开 测试--》窗口--》测试资源管理器就可以在左侧窗口随时运行测试了。

【步骤2:创建项目,开发一个类】

      正常的业务项目即可,另外为了方便单元测试,开发过程应该尽量遵循 《Clean Code》的一些原则,例如:命名规范,参数数量精简,类指责单一,函数行数避免太多等等。

      试想如果函数太复杂,类指责太多,单个函数参数太多,则单元测试的用例难以理解,难以编写和把控。

【步骤3:创建xUnit测试项目】

       

[注1]xUnit单元测试的类库需要引用待测试的目标类库。

[注2]xUnit支持[Fact]和[Theory]两种属性。从代码中也可以看出来,[Fact]就类似于我们写的实际调用代码,而[Theory]配合InlineData可以直接在一个方法中测试多组参数

[Fact]和[Theory]还可以带两个参数,一个是修改显示名称,一个是跳过测试

【步骤4:启动运行】



【步骤5:查看测试报告】

 单元测试完成后,会有清晰的运行报告显示,绿色为成功,红色为失败,还可以通过

 [Fact(DisplayName ="通过测试")]这种特性实现个性化的报告显示。

常见问题

快速入门

一个单元测试的实例

<步骤1:开发业务代码>


using ConfigLab.Dnc.Comp;
using System;
using System.Text.RegularExpressions;

namespace ConfigLab.MathLab
{
    /// <summary>
    /// 功能简介:写一个方法,之后等一会用单元测试对该方法进行测试
    /// 创建时间:2020-9-22
    /// 创建人:http://config.net.cn
    /// </summary>
    public class StringUtils
    {
        public bool existsNumber(string sStr)
        {
            if (Regex.IsMatch(sStr, ".*[0-9]+.*"))
                return true;
            return false;
        }
    }
}

<步骤2:开发单元测试项目>
using ConfigLab.MathLab;
using System;
using Xunit;

namespace XUnitTestConfigLab
{
    /// 功能简介:单元测试(测试StringUtils)
    /// 创建时间:2020-9-22
    /// 创建人:http://config.net.cn
    public class UnitTestStringUtils
    {
        StringUtils mathUtilInstance = null;
        public UnitTestStringUtils()
        {
            mathUtilInstance = new StringUtils();
        }
        [Fact]
        public void TestSuccess()
        {
            Assert.True(mathUtilInstance.existsNumber("da1be23c"));
        }
        [Fact]
        public void TestFalse()
        {
            Assert.False(mathUtilInstance.existsNumber("abc"));
        }

        [Theory]
        [InlineData("")]
        [InlineData(" 2  ")]
        [InlineData("da2be2c")]
        public void TestBatchParams(string value)
        {
            Assert.True(mathUtilInstance.existsNumber(value));
        }
    }
}

<步骤3:运行>
 

<步骤4:查看单元测试报告>



参考资料