而向来采用上了xUnit.net,/VB.NET等张开单元测试

2016.六.二7 微软已经正式公布了.NET Core 一.0
RTM,可是工具链依旧预览版,一样的大度的开源测试库也都乃至少发表了Alpha测试版帮助.NET
Core, 那篇小说 The State of .Net Core Testing
Today

就将顺序开源测试库的此时此刻举办实行了集中。本文大家的目的是在大家塑造大家应用程序的时候可以实行测试,怎么着行使XUnit结合你能够经过为您的类型增进不一致的测试用例NSubstitute实行单元测试,同时对全部项目开展合并测试。此番我们选取Visual
Studio 20一五 Update 三进行编写 。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和其它测试框架比较有须臾间片段优势 
         壹)为种种测试方法产生贰个对象实例
         2)取消了[SetUp]和[TearDown]
         3)取消了[ExpectedException]
         4)类似于Aspect的功能
         伍)收缩了自定义属性(Attribute)的数量
         陆)采取泛型
         柒)佚名委托
         八)可扩充的断言
         九)可扩展的测试方法
         拾)可扩大的测试类

201六.陆.二7 微软已经正式宣告了.NET Core 一.0
RTM,不过工具链照旧预览版,一样的大气的开源测试库也都以起码发表了Alpha测试版帮忙.NET
Core, 那篇小说 The State of .Net Core Testing
Today

就将次第开源测试库的目前拓展进行了聚集。本文我们的目标是在大家营造大家应用程序的时候可以进行测试,怎样利用XUnit结合您能够经过为您的品种拉长不一样的测试用例NSubstitute举行单元测试,同时对任何项目展开集成测试。此次我们选拔Visual
Studio 20一5 Update 三实行编写 。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和别的测试框架相比较有弹指间有个别优势 
         壹)为各样测试方法产生三个对象实例
         2)取消了[SetUp]和[TearDown]
         3)取消了[ExpectedException]
         4)类似于Aspect的功能
         5)收缩了自定义属性(Attribute)的数据
         陆)采纳泛型
         七)无名氏委托
         八)可扩展的预感
         玖)可增添的测试方法
         十)可扩充的测试类

        
领会越多关于xUnit.net能够参见那里(点击展开链接[舍弃Nunit拥抱Xunit])。

        
精通越来越多关于xUnit.net能够参见那里(点击张开链接[舍弃Nunit拥抱Xunit])。

 

 

使用xUnit.net 单元测试

采取xUnit.net 单元测试

 

 

 

 

率先大家好像于.NET Core连串 :三、使用多个系列
成立三个缓慢解决方案testdemo,增多二个类库项目名称叫DotnetCoreLib,Library.cs
也交替为:

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

}

图片 1

上面我们要开创1个对准DotnetCoreLib的测试项目,具体成立进程大家参照作品
https://github.com/dotnet/core-docs/tree/master/samples/core/getting-started/unit-testing-using-dotnet-test
,大家修改DotnetCoreLibTest 项目标project.json
,增添XUnit相关的nuget包引用,并修改部总计划。

 

图片 2 

还有大家设置Framework节点为 netcoreapp壹.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,
修改Class①.cs为CalculatorTest.cs ,

 

using DotnetCoreLib;
using Xunit;

 

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

        public CalTest()
        {
            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);
        }
    }
}

 

地点的七个测试,大家独家用了3个特征[Fact] 和[Theory],
[Fact]特性表示为五个方法的单个测试,[Theory]天性表示施行同样的代码,但是有两样的输入的参数的测试套件。[InlineData]
属性可用来内定为这一个输入值。通过特征[Fact]
和[Theory],xUnit就清楚了那是个测试方法,然后运转这些艺术。在七个测试方法中,我们一般服从包蕴叁手续的AAA模式:

  1. Arrange:为测试计划
  2. Act:运营SUT(实际测试的代码)
  3. Assert:校验结果

上面我们运转dotnet test 就能够知见结果了。

C:\Users\geffz\Documents\Visual Studio
2015\Projects\TestDemo\DotnetCoreLibTest>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.

 

地点的出口大家驾驭已经实施了伍个测试,都由此了,[Face]特色标志表示一定输入的测试用例,而[Theory]特征标记表示能够内定多少个输入的测试用例,结合InlineData性格标记应用。在地点的事例里,总共使用了二次InlineData个性标志,每一回设定的值都比不上,在实行单元测试时,设定的值会被测试框架赋值到相应的测试方法的参数里。你能够经过为您的品种拉长不相同的测试用例,那样就能够让您的代码获得丰裕测试。

 

 

 

先是大家好像于.NET Core种类 :3、使用八个品类
创立1个消除方案testdemo,增添2个类库项目名叫DotnetCoreLib,Library.cs
也交替为:

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

}

图片 3

上面咱们要创造1个对准DotnetCoreLib的测试项目,具体成立进程我们参照小说
https://github.com/dotnet/core-docs/tree/master/samples/core/getting-started/unit-testing-using-dotnet-test
,大家修改DotnetCoreLibTest 项目标project.json
,扩张XUnit相关的nuget包引用,并修改部总陈设。

 

图片 4 

还有大家设置Framework节点为 netcoreapp一.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()
        {
            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);
        }
    }
}

 

地方的八个测试,大家分别用了1个特征[Fact] 和[Theory],
[Fact]品质表示为五个措施的单个测试,[Theory]性能表示实施一样的代码,不过有不一致的输入的参数的测试套件。[InlineData]
属性可用于钦定为那几个输入值。通过特征[Fact]
和[Theory],xUnit就知晓了那是个测试方法,然后运营那么些方式。在一个测试方法中,我们一般依照包括三手续的AAA模式:

  1. Arrange:为测试盘算
  2. Act:运维SUT(实际测试的代码)
  3. Assert:校验结果

下边大家运维dotnet test 就足以看到结果了。

C:\Users\geffz\Documents\Visual Studio
2015\Projects\TestDemo\DotnetCoreLibTest>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.

 

下边包车型地铁输出大家驾驭已经实践了两个测试,都通过了,[Face]特征标志表示固定输入的测试用例,而[Theory]特点标志表示能够钦定三个输入的测试用例,结合InlineData性格标记应用。在下边包车型大巴例子里,总共使用了3遍InlineData特性标记,每趟设定的值都不可同日而语,在实践单元测试时,设定的值会被测试框架赋值到对应的测试方法的参数里。你能够透过为你的花色增加不一样的测试用例,那样就足以让您的代码获得充裕测试。

 

xUnit.net 搭配NSubstitute 实行单元测试

 

  
在三个拨出结构清晰的项目里,各层之间依赖于事先约定好的接口。在多少人同盟开拓时,大大多人都只会顶住自个儿的那有些模块作用,开采进度经常情形下也不平等。当有个别开拓职员要求对自身的模块进行单元测试而借助于的其他模块还未有支付实现时,则要求对借助的接口通过Mock的艺术提供模拟功效,从而到达在不实际重视其余模块的有血有肉成效的场馆下完了自身模块的单元测试专门的学问。这时大家平日要求有八个单元测试模拟类库,一贯以来,开采者对
mocking 类库的语法的简洁性有显明的急需,NSubstitute
试图满意那1急需。轻巧明了的语法能够让我们将主导放在测试自身,而不是纠缠在测试代替实例的创制和计划上。NSubstitute
已尝试将最常用的操作要求轻巧化、易用化,并支持部分不常用的或研究性的效益,与此同时还尽量地将其语法向自然语言靠近。关于NSubstitute的更详细新闻请往
NSubstitute完全手册索引

 

NSubstitute 已经昭示二.0 牧马人C版本扶助.NET Core。引进NSubstitute
相关nuget包:

图片 5

咱们把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完全手册索引

图片 6

 

xUnit.net 搭配NSubstitute 实行单元测试

 

  
在3个分层结构清晰的花色里,各层之间正视于事先约定好的接口。在多个人搭档开辟时,大很多人都只会顶住自身的那某些模块作用,开拓进度平日状态下也不均等。当某些开垦人士需求对谐和的模块举办单元测试而借助于的其它模块还不曾开辟形成时,则供给对信赖的接口通过Mock的主意提供模拟成效,从而到达在不实际重视其他模块的求实际效果果的景况下达成自个儿模块的单元测试专业。那时大家平常需求有2个单元测试模拟类库,平素以来,开辟者对
mocking 类库的语法的简洁性有显然的要求,NSubstitute
试图满意那壹急需。轻松明了的语法能够让大家将主旨放在测试自身,而不是纠缠在测试代替实例的成立和配置上。NSubstitute
已尝试将最常用的操作必要轻便化、易用化,并辅助部分不常用的或查究性的机能,与此同时还尽量地将其语法向自然语言靠近。关于NSubstitute的更详细信息请往
NSubstitute完全手册索引

 

NSubstitute 已经发布二.0 HighlanderC版本援助.NET Core。引进NSubstitute
相关nuget包:

图片 7

我们把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
就能够见见结果了,扩张了地点的三个用例,关于NSubstitute的更详细音信请往
NSubstitute完全手册索引

图片 8

 

合龙测试

上边大家只是对逻辑举办了单元测试。对于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 中运维集成测试是充足棒的。

 

通过在2个工程里还要效仿了服务端(TestServer)和客户端(HttpClient)的通讯,从而达到了总体育项目检查评定试WebApi接口的目标,相关的代码放在https://github.com/ardalis/GettingStartedWithFilters/tree/master/IntegrationTests
。小说对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;
        }
    }
}

 

 

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窗口进行单元测试,查看测试结果

图片 9

合并测试

地点大家只是对逻辑进行了单元测试。对于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接口的目的,相关的代码放在https://github.com/ardalis/GettingStartedWithFilters/tree/master/IntegrationTests
。文章对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;
        }
    }
}

 

 

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窗口进行单元测试,查看测试结果

图片 10

相关文章