亚洲必赢手机入口.NET Core系列 :4 测试。.NET Core系列 :4 测试。

by admin on 2018年10月5日

2016.6.27 微软现已正式披露了.NET Core 1.0
RTM,但是工具链还是预览版,同样的恢宏底开源测试库也都是至少发布了Alpha测试版支持.NET
Core, 这篇稿子 The State of .Net Core Testing
Today
就用逐一开源测试库的目前开展进行了集中。本文我们的目的是以咱们构建我们应用程序的时候能够进行测试,如何用XUnit结合您得经过也您的品类增长不同的测试用例NSubstitute进行单元测试,同时对所有项目展开合并测试。这次我们下Visual
Studio 2015 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)可扩大的测试类

2016.6.27 微软一度正式披露了.NET Core 1.0
RTM,但是工具链还是预览版,同样的大度底开源测试库也都是最少发布了Alpha测试版支持.NET
Core, 这首文章 The State of .Net Core Testing
Today
就用逐条开源测试库的眼前展开进行了集中。本文我们的目的是当咱们构建我们应用程序的下能够进行测试,如何采取XUnit结合而可以经过也汝的类增长不同的测试用例NSubstitute进行单元测试,同时对全项目进展合并测试。这次我们采用Visual
Studio 2015 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可以参见这里(点击打开链接[舍弃Nunit拥抱Xunit])。

 

 

运xUnit.net 单元测试

用xUnit.net 单元测试

 

 

 

 

率先我们好像于.NET Core系列 :3
、使用多独档次
创建一个解决方案testdemo,添加一个类库项目名为DotnetCoreLib,Library.cs
也交替为:

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

}

亚洲必赢手机入口 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节点为 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()
        {
            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:\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.

 

点的出口我们知晓就实行了4单测试,都通过了,[Face]特点标识表示固定输入的测试用例,而[Theory]特色标识表示可以指定多单输入的测试用例,结合InlineData特性标识应用。在点的例证里,总共用了三不良InlineData特性标识,每次设定的价都不比,在实行单元测试时,设定的值会被测试框架赋值到对应之测试方法的参数里。你得由此为公的类别增长不同之测试用例,这样尽管足以让你的代码得到充分测试。

 

 

 

第一我们好像于.NET Core系列 :3
、使用多单种类
创建一个缓解方案testdemo,添加一个类库项目名为DotnetCoreLib,Library.cs
也交替为:

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

}

亚洲必赢手机入口 3

脚我们要开创一个针对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节点为 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()
        {
            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:\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.

 

面的出口我们明白都实施了4独测试,都由此了,[Face]特色标识表示固定输入的测试用例,而[Theory]特征标识表示足指定多单输入的测试用例,结合InlineData特性标识应用。在面的例子里,总共用了三赖InlineData特性标识,每次设定的价都不可同日而语,在履单元测试时,设定的值会被测试框架赋值到相应的测试方法的参数里。你可由此也公的档次增长不同的测试用例,这样就算足以叫您的代码得到充分测试。

 

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

 

  
以一个岔结构清晰的档次里,各层之间因让事先约定好的接口。在差不多口搭档开发时,大多数丁犹止见面承受好之那片模块功能,开发进度通常情况下为不等同。当有开发人员需要对协调的模块进行单元测试而借助之其它模块还没有开好时,则需要针对因之接口通过Mock的法供模拟功能,从而达到在不实际依赖其他模块的有血有肉成效的动静下好好模块的单元测试工作。这时我们日常要出一个单元测试模拟类库,一直以来,开发者对
mocking 类库的语法的简洁性有明显的需要,NSubstitute
试图满足当下同样需求。简单明了的语法可以为咱们拿重心在测试自己,而未是绕于测试替代实例的创办和配备高达。NSubstitute
已尝试以无限常用的操作需求简单化、易用化,并支持有请勿常用的还是探索性的效力,与此同时还尽量地用那语法向自然语言靠近。关于NSubstitute的重复详细信息请往
NSubstitute完全手册索引。

 

NSubstitute 已经颁布2.0 RC版本支持.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 进行单元测试

 

  
在一个旁结构清晰的类型里,各层中因让事先约定好之接口。在多丁合作开发时,大多数总人口且只会承担协调的那么部分模块功能,开发进度通常状态下也无一样。当某个开发人员需要针对友好之模块进行单元测试而借助于的其余模块还未曾支付到位时,则需对依赖的接口通过Mock的道供模拟功能,从而达成以非实际依赖其他模块的切实职能的景下完了自己模块的单元测试工作。这时我们通常用发一个单元测试模拟类库,一直以来,开发者对
mocking 类库的语法的简洁性有显著的要求,NSubstitute
试图满足当下同一要求。简单明了的语法可以让我们将主导在测试自己,而休是绕于测试替代实例的创造与部署达到。NSubstitute
已尝试以最为常用之操作需求简单化、易用化,并支持部分勿常用的要么探索性的功用,与此同时还尽量地拿其语法向自然语言靠近。关于NSubstitute的还详细信息请往
NSubstitute完全手册索引。

 

NSubstitute 已经发布2.0 RC版本支持.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
就可以看到结果了,增加了地方的2个用例,关于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 中运行并测试是甚高的。

 

透过在一个工里还要效仿了服务端(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

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图