.NET Core系列 :4 测试

作者: 体育官网  发布:2019-09-14

二〇一五.6.27 微软曾经正式通告了.NET Core 1.0 RTM,不过工具链依旧预览版,同样的大方的开源测量试验库也都以最少发表了Alpha测验版接济.NET Core, 那篇小说 The State of .Net Core Testing Today 就将次第开源测量试验库的眼下开展实行了汇总。本文大家的指标是在我们创设我们应用程序的时候能够进行测量检验,如何采纳XUnit结合你可以透过为你的品类增进区别的测验用例NSubstitute举行单元测量试验,同期对全部项目进行合并测量试验。本次大家应用Visual Studio 2014 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;
        }
    }

}

图片 1

上面大家要开创贰个针对DotnetCoreLib的测量试验项目,具体创设进度大家参照小说 ,大家修改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: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包:

图片 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完全手册索引。

图片 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;
        }
    }
}

 

 

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

图片 5

本文由365bet体育官网发布于体育官网,转载请注明出处:.NET Core系列 :4 测试

关键词:

上一篇:数据分析的灵魂与皮囊
下一篇:没有了