net core WebApi——使用xUnits来实现单元测试

前言

从开始敲代码到现在,不停地都是在喊着记得做测试,记得自测,测试人员打回来扣你money之类的,刚开始因为心疼钱(当然还是为了代码质量),就老老实实自己写完自己跑一遍,没有流程没有规划没有测试文档,就是自己整理一组数据跑一遍,最后依然还是让测试人员老老实实把一大堆测试问题扔给你。

单元测试

首先,还是来聊聊为啥要搞测试吧。

  1. 测试有助于代码整体健壮性,覆盖测试、压力测试都是为了全方位多角度更快更好为用户服务。

  2. 测试有助于提高程序猿的积极性以及引起自身的重视,毕竟一个坑栽一遍就够了,两次也能容忍,再三再四再五怕是要被搞,同时这也是自我提高的一种手段吧。

  3. 软件开发流程收尾的工作就是测试,绕不过,毕竟验收才是最终目标,达到效果才能获得应有的。

好了,聊完这些,当然我也不是专业测试人员,肯定不会给个测试文档模板,喏,照着这个规范起来,我主要是要鼓捣下我之前一直想试试的单元测试,这个自动化测试的手段之一,一直想试试但是一直都放着。

MSTestNUnitxUint这三个中让我稍微犹豫了下,不过三七二十八管他呢,随便来个吧,就选了xUnit,当然MSTest是官方的,支持度应该高点儿,但是这不是我们该犹豫抉择的地方。

xUnit

首先,我们新建一个项目April.Test640?wx_fmt=png

Fact

新建之后,我们看到有个默认的 [Fact]

这个就是测试的标准格式了,如果我们不需要测试数据的话,就是在这个标签下的方法做断言,简单举个例子吧。

        [Fact]public void TestEqual(){int a = 10, b = 20;Assert.Equal(30, Add(a, b));}private int Add(int a, int b){return a + b;}

敲下Assert之后,发现断言好多方法,这里也就不一一说明了,感觉方法名起的都挺明白的,这里就不过多描述了,代码中也有些测试示例,地址在文末给出。

Theory

我们在上面的代码可以看到,所有的数据都是自己定好的,如果我想自己做参数传入测试怎么搞呢,这时候就要用到 [Theory] 这个标签以及 [InlineData] 了,标签是为了更好的区分方法的类型(个人理解),来看下这种参数传递的测试怎么搞吧。

        [Theory][InlineData(new object[] { 1, 2, 3, 4 },1)][InlineData(new object[] { "t", "e", "s", "t" }, "t")]public void TestContains(object[] objs,object obj){Assert.Contains(obj, objs);}

当然我们也可以使用自定义数组来做测试数据源,这里我起初以为可以传任意类型参数,但是MemberData只支持object[]。

        [Theory][MemberData(nameof(tempDatas))]public void TestData(int a, int b){int result = a + b;Assert.True(result == Add(a, b));}public static IEnumerable<object[]> tempDatas{get{yield return new object[] { 1, 2 };yield return new object[] { 5, 7 };yield return new object[] { 12, 12 };}}

控制器

在之前鼓捣单元测试的时候,我一直想一个问题,如果只是这种操作的话,那测试有何意义,但是后来发现,原来单元测试比我以为能做的多得多,所以,学习是个不停的行程,走的多了,风景也就多了。

这里可以引入一个流程,在我们测试自己的工程的时候,我们需要三步来做完单个的测试。

  • Arrange(准备工作)

  • Act(实现方法)

  • Assert(断言结果)

在测试之前,我们需要在当前工程引入一个Moq,至于为什么用这个呢,就跟vue一样我们需要模拟(虽说mock跟Moq还不是那么类似),总不可能我们单元测试引入了orm来实际操作数据库吧(当然测试库这个也是可行的),所以我们需要模拟接口的实现类及方法。

640?wx_fmt=png

引入完,我们将April.WebApi引入到当前工程,之后我们创建一个Values的接口测试类ValuesControllerTest,然后测试方法如下:

        [Fact]public void TestGet(){var mockRepo = new Mock<IStudentService>();var controller = new ValuesController(mockRepo.Object);var result = controller.Get();Assert.Equal(new string[] { "value1", "" }, result.Value);}

这里注意下,对应接口的方法我是都注释的,最终只有返回了字符串数组,因为对应接口中的方法都需要初始化,那么我们来测试下获取数据的接口,看下这个Moq的用法吧,首先我们需要初始化Mock来实现对应接口,然后我们通过实现对应方法来模拟获取数据。

        [Theory][InlineData(1)]public void TestGetByID(int id){var mockRepo = new Mock<IStudentService>();mockRepo.Setup(repo => repo.GetList(s => s.ID == 38).ToList()).Returns(GetList());var controller = new ValuesController(mockRepo.Object);var result = controller.Get(id);Assert.NotNull(result);Assert.Contains("大洛阳", result.Value);}private List<StudentEntity> GetList(){List<StudentEntity> entities = new List<StudentEntity>();entities.Add(new StudentEntity(){ID = 1,Name = "小明",Number = "123456",Age = 19,Sex = 1,Address = "大洛阳"});entities.Add(new StudentEntity(){ID = 2,Name = "小红",Number = "456789",Age = 18,Sex = 0,Address = "大洛阳"});return entities;}

写到这我发现,我在引入WebApi的时候,好像已经把几个工程都已经引入进来,这个不知道合适不合适。

小结

写到这里,基本上单元测试这块儿也简单了走了一遍,至于具体在业务中如何实现,还是想着需要结合个小项目来实践下,东西走通个demo只能说明可行,走通不同体量的工程才能说明可用,包括后续的集成测试,压力测试,自动化测试也会一点点儿的开始鼓捣,路漫漫啊。

附录

代码地址:April.WebApi

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

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

相关文章

python利用opencv标注bounding box

http://blog.csdn.net/xieqiaokang/article/details/60780608 1. 函数 用 OpenCV 标注 bounding box 主要用到下面两个工具——cv2.rectangle() 和 cv2.putText()。用法如下&#xff1a; # cv2.rectangle() # 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细 cv2…

微软发布 SQL Server 2019 新版本

2019 年 11 月 4 日&#xff0c;微软在美国奥兰多举办的 Ignite 大会上发布了关系型数据库 SQL Server 的新版本。与之前版本相比&#xff0c;新版本的 SQL Server 2019 具备以下重要功能&#xff1a;在 Linux 和容器中运行的能力&#xff0c;连接大数据存储系统的 PolyBase 技…

AdminLTE 3.0发布了

点击蓝字关注我们前言在11月2日&#xff0c;作者正式发布了AdminLTE 3.0版本。该版本基于Bootstrap 4.x。使用Bootstrap 4.x的小伙伴可以愉快的使用AdminLTE。GithubAdminLTE是一个完全响应的管理模板。基于Bootstrap 4框架。高度可定制且易于使用。适合从小型移动设备到大型台…

这位优秀的.NET开发者是怎样炼成的?

本文来自DotNET技术圈作者&#xff1a;邹溪源一&#xff0c;社区的小圈子今年3月的一次技术交流活动上&#xff0c;那是我们.NET技术社区第一次组织线下活动&#xff0c;由于没什么经验&#xff0c;所以活动组织得比较仓促&#xff0c;内容也比较一般&#xff0c;效果还是有点欠…

求知无限,刷新.NET 中国社区

2019 Microsoft Ignite The Tour 2020年1月13日至14日深圳会展中心举办&#xff0c;今年的大会是免费的哦&#xff0c;所以也很火爆&#xff0c;我们为您开通专属报名渠道&#xff0c;,扫下方二位码 请在注册时务必填写RSVPCode: MITTCE。大会全面解锁微软黑科技&#xff1a;&g…

使用ASP.NET Core 3.x 构建 RESTful API - 1. 开始

以前写过ASP.NET Core 2.x的REST API文章&#xff0c;今年再更新一下到3.0版本。预备知识&#xff1a;ASP.NET Core 和 C# 工具&#xff1a;Visual Studio 2019最新版&#xff08;VSCode、VS for Mac&#xff0c;Rider等也凑合&#xff09;&#xff0c;POSTMAN Web API Web API…

.NET Core 3.1 编写混合 C++ 程序

前言随着 .NET Core 3.1 的第二个预览版本发布&#xff0c;微软正式将 C/CLI 移植到 .NET Core 上&#xff0c;从此可以使用 C 编写 .NET Core 的程序了。由于目前仅有 MSVC 支持编译此类混合代码&#xff0c;并且由于涉及到非托管代码&#xff0c;因此 C/CLI 目前不能跨平台&a…

在ASP.NET Core中编写合格的中间件

这篇文章探讨了让不同的请求去使用不同的中间件&#xff0c;那么我们应该如何配置ASP.NET Core中间件&#xff1f;其实中间件只是在ASP.NET Core中处理Web请求的管道。所有ASP.NET Core应用程序至少需要一个中间件来响应请求&#xff0c;并且您的应用程序实际上只是中间件的集合…

全网首发 PowerBI 秒级实时大屏通用解决方案

双十一来了&#xff0c;你准备好了吗&#xff1f;不管你是否准备完毕&#xff0c;我们带来了全网首发的 PowerBI 秒级实时大屏展示方案&#xff0c;你可以直接用来展示双十一的实时状况。我们一步步来说明这个套件模板教程。真实效果功能如下&#xff1a;全实时展示 双十一 当天…

普大喜奔 | Azure 免费送网站SSL证书啦!

点击上方蓝字关注“汪宇杰博客”导语就在今晨&#xff0c;微软推出了 App Service Managed Certificates 预览版。简单来说&#xff0c;这就是在 Azure App Service 服务的一项更新&#xff0c;免费送你SSL证书&#xff01;只要点几下鼠标就能给网站加上SSL证书&#xff01;并且…

VS Code 1.40 发布!可自行搭建 Web 版 VS Code!

今天&#xff08;北京时间 2019 年 11 月 8 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.40 版本。让我们来看看有哪些主要的更新。自建 Web 版 VS Code 如果你已经下载了 VS Code 在 GitHub 上的源代码&#xff0c;只需运行 yarn web&#xff0c;就能在 http:…

超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本

超简单让.NET Core开发者快速拥有CI/CD的能力-Docker版本前言上一篇自动化测试&#xff0c;全面且详细的介绍了从零开始到发布版本的步骤&#xff0c;这是传统的方式&#xff0c;本次为大家带来的是如何在5分钟内使用上docker进行CI/CD&#xff0c;毕竟现在的容器化如火如荼&am…

.NET Core 又一杀器! Web Blazor框架横空出世!

多年来&#xff0c;Javascript&#xff08;及其子框架&#xff09;已在浏览器中运行DOM&#xff08;文档对象模型&#xff09;&#xff0c;并且掌握了脚本知识才能真正操作客户端UI。大约2年前&#xff0c;所有这些都随着Web Assembly的引入而发生了变化-Web Assembly允许在客户…

.NET Conf 2019 今天在上海开幕,图片直播地址

.NET Conf 2019 在上海开幕&#xff0c;全程提供图片直播&#xff1a;https://vzan.com/live/tvchat-1099246581下午的分会场内容如下&#xff1a;上午有个直播 &#xff0c;请阅读原文访问https://vzan.com/live/tvchat-1099246581 。

Asp.Net Core 单元测试正确姿势

背景ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式&#xff0c;并且默认注入了很多服务&#xff0c;具体可以参考 官方文档, 相信只要使用过依赖注入框架的同学&#xff0c;都会对此有不同深入的理解&#xff0c;在此无需赘言。然而&#xff0c;在引入 IOC 框架之后&#x…

程序员与「中台」的爱恨交错

大家好&#xff0c;我是Z哥。这篇文章比较长&#xff0c;有5200字&#xff0c;不过希望你能耐心看完&#xff0c;特别是程序员。中台这个词&#xff0c;最近两年特别火&#xff0c;它的爆发源于2015年张勇在阿里发出的内部信中提到的“大中台&#xff0c;小前台”战略。随后吸引…

ML.NET 1.4 发布,跨平台机器学习框架

ML.NET 是一个面向 .NET 开发人员的开源和跨平台机器学习框架&#xff0c;它包括 Model Builder 和 CLI(命令行接口)&#xff0c;让使用自动机器学习(AutoML)构建自定义机器学习模型变得更容易。1.4 版本已经发布了&#xff0c;以下是本次更新的一些亮点&#xff1a;基于 GPU 支…

使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API

1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作什么是REST REST一词最早是在2000年&#xff0c;由Roy Fielding在他的博士论文《Architectural Styles and the Design of Network-based Software Architecture》中提出的。他在本文中创造了REST这个术语。这篇论文的地…

Visual Studio Online 的 FAQ:iPad 支持、自托管环境、Azure 账号等

iPad 支持 目前&#xff0c;Web 版 VS Code 只支持基于 Chromium 的浏览器&#xff0c;还不支持 iPad 上的浏览器。但对于 Safari 的支持&#xff0c;是 Visual Studio Online 团队的一件高优先级的任务。更多详情&#xff0c;可以关注&#xff1a; https://github.com/Microso…

2019 .NET China Conf之我逛魔都

趁着参加首届.NET开发者峰会之际&#xff0c;我也是第一次到上海&#xff0c;因此也趁机逛了一下大魔都&#xff0c;和你分享一波我在魔都拍的照片组。酒店所在地&#xff1a;邮电新村地铁站附近为何选择这里&#xff1f;因为离会场酒店6个地铁站&#xff0c;离南京东路和外滩半…