zoukankan      html  css  js  c++  java
  • 使用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")]

        

  • 相关阅读:
    洛谷 P1387 最大正方形
    洛谷 P1508 Likecloud-吃、吃、吃
    洛谷 P1282 多米诺骨牌
    洛谷 P1880 [NOI1995]石子合并
    P1064 金明的预算方案 (依赖性背包问题)
    caioj 1114 树形动态规划(TreeDP)3.0:多叉苹果树【scy改编ural1018二叉苹果树】
    让Dev C++支持C++11
    1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
    caioj 1112 树形动态规划(TreeDP)7:战略游戏
    caioj 1111 树形动态规划(TreeDP)6: 皇宫看守 (状态设计)
  • 原文地址:https://www.cnblogs.com/shiningrise/p/5585830.html
Copyright © 2011-2022 走看看