新的网站建设技术方案,企业门户网站建设情况汇报,徐东网站建设公司,网页设计与制作职位2016.6.27 微软已经正式发布了.NET Core 1.0 RTM#xff0c;但是工具链还是预览版#xff0c;同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The State of .Net Core Testing Today 就将各个开源测试库的目前进展进行了汇总。本文我们的目的是在… 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.netxUnit.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添加一个类库项目叫做DotnetCoreLibLibrary.cs 也替换为 namespace DotnetCoreLib{ public class Calculator { public int Multi(int x, int y) { return x * y; } } } 下面我们要创建一个针对DotnetCoreLib的测试项目具体创建过程我们参照文章 https://github.com/dotnet/core-docs/tree/master/samples/core/getting-started/unit-testing-using-dotnet-test 我们修改DotnetCoreLibTest 项目的project.json 增加XUnit相关的nuget包引用并修改部分配置。 还有我们设置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模式 Arrange为测试准备Act运行SUT(实际测试的代码)Assert校验结果 下面我们运行dotnet test 就可以看到结果了。 C:\Users\geffz\Documents\Visual Studio 2015\Projects\TestDemo\DotnetCoreLibTestdotnet testProject DotnetCoreLib (.NETCoreApp,Versionv1.0) was previously compiled. Skipping compilation.Project DotnetCoreLibTest (.NETCoreApp,Versionv1.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.206sSUMMARY: 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包 我们把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.ForICalculator(); calculator.Multi(1, 2).Returns(2); int actual calculator.Multi(1, 2); Assert.Equal(2, actual); } 下面我们运行dotnet test 就可以看到结果了增加了上面的2个用例关于NSubstitute的更详细信息请往 NSubstitute完全手册索引。 集成测试 上面我们只是对逻辑进行了单元测试。对于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()) .UseStartupStartup() .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.DeserializeObjectIEnumerableAuthor(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窗口执行单元测试查看测试结果 相关文章 .NET Core系列 1、.NET Core 环境搭建和命令行CLI入门.NET Core系列 2 、project.json 这葫芦里卖的什么药.NET Core系列 3 、使用多个项目 原文地址http://www.cnblogs.com/shanyou/p/5770840.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注 赞赏 人赞赏