单元测试(二)基本使用争议篇

介绍

常用的单元测试是测试方法、API等,下面我们来演示一下Xunit测试框架的简单使用,有些是为了演示而写的单元测试。

最下面有反转,一定要看到最后

操作

创建单元测试项目

本次文章还在原来项目的基础上进行操作,右键解决方案添加单元测试项目

12a0ce74e4f91d8dfa2218bf6091f0ff.png
img

选择框架版本为.Net 5.0

1ecab4c833aede63bf7275fd7ab55ed7.png
img

单元测试项目创建完成。然后引用我们的包

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>.NETCoreApp,Version=v5.0</TargetFramework><IsPackable>false</IsPackable></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.AspNetCore.TestHost" Version="5.0.10" /><PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" /><PackageReference Include="xunit" Version="2.4.1" /><PackageReference Include="xunit.runner.visualstudio" Version="2.4.3"><IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets><PrivateAssets>all</PrivateAssets></PackageReference><PackageReference Include="coverlet.collector" Version="3.0.2" /></ItemGroup><ItemGroup><ProjectReference Include="..\Net5ByDocker\Net5ByDocker.csproj" /></ItemGroup></Project>

TargetFramework:指定测试项目的目标框架

IsPackable:设置是否允许打包单元测试项目

xunit:该xunit包引入了三个子包,其中包括大多数开发人员想要的功能:(xunit.core测试框架本身)、 xunit.assert(包含Assert类的库)和xunit.analyzers(使 Roslyn 分析器能够检测单元测试和 xUnit.net 可扩展性的常见问题)

包xunit.runner.visualstudio和Microsoft.NET.Test.Sdk 是能够在 Visual Studio 中运行测试项目以及使用 dotnet test.

coverlet.collector:该coverlet.collector包允许收集代码覆盖率。如果您不打算收集代码覆盖率,则应删除此包引用。

如果想使用MSTest框架,那么只需要在需要进行测试的方法上面点击右键,创建单元测试

383e1ec73909cf3b0fe80a2b3758d9ac.png
img

点击确定后将会为我们创建一个单元测试的应用程序,关于User控制器的单元测试我们就写在这个里面

b9199f2f4b91786af6468e9b71a62dd9.png
img

这里我们并不使用MSTest进行测试。

创建基类文件BaseTest

public class BaseTest
{protected readonly ITestOutputHelper Output;public BaseTest(ITestOutputHelper output){Output = output;}public string SerializeObject(object obj){JsonSerializerSettings settings = new JsonSerializerSettings{Formatting = Formatting.Indented,ContractResolver = new CamelCasePropertyNamesContractResolver()};return JsonConvert.SerializeObject(obj, settings);}
}/// <summary>
/// 构建webhost
/// </summary>
public class BaseWebHostTest : BaseTest
{protected readonly TestServer Server;public BaseWebHostTest(ITestOutputHelper helper) : base(helper){var service = Host.CreateDefaultBuilder().ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();}).Build().Services;Server = new TestServer(service);}
}/// <summary>
/// 只是测试控制器Api
/// </summary>
public class BaseHostTest : BaseTest
{protected readonly TestServer Server;public BaseHostTest(ITestOutputHelper helper) : base(helper){Server = new TestServer(WebHost.CreateDefaultBuilder().UseEnvironment("Development")//测试使用.UseStartup<Startup>());}
}

测试API

就以演示获取用户信息为例,我们测试调用接口后是否返回状态码为200

编写构造函数并赋值HttpClient

public UserControllerTests(ITestOutputHelper helper) : base(helper)
{Client = Server.CreateClient();//var token = ""; // 可以对HttpClient进行一些自定请求头等操作//Client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
}public HttpClient Client { get; }

测试

[Fact()]
public async Task Get_User_ReturnOk()
{//Arrange  赋值区域//Actvar response = await Client.GetAsync("api/user/getlist");//AssertAssert.Equal(HttpStatusCode.OK, response.StatusCode);Output.WriteLine(await response.Content.ReadAsStringAsync());
}

写单元测试一般有三个步骤:Arrange,Act 和 Assert。

  • Arrange 是准备阶段,这个阶段是准备工作,比如模拟数据、初始化对象等;

  • Act 是行为阶段,这个阶段是用准备好的数据去调用要测试的方法;

  • Assert 是断定阶段,就是把调用目标方法返回的值和预期的值进行比较,如果和预期一致说明测试通过,否则为失败。

点击方法名字右键运行测试或者调试测试

6e657f87ce8e2c9f7e7c164f8ceb707b.png
img

测试方法

比如我们去对IUserService里面的GetListAsync做单元测试,继承自公共类,通过依赖注入获取IUserService服务

public class UserServiceTest : BaseWebHostTest
{private readonly IUserService _userService;public UserServiceTest(ITestOutputHelper helper) : base(helper){_userService = Server.Services.GetRequiredService<IUserService>();}[Fact]public async Task GetUser_ReturnOk(){//Arrange:准备阶段 //Act:行为阶段var response = await _userService.GetListAsync();//Assert:断言阶段Assert.NotNull(response);Output.WriteLine(JsonConvert.SerializeObject(response));}
}

点击方法名字右键运行测试或调试测试

1d9cfdb06e65e8b1ec45995e371b43e8.png
img

单元测试成功

并行运行测试

在Xunit的2.x版本以后支持并行运行测试。这样子相比如之前可以更好利用服务器性能。

新建测试类RunnerTimeTest,

public class RunnerTimeTest
{[Fact]public void Test1(){Thread.Sleep(2000);}[Fact]public void Test2(){Thread.Sleep(3000);}
}

我们猜一下运行该测试类的话需要耗时多少?2s?3s?

9f3066b3ba23725f2c339dc1fe015aaa.png
img

通过这个结果我们可以得出来一个测试类内并不是并行执行的。默认情况下每一个测试类都是一个唯一的测试集合,同一个测试类的测试不会彼此并行运行。那么我们将这两个测试方法分别放入不同的测试类中

public class RunnerTimeTest
{[Fact]public void Test1(){Thread.Sleep(2000);}
}public class RunnerTimeTest2
{[Fact]public void Test2(){Thread.Sleep(3000);}
}

运行查看效果

72ad4e4110c18b52821a5b10e2556e48.png
img

可以得到不同的测试类之间是并行执行的。

批评

这个是我理解的单元测试样子,但是经过同事的严厉批评,我知道了应该使用单一变量原则,控制一处不同,其他变量保持相同,而不是像该文章一样,依赖项不可控。

资料

命令行创建单元测试项目:https://xunit.net/docs/getting-started/netcore/cmdline

ASP.NET Core单元测试:https://www.cnblogs.com/willick/p/aspnetcore-unit-tests-with-xunit.html

并行运行测试:https://xunit.net/docs/running-tests-in-parallel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听说你趁我不在家,欺负我老婆?

1 听说你趁我不在家欺负我老婆了&#xff1f;▼2 当男生们聚在一起时他们都会做什么&#xff1f;▼3 其实我是广西人&#xff0c;每顿要嗦1吨粉▼4 山西人的饮水机里放的都是醋&#xff1f;▼5 可现实中又有几个总裁没有啤酒肚呢&#xff1f;▼6 开学考试&#xff0c;一考…

RHEL5.3下MRTG+SNMP的搭建

一、MRTG的简介 Mrtg(Multi Router Traffic Grapher,MRTG)是一个监控网络链路流量负载的工具软件&#xff0c;它通过snmp协议从设备得到设备的流量信息&#xff0c;并将流量负载以包含PNG格式的图形的HTML文档方式显示给用户&#xff0c;以非常直观的形式显示流量负载(可以在网…

BeetleX.WebFamily之Markdown编辑器

组件的新版集成一款Markdown编辑器ToastUIEditor&#xff0c;通过它可以快速地构建编写Markdown文本内容功能。集成后的ToastUIEditor支持图表&#xff0c;表格&#xff0c;文件管理插入等功能。新建一个控制台项目&#xff0c;通过Nuget引用组件后编写以下代码class Program {…

如何逃离「信息茧房」?

全世界只有3.14 % 的人关注了爆炸吧知识智能算法、内容推荐&#xff0c;当我们滑动屏幕的时候&#xff0c;映入眼帘的总是我们想看的内容。不过&#xff0c;这样的内容选择或许会让我们陷入「信息茧房」&#xff1a;只注意自己选择的、让自己愉悦的资讯&#xff0c;久而久之和蚕…

oracle表存储表空间,Oracle的存储信息-表空间信息记录

经过前面的介绍&#xff0c;我们已经能够对Oracle的存储结构有了深入的了解&#xff0c;总结一下前面的内容&#xff1a;Oracle最小的数据存储单位是数据块(Block)&#xff0c;如果以单个数据块进行对象空间分配&#xff0c;那么显然分配将过于频繁&#xff0c;所以Oracle使用多…

排序算法java实现

1. 插入排序 原理&#xff1a;遍历到第N个元素的时候前面的N-1个元素已经是排序好的了&#xff0c;那么就查找前面的N-1个元素把这第N个元素放在合适的位置&#xff0c;如此下去直到遍历完序列的元素为止。 算法的复杂度也是简单的&#xff0c;排序第一个需要1的复杂度&…

FusionChart完全入门手册 -2

今天主要探讨下&#xff0c;数据文件的生成方式&#xff0c;只做探讨。 其实funsioncharts提供了多种数据展现方式&#xff0c;除了前一节采用的直接的DATAFile的方式外&#xff0c;还有官方提供的标准的c#实现方式。 看个截图 但是总感觉使用官方提供的InfoSoftGlobal不是很灵…

BeetleX.WebFamily之ElasticSearch搜索集成

组件在最新版本中集成了基于ElasticSearch的文档搜索功能&#xff0c;通过这一功能可以快速地构建文档查询的webapi服务和web搜索应用。接下来介绍一下如果使用组件的ElasticSearch组件来进行文档构建和查询。ElasticSearch要求组件支持7.x和6.x两个版本的ElasticSearch服务&am…

直男们给我看清楚!这才是小姐姐的真面目......

1 这才是化妆的真相&#xff01;▼2 听说&#xff0c;这就是当年Tom劈过得那棵树▼3 等一下&#xff01;这题真的有正确答案吗&#xff1f;▼4 这是一只长大成熟的猫咪了▼5 想当年上学的时候转书、转笔都一门灵&#xff0c;就是脑子不会转▼6 猫的四肢和尾巴仿佛都有独立…

模型部署到移动端_谷歌开源 MobileNetV3:新思路 AutoML 改进计算机视觉模型移动端...

雷锋网 AI 开发者按&#xff1a;谷歌从 17 年发布 MobileNets 以来&#xff0c;每隔一年即对该架构进行了调整和优化。现在&#xff0c;开发者们对 MobileNetV3 在一次进行了改进&#xff0c;并将 AutoML 和其他新颖的思想融入到该移动端的深度学习框架中。谷歌发布了相关文章对…

c++中stringstream_文史哲与艺术中的数学_智慧树章节答案

文史哲与艺术中的数学_智慧树章节答案更多相关问题His mother told me that he ______ read quite well at the age of five. A) should B) would C)在三角形ABC中&#xff0c;a&#xff0c;b&#xff0c;c分别是角A&#xff0c;B&#xff0c;C的对边&#xff0c;且满足m(2b&am…

将.net framework 4 部署在docker中的全过程(支持4.0 到 4.8,3.5应该也可以)

前言&#xff1a;docker自从诞生之初&#xff0c;就是运行在linux系统中&#xff0c;后来windows上也可以运行docker了&#xff0c;但是微软是通过自身的hyper-v技术&#xff0c;在你的windows系统中虚拟出来了一个小的linux虚拟主机&#xff0c;在它上面跑了个docker环境让你用…

有图有真相!这世界上,竟有人跟你长得一模一样!

全世界只有3.14 % 的人关注了爆炸吧知识你相信这个世界上有和你长得一模一样的人吗&#xff1f;我本来不信的看到这个摄影师的作品后真&#xff01;香&#xff01;冥冥之中&#xff0c;在平行宇宙在地球的另一端真的有另外一个你和你长得一模一样在生活&#xff0c;在呼吸老牌人…

两条线段的夹角 cesium_《原本》命题1.10 一条线段可以被分成两条相等的线段

命题1.10一条线段可以被分成两条相等的线段设&#xff1a;AB为一条直线。求作&#xff1a;平分为两条相等的线段。作等边三角形ABC(命题1.1)命题1.1已知一条线段可作一个等边三角形。作∠ACB的角平分线CD(命题1.9)命题1.9一个角可以切分成两个相等的角。那么&#xff1a;D 点就…

Minimal API Todo Sample

Minimal API Todo SampleIntro.NET 6 Preview 4 开始引入了 Minimal API 到如今的 RC1&#xff0c;Minimal API 也完善了许多并且修复了很多BUG&#xff0c;之前也写过文章介绍&#xff0c;可以参考:ASP.NET Core 6 Minimal API &#xff0c;不过只是写了一个 Hello World, 最早…

WPF基础到企业应用系列7——深入剖析依赖属性(三)

八. 只读依赖属性 我们以前在对简单属性的封装中&#xff0c;经常会对那些希望暴露给外界只读操作的字段封装成只读属性&#xff0c;同样在WPF中也提供了只读属性的概念&#xff0c;如一些 WPF控件的依赖属性是只读的&#xff0c;它们经常用于报告控件的状态和信息&#xff0c;…

Web的结构组件

位于Web浏览器与Web服务器之间还有一些用于帮助他们进行事物处理的应用程序&#xff0c;如下所示。 代理 代理位于客户端和服务器之间&#xff0c;接受所有客户端的HTTP请求&#xff0c;并将这些请求转发给服务器。 缓存 Web缓存或代理缓存是一种特殊HTTP代理服务器&#xff0c…

从没想过从上帝视角看地球,竟美得如此震撼!

全世界只有3.14 % 的人关注了爆炸吧知识“ 当你从另一个角度俯瞰地球&#xff0c;你就能发现不一样的世界 。。。试想你现在飘起来了飘得越来越高&#xff0c;地球在你眼里慢慢变小现在&#xff0c;你看见的是此生从未见过的景色——《极简宇宙史》当想象力带我走向未知脑海…

双目三维重建_【光电视界】简单介绍双目视觉三维重构

今日光电有人说&#xff0c;20世纪是电的世纪&#xff0c;21世纪是光的世纪&#xff1b;知光解电&#xff0c;再小的个体都可以被赋能。欢迎来到今日光电&#xff01;----与智者为伍 为创新赋能----1、三维重构1.1、三维重构到底是什么&#xff1f;首先要了解立体匹配算法&…

mendelay为什么安装不了_你为什么消防验收过不了?消防管道安装错误图集

来源&#xff1a;水电工论坛如有侵权&#xff0c;请联系删除消防管道安装如果一次没做好&#xff0c;验收不通过的话重新返工将对工程进度造成很大的影响&#xff0c;所以在施工时一定要注意以下的错误一定不能出现。2个沟槽卡箍间管段未设置支架立管角钢支架安装时应平面朝上管…