/VB.NET等展开单元测试,/VB.NET等举办单元测试

二零一四.6.27 微软早已正式发表了.NET Core 1.0
奥迪Q5TM,但是工具链依然预览版,同样的汪洋的开源测试库也都以起码揭橥了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)可扩展的测试类

二〇一五.6.27 微软一度正式发布了.NET Core 1.0
GL450TM,不过工具链依然预览版,同样的雅量的开源测试库也都以至少公布了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可以参照那里(点击打开链接[舍弃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;
        }
    }

}

伟德国际1946 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包引用,并修改部分安排。

 

伟德国际1946 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]质量表示为3个措施的单个测试,[Theory]品质表示执行同一的代码,但是有不一致的输入的参数的测试套件。[InlineData]
属性可用以指定为那几个输入值。通过特色[Fact]
和[Theory],xUnit就掌握了那是个测试方法,然后运营这么些措施。在3个测试方法中,大家一般坚守包涵三步骤的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连串 :三,使用五个门类
创造二个消除方案testdemo,添加三个类库项目名为DotnetCoreLib,Library.cs
也交替为:

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

}

伟德国际1946 3

上面我们要创制贰个针对DotnetCoreLib的测试项目,具体创立进度大家参照文章
https://github.com/dotnet/core-docs/tree/master/samples/core/getting-started/unit-testing-using-dotnet-test
,大家修改DotnetCoreLibTest 项目标project.json
,增添XUnit相关的nuget包引用,并修改部分安插。

 

伟德国际1946 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()
伟德国际1946,        {
            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天性标识,每一遍设定的值都不一致,在执行单元测试时,设定的值会被测试框架赋值到相应的测试方法的参数里。你可以经过为您的项目增进不相同的测试用例,那样就可以让你的代码得到充足测试。

 

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

 

  
在3个分层结构清晰的品类里,各层之间倚重于事先约定好的接口。在几人合营开发时,一大半人都只会顶住本人的这部分模块功用,开发进程日常意况下也不雷同。当有些开发人士需求对友好的模块举行单元测试而借助的其他模块还不曾支付形成时,则须要对借助的接口通过Mock的点子提供模拟功用,从而达到在不实际倚重其余模块的切实成效的情状下做到本人模块的单元测试工作。这时大家常常需要有壹个单元测试模拟类库,一贯以来,开发者对
mocking 类库的语法的简洁性有由此可见的需要,NSubstitute
试图满意这一要求。不难明了的语法能够让大家将主导放在测试自身,而不是纠缠在测试替代实例的成立和陈设上。NSubstitute
已尝试将最常用的操作须求不难化、易用化,并资助部分不常用的或探索性的功能,与此同时还尽量地将其语法向自然语言靠近。关于NSubstitute的更详细音讯请往
NSubstitute完全手册索引

 

NSubstitute 已经公布2.0 RubiconC版本辅助.NET Core。引入NSubstitute
相关nuget包:

伟德国际1946 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
就可以见到结果了,增加了地点的一个用例,关于NSubstitute的更详细音讯请往
NSubstitute完全手册索引

伟德国际1946 6

 

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

 

  
在一个分段结构清晰的花色里,各层之间看重于事先约定好的接口。在五人搭档开发时,半数以上人都只会负责协调的那部分模块效率,开发进度常常状态下也不同。当某些开发人员要求对协调的模块进行单元测试而借助的其余模块还并未开发成功时,则须要对依赖的接口通过Mock的章程提供模拟成效,从而完结在不实际器重其余模块的切切实实效果的事态下成功本身模块的单元测试工作。那时大家见惯不惊需求有三个单元测试模拟类库,一贯以来,开发者对
mocking 类库的语法的简洁性有明显的急需,NSubstitute
试图满意这一需求。不难明了的语法可以让大家将重心放在测试本身,而不是纠缠在测试替代实例的创办和配备上。NSubstitute
已尝试将最常用的操作需要简单化、易用化,并援助部分不常用的或探索性的功用,与此同时还尽量地将其语法向自然语言靠近。关于NSubstitute的更详细音信请往
NSubstitute完全手册索引

 

NSubstitute 已经发布2.0 EvoqueC版本援救.NET Core。引入NSubstitute
相关nuget包:

伟德国际1946 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
就可以看到结果了,扩展了上面的3个用例,关于NSubstitute的更详细音信请往
NSubstitute完全手册索引

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

伟德国际1946 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 中运作集成测试是那一个棒的。

 

通过在3个工程里还要效仿了服务端(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窗口进行单元测试,查看测试结果

伟德国际1946 10

相关文章