目录

前言

单元测试

单元测试就是对程序给定输入,判断输出是否满足预期

不是所有的代码都能编写单元测试

EF 单元测试

xUnit和MSTest

Specflow


前言

xUnit和MSTest同属于单元测试框架,而Specflow属于BDD (行为驱动开发)框架。

其实三者的应用都非常简单,但是如果你从没有接触过具体的示例,从零开始可能会一头雾水。

我之前写过一个实验性质的分布式事件总线,用到了以上三种框架,想学习.NET测试技术的同学可以直接到 MaH.EventBus - Repos (azure.com)查看示例。

另外推荐两个做.NET单元测试几乎必用的类库:NSubstitute,Shouldly. 二者可以很方便的帮我们Mock接口或数据,以及做断言等。

单元测试

刷过Leetcode的同学都知道,当我们提交完答案之后,系统会告诉我们是否正确;如果错误的话,会有导致错误的数据示例,其实它的背后就是单元测试在起作用。

单元测试就是:给定输入,判断输出是否满足预期

为特定的算法(无论业务算法或数理算法)编写高覆盖率的单元测试是非常有用的,它可以在开发过程中发现问题,也可以为日后的代码重构提供保证。

人们常常忽视单元测试的作用,其实单元测试的价值也是满足二八定律的,80%的测试用例可能就像是摆设一样,写完之后永远也不需要再维护。而15%的测试用例需要随着业务代码的变更进行修改,大概只有5%的单元测试能够在代码重构时真正的发挥作用。

当然,天下没有空中楼阁,你不可能建一个只有二楼没有一楼的房子,你也不能只写那“5%”的测试用例。VS或者SonarQube都可以为我们提供单元测试覆盖率分析,一般超过80%覆盖率被认为是健康状态。

不是所有的代码都能编写单元测试

单元测试的对象最好是纯函数,比如 int Add(int a, int b) => a + b; 这种结果完全由输入决定的函数。在VS2022中,对于未访问到任何实例变量的函数,VS会提示你将它修改为static,这种函数就属于纯函数,编写单元测试也会非常容易。

但是对于业务项目来讲,非纯函数是无法避免的,例如,任何包含I/O操作的方法都是非纯函数。

常见的I/O操作包含数据库连接,网络请求,以及Task.Delay,DateTime.Now等。我们应尽可能的将非纯方法封装在一个最小范围内。

另外依赖具体实例而非接口的方法也是非纯方法。

单元测试要保证纯洁性,意味着无论什么时候执行结果都必须是一致的,因此我们常常需要Mock一些数据接口等。

假如你的代码中直接使用DateTime.Now来做逻辑判断,那么你必须将当前代码重构,把获取当前时间的方法包装起来,通过接口提供给具体的业务逻辑使用,不然是没办法对其编写单元测试。

EF 单元测试

假如你项目中使用的是EF的话,那么写起单元测试来会非常简单,你可以直接使用Sqlite或者InMemory来创建一个基于内存的数据库,这样就可以很轻松的使用真实的DbContext来编写测试用例了:

        private static DemoDbContext CreateInMenoryDatabase(){var connection = new SqliteConnection("Filename=:memory:");connection.Open();var contextOptions = new DbContextOptionsBuilder<DemoDbContext>().UseSqlite(connection).EnableSensitiveDataLogging().Options;var context = new DemoDbContext(contextOptions);context.Database.EnsureCreated();return context;}

xUnit和MSTest

这两个种项目类型都可以在VS中找到并且直接创建,创建完成之后我们可以在测试资源管理器找到创建好的项目以及测试用例。

假如你在使用VS企业版的话,还可以使用Live Unit Testing的功能, 它会在你编写的时候实时编译并运行单元测试,并且会在代码行的左侧用蓝色或者红色对勾表示当前行是否被覆盖,以及相应的测试用例成功与否。

你还可以生成并导出包含分支,代码行覆盖率等信息的测试分析报告等。

xUnit和MSTest使用上最大的区别在于测试用例方法的特性不同,这里不再赘述,感兴趣的朋友可以到前言中提到的代码仓库查看。

Specflow

Specflow旨在用自然语言编写测试用例,让非技术人员也能看得懂。但其背后仍然需要技术实现,并且与单元测试比起来,往往测试流程与实现也更为复杂。

创建Specflow项目需要先到VS扩展当中安装Specflow插件

先给大家看下Specflow Test的代码样式,推荐大家在创建Specflow Test的时候按照我的项目格式来做,在编写Scenario,Steps时会很方便。

Specflow并非只适用于测试流程,比如我之前博客中提到的基于Camunda BPMN创建的项目,以及包含任何流程的业务场景,任何场景都可以使用它来做测试。

我上面这个Demo仓库对Specflow的使用比较简单,只是做了个LocalEventBus的使用场景,给出了一个Specflow项目应有的结构。

大家可以自己自行学习下其他常用关键词的用法:

Given、When、Then、And、Background、Examples...

以及传参时会用到的占位符:

'(.*)'

还有Table类型的参数以及解析方法的使用:

        [Given(@"Hello '(.*)'")]public void Hello(string name, Table table){var rows = table.CreateSet<T>();}

我这里只做展示,不做具体讲解。

.NET 测试框架 xUnit,MSTest, Specflow 使用经验汇总相关推荐

  1. 收藏清单: python测试框架最全资源汇总

    xUnit frameworks 单元测试框架 frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Pytho ...

  2. python测试框架数据生成工具最全资源汇总

    xUnit frameworks 单元测试框架 frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Pytho ...

  3. 转 python测试框架最全资源汇总

    转自: http://www.testclass.net/list/python_list_1/ xUnit frameworks(单元测试框架) frameworks 框架 unittest - p ...

  4. python制作考试系统_python测试框架数据生成工具最全资源汇总

    xUnit frameworks 单元测试框架 frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Pytho ...

  5. 单元测试及NUnit测试框架简介(二)

    一.单元测试框架的选择 在选择单元测试框架时,可以从以下几个方面去考虑: 支持自动检测注册用例:框架能否支持简单地构造用例并自动注册测试用例到测试框架中: 支持测试Fixture:即是否支持为一组测试 ...

  6. e2e测试框架之Cypress

    谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Fr ...

  7. 下一代CC++测试框架TestNG++入门指导【转】

    原文:http://www.cnblogs.com/sinojelly/archive/2010/05/22/1741646.html   xUnit框架改变了单元测试的历史,一时间,很多语言的多种单 ...

  8. PHP自动测试框架Top 10

    2019独角兽企业重金招聘Python工程师标准>>> 对于很多PHP开发新手来说,测试自己编写的代码是一个非常棘手的问题.如果出现问题,他们将不知道下一步该怎么做.花费很长的时间调 ...

  9. 自动化测试框架 2019_2019年用于自动化的5个最佳Java测试框架

    自动化测试框架 2019 几十年来,Java一直是开发应用程序服务器端层的首选编程语言. 尽管JUnit一直在与开发人员一起帮助他们进行自动化的单元测试,但随着时间的推移和测试的发展,当自动化测试不断 ...

最新文章

  1. 17综合案例之淘宝轮播图布局
  2. Gartner 「RPA市场竞争格局」:中国厂商首次进入国际视野
  3. 在ddms 里面查看data/data里面的东西 不显示data/data
  4. 机房日常技术总结——Windows篇
  5. NSIS:判断并安装.NET Framework的例子(转载)
  6. 人工智能助力生命科学新发展 | 飞桨博士会第十一期
  7. OpenCV calcHist()创建直方图的实例(附完整代码)
  8. 软件测试白皮书-判定表法
  9. 开始→运行→命令 总结大全
  10. javasript 面向对象
  11. C++_004异常处理
  12. Jdk14 都要出了,Jdk9 的新特性还不了解一下?
  13. Win7 maven安装及配置
  14. ios3怎么取消长按弹出菜单_针对数码打印机中叠印怎么处理
  15. 好物分享 Kvaser支持CANFD功能的CAN卡都有哪些?
  16. 思岚科技RPlidar A3激光雷达ROS源码详解
  17. dw cs5 html5,Dreamweaver CS5
  18. IDEA中修改Maven的项目名称
  19. AtCoder Regular Contest 105 C - Camels and Bridge
  20. 1119-期货要见好就收

热门文章

  1. 读书笔记 | 自动驾驶中的雷达信号处理(第2章 雷达方程)
  2. 单变量微积分笔记7——曲线构图
  3. python延时执行函数_python延迟指定时间执行特定任务脚本
  4. 类似用户画像预测的特征工程技巧总结
  5. TimesTen 应用层数据库缓存学习:16. Aging策略与AWT缓存组
  6. 最大元最小元上确界_离散数学中什么是最小上界和最大下界 请举例详细说明 谢谢...
  7. CSV 转 JSON
  8. android 线控操作
  9. 数据结构与算法复习(2)
  10. C语言 实现冒泡排序函数