前言

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

单元测试

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

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

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

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

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

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

xUnit

首先,我们新建一个项目April.Test

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来实际操作数据库吧(当然测试库这个也是可行的),所以我们需要模拟接口的实现类及方法。

引入完,我们将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

net core WebApi——使用xUnits来实现单元测试相关推荐

  1. ASP.NET Core WebAPI控制器返回类型的最佳选项

    ASP.NET Core WebAPI控制器返回类型的最佳选项 原文:ASP.NET Core WebAPI控制器返回类型的最佳选项 前言 从.NET Core 2.1版开始,到目前为止,控制器操作可 ...

  2. IIS部署asp.net core webapi

    一.需要安装Windows Server Hosting,作用是让IIS有方向代理功能(Asp.Net Core Module负责反向代理工作),将请求转发到Kestrel,Windows serve ...

  3. core webapi缩略图_.Net Core WebApi上传图片的两种方式

    我这边主要是为了上传图片,话不多说,上代码. 方式一:通过Form表单上传 后端: /// /// 上传图片,通过Form表单提交 /// /// [Route("Upload/FormIm ...

  4. ASP.Net Core WebApi几种版本控制对比

    ASP.Net Core WebApi几种版本控制对比 原文:ASP.Net Core WebApi几种版本控制对比 一.版本控制的好处: (1)有助于及时推出功能, 而不会破坏现有系统. (2)它还 ...

  5. 为什么 ASP.NET Core WebAPI 继承 ControllerBase 而不是 Controller ?

    咨询区 Alex Sanséau: 我是 ASP.NET Core Web API 的初学者,我在跟着文档创建 Controller 时,VS模板引擎给我生成了如下 Controller 模板代码,我 ...

  6. NET问答: 如何将 ASP.NET Core WebAPI 中抛出的异常封装成对象?

    咨询区 rianjs: 在 ASP.NET Core WebAPI 中,我的 Controller 代码如下: [Route("create-license/{licenseKey}&quo ...

  7. 【源码解读】Vue与ASP.NET Core WebAPI的集成

    在前面博文[Vue]Vue 与 ASP.NET Core WebAPI 的集成中,介绍了集成原理:在中间件管道中注册SPA终端中间件,整个注册过程中,终端中间件会调用node,执行npm start命 ...

  8. 【Vue】Vue与ASP.NET Core WebAPI的集成

    SPA单页面应用已经遍地开花,熟知的三大框架,Angular.Vue和React,其中Angular与React均可集成至ASP.NET Core,且提供了相关了中间件.但是Vue没有: " ...

  9. ASP.NET CORE WEBAPI文件下载

    最近要使用ASP.NET CORE WEBAPI用来下载文件,使用的.NET CORE 3.1.考虑如下场景: 文件是程序生成的. 文件应该能兼容各种格式. 浏览器可以感知进行下载. 准备 经过简单的 ...

最新文章

  1. 干货丨人脸识别必读的N篇文章
  2. SQL 交集 差集 并集 笛卡尔积 应用实例
  3. 击败谷歌AI拿下“最强”称号?Facebook AI开源聊天机器人Blender
  4. Xgboost简易入门教程
  5. Android开发中方法数超过65535的简单解决方法
  6. 基于SPI协议的Flash全擦除
  7. java compare时间_java.time.LocalDateTime compareTo()方法
  8. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(5) - 控制转移指令
  9. 2021高通人工智能应用创新大赛--创新赛道-决赛阶段小结
  10. hql删除mysql语句_hibernate hql删除异常
  11. 什么作用计算机辅助工艺,什么是CAPP技术(计算机辅助工艺过程设计)
  12. 亚索全部语音原声mp3_Spring Boot+VUE集成科大讯飞语音在线合成解决方案
  13. Redis系列-Redis笔记(一)
  14. android camera 废弃,在Ubuntu系统基于ROS使用废旧Android手机摄像头搭建监控设备
  15. Ace Admin前端框架笔记二导航栏Navba
  16. Ubuntu神奇地变成了只读文件系统的错误--修复方法
  17. Unity 水波纹Shader
  18. 正负数值的正则表达式
  19. Mac安装brew/yum
  20. 易语言特征码定位工具源码

热门文章

  1. head rush ajax chapter4 DOM
  2. Unity3D学习笔记之六创建更多的Prefab
  3. 个人笔记 Vue.js, Framework7, and Cordova / PhoneGap Template with Babel, Webpack and Hot Reloading...
  4. React Native在Android当中实践(五)——常见问题
  5. Centos 磁盘管理及配额管理
  6. K8S集群Master高可用实践
  7. javascriptjquery 判断滚动到页面底部
  8. Android框架之网络开发框架Volley
  9. 求对一组数据进行排名的算法
  10. C# 线程问题之争用条件