• 使用Xunit进行单元测试


      目前在.Net框架下的测试工具主要有Nunit、内置的MSTest以及Xunit这三个工具,本文就简单的介绍一下如何在VS中使用XUnit这个测试框架的后起之秀。
    安装Xunit:
      Xunit的安装现在不需要插件支持了,直接使用NuGet安装如下两个库即可:
      PM> install-package xunit -Version 2.1(我用的.Net4.5.2的,这里用2.2会安装失败,用2.1的,根据实际情况调整版本)
      PM> install-package xunit.runner.visualstudio(测试适配器,感觉这是个坑,没有这个无法进行测试,上面安装xunit时不会自动安装,而且没有任何提示)
    编写测试用例:
      先写一个简单的待测试方法:

    public class Arithmetic
    {
      public int Add(int nb1, int nb2)
      {
        return nb1 + nb2;
      }
    }

      然后就是对该方法的测试用例了。

    [Fact]
    public void Add()
    {
      Arithmetic a = new Arithmetic();
      int res = a.Add(1, 2);
      Assert.Equal(3, res);
    }

      ps:测试类必须是public的,测试用例用FactAttribute标记。
    执行测试用例:
      运行:Ctrl+R,T
      调试:Ctrl+R,Ctrl+T
    测试结果输出:
    异常测试
      Xunit并不是通过Attribute来标记异常捕获的,而是直接使用Assert.Throws断言函数来验证异常。
      准备一个没做检查的除法方法。

    public int Divide(int nb1, int nb2)
    {
      return nb1 / nb2;
    }

      捕获异常

    [Fact]
    public void Divide()
    {
      Arithmetic a = new Arithmetic();
      Assert.Throws<DivideByZeroException>(() => a.Divide(1, 0));
    }

    更改测试用例名称:
    [Fact(DisplayName = "除法测试")]

    跳过测试用例:
    [Fact(Skip ="重构未完成")]

    分组:
    [Fact]
    [Trait("Group", "Category")]

      点击选择按特征分组

    多场景参数情况:
      注意到测试代码中的参数和结果都写死了。如果我们要对多种情况进行测试,岂不是需要写多个单元测试方法或者进行多次方法执行和断言。这也太麻烦了。在XUnit框架中为我们提供了Theory特性。使用如下:

    [Theory]
    [InlineData(1, 2)]
    [InlineData(1, 0)]
    [InlineData(0, 2)]
    public void AddMultiple(int parmaA, int parmaB)
    {
      Arithmetic a = new Arithmetic();
      int res = a.Add(parmaA, parmaB);
      Assert.Equal(parmaA + parmaB, res);
    }

    测试完成执行--清除垃圾数据:
      我们一般的项目都离不开数据库操作,都是我们会发现,链接数据库操作时每测试一次都会产生对应的垃圾数据,为了避免对测试的无干扰性。我们需要在每次测试后清除垃圾数据。
      这里我们可以通过实现IDisposable接口进行垃圾数据的清理。
    测试开始前执行--初始化数据:构造方法
    Stub:
      单元测试的定义与原则要求我们写的单元测试必须与外部环境、类别、资源、服务独立,不能直接相依。这样才是单纯的测试目标物件本身的逻辑是否符合预期。
      改写待测试方法:
      对比直接调用的方法和调用Stub的方法的结果。
      我们知道对数据库的操作是比较耗时的,而单元测试的要求是尽可能的减少测试方法的执行时间。因为单元测试执行的比较频繁。基于前面已经对数据库的实际操作已经测试过了,所以我们在后续的上层操作使用Stub(存根)来模拟,而不再对数据库进行实际操作。
    Mock:
      虽然我们现在把测试方法分离了出来了,但每次都要手动重写一个模拟方法还是很麻烦啊,好在Mock框架(Moq)可以自动帮我们完成这个步骤。
      第三个方法MockAdd就是我们Mock出来的方法,相比上面的示例,是不是简化多了。起码代码看起来清晰了,可以更加注重测试逻辑。
      Mock方法时可以设置指定方法参数的返回值。

      

      刚自学单元测试,如有高见,欢迎指教。

  • 相关阅读:
    在Azure虚拟机上安装SQL server
    Azure的负载均衡机制
    如何在ARM中创建Express Route
    如何将已部署在ASM的资源迁移到ARM中
    Azure上的那些IP
    使用mysqlslap对mysql进行压测,观察Azure虚拟机cpu使用率
    在Azure虚拟机上安装VNC
    DataGridView中实现checkbox全选的自定义控件
    jquery checkbox 实现单选
    如何通过Azure Service Management REST API管理Azure服务
  • 原文地址:https://www.cnblogs.com/ccccc05/p/7266914.html
走看看 - 开发者的网上家园