当前位置:必发365电子游戏 > Web前端 > 而一向行使上了xUnit.net
而一向行使上了xUnit.net
2019-12-19

二零一六.6.27 微软早就正式颁发了.NET Core 1.0 RTM,不过工具链照旧预览版,相近的恢宏的开源测量试验库也都以致少公布了Alpha测量试验版协理.NET Core, 那篇小说 The State of .Net Core Testing Today 就将顺序开源测量试验库的眼下开展实行了聚集。本文大家的目的是在大家营造大家应用程序的时候能够实行测量试验,怎么样使用XUnit结合你可以由此为您的等级次序增加不一致的测量检验用例NSubstitute进行单元测验,同临时间对全体项目进行归拢测验。此次我们应用Visual Studio 二〇一六 Update 3进行编写 。xUnit.net是基于.NET Framework 的开源测量试验工具。通过xUnit.net能够针对C#/F#/VB.NET等进行单元测量检验。ASP.NET Core 越来越直接把过去的Visual Studio Unit Test Framework 说后会有期了,而直白动用上了xUnit.net,xUnit.net基于NUnit 。从网址或许官英特网,你能够找到不菲xUnit的优点,与NUnit和别的测量试验框架相比较有须臾间某个优势 
         1)为各种测量检验方法发生多少个指标实例
         2)取消了[SetUp]和[TearDown]
         3)取消了[ExpectedException]
         4)类似于Aspect的功能
         5)降低了自定义属性(Attribute)的数码
         6)接纳泛型
         7)无名氏委托
         8)可扩大的断言
         9)可扩展的测量检验方法
         10)可扩张的测量检验类

         领悟越多关于xUnit.net能够参考这里(点击张开链接[舍弃Nunit拥抱Xunit])。

 

动用xUnit.net 单元测量试验

 

 

 

首先大家好像于.NET Core连串 :3 、使用几个类型 制造多少个减轻方案testdemo,增添一个类库项目名称叫DotnetCoreLib,Library.cs 也轮番为:

namespace DotnetCoreLib
{
    public class Calculator
    {
        public int Multi(int x, int y)
        {
            return x * y;
        }
    }

}

必发365电子游戏 1

下边我们要开创三个照准DotnetCoreLib的测量试验项目,具体创制进程大家参照小说 ,大家更正DotnetCoreLibTest 项目标project.json ,增添XUnit相关的nuget包引用,并校勘部分公司署。

 

必发365电子游戏 2 

再有我们设置Framework节点为 netcoreapp1.0, 重视的xunit 和xunit.runner的包

"dependencies": {
    "dotnet-test-xunit": "2.2.0-preview2-build1029",
    "DotnetCoreLib": {
      "version": "1.0.0-*",
      "target": "project"
    },
    "xunit": "2.2.0-beta2-build3300",
    "xunit.runner.console": "2.2.0-beta2-build3300"
  }

 

Calculator接下去就从头测量试验大家的类库Calculator, 更改Class1.cs为CalculatorTest.cs ,

 

using DotnetCoreLib;
using Xunit;

 

namespace DotnetCoreLibTest
{
    public class CalTest
    {
        private readonly Calculator calculator;

        public CalTest()
必发365电子游戏,        {
            calculator = new Calculator();
        }

 

        [Fact]
        public void OneMutiOneIsOne()
        {
            var result = calculator.Multi(1, 1);
            Assert.Equal(1, result);
        }

 

        [Theory]
        [InlineData(-1)]
        [InlineData(0)]
        [InlineData(1)]
        public void ReturnValue(int value)
        {
            var result = calculator.Multi(1,value);

            Assert.Equal(result, value);
        }
    }
}

 

地点的四个测量检验,我们分别用了2个性状[Fact] 和[Theory], [Fact]品质表示为三个措施的单个测试,[Theory]质量表示实践相符的代码,可是有分歧的输入的参数的测验套件。[InlineData] 属性可用于钦赐为这几个输入值。通过特征[Fact] 和[Theory],xUnit就精晓了这是个测验方法,然后运维这一个点子。在三个测验方法中,大家日常固守富含三步骤的AAA模式:

  1. Arrange:为测量试验筹划
  2. Act:运作SUT(实际测验的代码卡塔尔
  3. Assert:校验结果

上边大家运营dotnet test 就足以见见结果了。

C:UsersgeffzDocumentsVisual Studio 2015ProjectsTestDemoDotnetCoreLibTest>dotnet test
Project DotnetCoreLib (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Project DotnetCoreLibTest (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
xUnit.net .NET CLI test runner (64-bit .NET Core win10-x64)
  Discovering: DotnetCoreLibTest
  Discovered:  DotnetCoreLibTest
  Starting:    DotnetCoreLibTest
  Finished:    DotnetCoreLibTest
=== TEST EXECUTION SUMMARY ===
   DotnetCoreLibTest  Total: 4, Errors: 0, Failed: 0, Skipped: 0, Time: 0.206s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.

 

下面的输出我们明白已经实践了4个测量试验,都因而了,[Face]特色标志表示一定输入的测量试验用例,而[Theory]特点标记表示能够内定两个输入的测验用例,结合InlineData天性标记应用。在下面的事例里,总共使用了三次InlineData特性标志,每便设定的值都不可不分厚薄,在实践单元测量检验时,设定的值会被测量试验框架赋值到对应的测量检验方法的参数里。你能够透过为你的系列增进不一致的测验用例,那样就足以让您的代码拿到丰富测量试验。

 

xUnit.net 搭配NSubstitute 举办单元测验

 

   在三个分段结构清晰的类别里,各层之间信赖于事情发生在此之前约定好的接口。在几个人同盟开荒时,大多数人都只会承当本人的那某些模块功用,开垦进程平常景况下也不相同。当某些开辟职员供给对友好的模块举办单元测验而依靠的此外模块还不曾支付到位时,则须要对依赖的接口通过Mock的议程提供模拟作用,进而到达在不实际重视别的模块的现时效果的情形下产生本身模块的单元测量试验专业。当时大家普通供给有三个单元测量检验模拟类库,一如既往,开采者对 mocking 类库的语法的简洁性有分明的须要,NSubstitute 试图满意那意气风发必要。老妪能解的语法能够让大家将大旨放在测验自个儿,并非纠结在测量试验代替实例的创导和布署上。NSubstitute 已尝试将最常用的操作须求轻巧化、易用化,并协助部分临时用的或探索性的功用,与此同一时候还尽量地将其语法向自然语言临近。关于NSubstitute的更详细消息请往 NSubstitute完全手册索引。

 

NSubstitute 已经发布2.0 RC版本扶持.NET Core。引进NSubstitute 相关nuget包:

必发365电子游戏 3

咱俩把Calculator 类重构下提抽出接口ICalculator:

    public interface ICalculator
    {
        int Multi(int x, int y);
    }

 

大家能够让NSubstitute来创建项目实例的代替实例,能够创制诸如 Stub、Mock、Fake、Spy、Test Double 等,但当大家只是想要一个能有自然程度决定的代表实例时,为何大家要麻烦于此呢?我们得以告知被创建的代替实例,当方法被调用时再次来到二个值:

     [Fact]
      public void Test_GetStarted_ReturnSpecifiedValue()
      {
          ICalculator calculator = Substitute.For<ICalculator>();
          calculator.Multi(1, 2).Returns(2);

          int actual = calculator.Multi(1, 2);
          Assert.Equal(2, actual);
      }

上面大家运转dotnet test 就足以见见结果了,增添了下边包车型客车2个用例,关于NSubstitute的更详细音信请往 NSubstitute完全手册索引。

必发365电子游戏 4

 

集成测量检验

位置我们只是对逻辑进行了单元测量试验。对于Asp.Net Core项目,还须要效法在网址安插的情事下对各样哀告入口进行测量检验。NET Core 可为飞快轻易集成测量试验提供特别棒的支撑。

TestServer 类为 ASP.NET Core 中的集成测量检验推行大部分辛苦操作,Microsoft.AspNetCore.TestHost 包中装有此类。本节内容出自于MSDN杂志《 ASP.NET Core - 实际的 ASP.NET Core MVC 筛选器》,这几个合并测验不供给数据库或 Internet 连接或运转的 Web 服务器。它们就像单元测量检验相像高速轻便,但最根本的是,它们允许你在全部哀告管道中测试ASP.NET 应用,而不只是调节器类中的孤立方法。提出尽量编写单元测验,并对准不能单元测量试验的一举一动退回到集成测验,但利用此类高质量情势在 ASP.NET Core 中运转集成测试是非常的棒的。

 

经过在三个工程里还要效仿了服务端(TestServer卡塔尔和客商端(HttpClient卡塔尔(قطر‎的通讯,从而达到了整机测量试验WebApi接口的目标,相关的代码放在 。文章对ASP.NET CORE MVC的筛选器进行测量检验,由于很难通过编写制定单元测验来测量试验此类现象,但是能够透过ASP.NET Core 的并轨测量检验来达成平等的指标。

using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using Filters101;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;

 

namespace IntegrationTests
{
    public class AuthorsControllerTestBase
    {
        protected HttpClient GetClient()
        {
            var builder = new WebHostBuilder()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .UseEnvironment("Testing");
            var server = new TestServer(builder);
            var client = server.CreateClient();

            // client always expects json results
            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            return client;
而一向行使上了xUnit.net。        }
    }
}

 

 

using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Filters101.Models;
using Newtonsoft.Json;
using Xunit;

namespace IntegrationTests.AuthorsController
{
    public class Get : AuthorsControllerTestBase
    {
        private readonly HttpClient _client;

        public Get()
        {
            _client = base.GetClient();
        }

        [Theory]
        [InlineData("authors")]
        [InlineData("authors2")]
        public async Task ReturnsListOfAuthors(string controllerName)
        {
            var response = await _client.GetAsync($"/api/{controllerName}");
            response.EnsureSuccessStatusCode();
            var stringResponse = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<IEnumerable<Author>>(stringResponse).ToList();

            Assert.Equal(2, result.Count());
            Assert.Equal(1, result.Count(a => a.FullName == "Steve Smith"));
            Assert.Equal(1, result.Count(a => a.FullName == "Neil Gaiman"));
        }
    }
}

此案例中的顾客端是正经的 System.Net.Http.HttpClient,你能够利用它向服务器发出诉求,正就像是通过互联网雷同。但因为全部伏乞都在内部存款和储蓄器中张开,所以测量检验最佳飞速可信。在cmd窗口进行单元测验,查看测量检验结果

必发365电子游戏 5