.NET Core体系 :4 测验

by admin on 2019年11月18日

二〇一六.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卡塔 尔(英语:State of Qatar)为种种测验方法产生一个对象实例
         2)取消了[SetUp]和[TearDown]
         3)取消了[ExpectedException]
         4)类似于Aspect的功能
         5卡塔尔减弱了自定义属性(Attribute卡塔尔的数量
         6卡塔 尔(阿拉伯语:قطر‎选择泛型
         7卡塔尔无名氏委托
         8卡塔尔可扩充的预知
         9卡塔 尔(阿拉伯语:قطر‎可扩大的测量检验方法
         10卡塔 尔(英语:State of Qatar)可增加的测量试验类

        
领悟越来越多关于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的测量试验项目,具体成立进度我们参照作品
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天性标记,每一次设定的值都不可同日来讲,在进行单元测验时,设定的值会被测量试验框架赋值到对应的测量试验方法的参数里。你能够通过为你的等级次序增进分歧的测量试验用例,那样就足以让您的代码取得足够测验。

 

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接口的目标,相关的代码放在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窗口进行单元测量试验,查看测验结果

图片 5

发表评论

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

网站地图xml地图