使用Xunit来进行单元测试

Posted 吴晓阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Xunit来进行单元测试相关的知识,希望对你有一定的参考价值。

不管你爱与不爱,单元测试对于一个软件的长治久安还是必不可少的一环。在Visual Studio 2012后,VS中的测试浏览器也能与第三方的集成了,用起来还是非常方便的。目前在.Net框架下的测试工具主要有Nunit、内置的MSTest以及Xunit这三个工具,本文就简单的介绍一下如何在VS中使用XUnit这个测试框架的后起之秀。

 

安装Xunit:

Xunit的安装现在不需要插件支持了,直接使用NuGet安装如下两个库即可:

  • PM> Install-Package xunit
  • PM> Install-Package xunit.runner.visualstudio -Pre (Visual Studio测试浏览器支持, VS2015目前必须装Pre的)

 

编写测试用例:

一个简单的测试用例如下:

    public class TestClass1
    {
        [Fact]
        public void testMax()
        {
            Assert.Equal(3, Math.Max(3, 2));
        }

        [Fact]
        public void testFail()
        {
            Assert.Equal(2, Math.Max(3, 2));
        }
    }

 

执行测试用例

在测试浏览器中执行RunAll即可(修改后不用编译,它会自动编译)

    

 

测试方式说明:

声明测试用例:

Xunit里面不需要TestClass之类Attribute来标记测试用例类,只需要满足如下条件即可:

  • 测试类必须是public的
  • 测试用例用FactAttribute标记

 

断言:

Assert类用来验证测试测试函数的输出结果。

    Assert.Equal(3, Math.Max(3, 2));

也可以使用一些扩展的断言库,常用的就是xunit.should库,它是以扩展函数的方式进行验证,看起来更加舒服。

PM> Install-Package xunit.should

    Math.Max(3, 2).ShouldBe(3);

 

不过,这个库和新版本的XUnit适配不是很好,我这里写了一个简单的版本: 

复制代码
    static class AssertExtension
    {
        public static void ShouldBe<T>(this T value, T exprected)
        {
            if(Equals(value, exprected))
                return;

            var msg = $"与预期结果不一致,当前值是 \'{format(value)}\', 期望值是 \'{format(exprected)}\'";
            throw new InvalidOperationException(msg);
        }

        public static void ShouldNotBe<T>(this T value, T notExprected)
        {
            if (!Equals(value, notExprected))
                return;

            var msg = $"与预期结果不一致,当前值不应该是 \'{format(notExprected)}\' ";
            throw new InvalidOperationException(msg);
        }
static string format(object value) { return value == null ? "NULL" : value.ToString(); } }
复制代码

 

构建和析构:

Xunit里面并不是通过SetUp和TearDown标记来表明测试用例的构建和析构操作,它每次执行测试用例的时候都会插件测试用例类,执行完成后,如果其实现了IDispose接口,则会调用Dispose函数,更加简洁明了。也就是说:

  • 在测试用例类的构造函数指向数据构建操作
  • 在Dispose函数中指向数据清理操作

 

异常测试

Xunit并不是通过Attribute来标记异常捕获的,而是直接使用Assert.Throws断言函数来验证异常。

    public class TestClass1
    {
        [Fact]
        public void testException()
        {
            Assert.Throws<InvalidOperationException>(() => operation());
        }

        void operation()
        {
            throw new InvalidOperationException();
        }
    }

 

更改测试用例名称:

     [Fact(DisplayName = "Max函数测试")]

 

跳过测试用例:

     [Fact(Skip ="重构未完成")]

 

分组:

     [Trait("Group", "Category")]

    

以上是关于使用Xunit来进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rider 中进行 xUnit 测试?我收到错误 CS0246

如何使用 XUnit 对 Web API 控制器进行单元测试

无法使用 .NET Core 运行 xUnit 测试

无法使用 .NET Core 运行 xUnit 测试

Xunit单元测试将无法运行

如何在 jwt 授权的 web api 上执行 XUnit 测试?