.net持续集成单元测试篇之单元测试简介以及在visual studio中配置Nunit使用环境

系列目录html

单元测试及测试驱动开发简介

什么是单元测试

单元测试是一段自动化的代码,这段代码调用被测试的工做单元,以后对这个单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写,能快速运行。单元测试可靠、可读、而且可维护。只要产品代码不发生变化,单元测试的结果是稳定的。数据库

特征windows

• 自动化、可重复执行;浏览器

• 很容易实现;网络

• 次日还有意义;架构

• 任何人都应该能一键运行它;框架

• 运行速度应该很快;编辑器

• 结果应该是稳定的;工具

• 能彻底控制被测试的单元;布局

• 彻底隔离(独立于其余测试的运行);

单元测试命名

因为单元测试很是强调可读性,所以咱们要花些功夫在命名上,要使单元测试方法名简单易懂,基本一会儿能看出它的主要功能.若是以为方法名不可以彻底表达出此方法要实现的功能,也能够额外添加注释.推荐的命名方式以下
Should_Return(Throw)_Result(exception)_If(when)But

其中Should表示期待一个结果,Return或者Throw为要测试方法期待的返回结果,If表示出现以上结果须要的条件,But为附加条件.

什么是集成测试

集成测试是对一个工做单元进行的测试,这个测试对被测试的工做单元没有彻底的控制,并使用该单元的一个或多个真实依赖物,例如时间,网络、数据库、线程或随机数产生器等。

单元测试与集成测试的区别

单元测试与集成测试最大的区别在于:集成测试依赖于一个或多个真实的模块,当运行集成测试时,出现失败的状况后你并不能当即判断是哪里出了问题,所以找到缺陷的根源会比较困难。

Avatar

测试驱动开发

传统开发流程

[虚线表明是一个可选的行为]

Avatar

TDD开发流程

Avatar

由上面的两个图中能够看出TDD与传统开发模式的区别:先编写一个会失败的测试,而后建立产品代码,并确保这个测试经过,接下来是重构代码或者建立另外一个会失败的测试。

单元测试框架做用

单元测试框架是帮助开发人员进行单元测试的代码库和模块。

Nunit单元测试框架使用

NUnit 是一套开源的基于.NET平台的类Xunit白盒测试架构,支持全部的.NET平台。这套架构的特色是开源,使用方便,功能齐全。很适合做为.NET语言开发的产品模块的白盒测试框架。
起初是从流行的Java单元测试框架JUnit直接移植过来的,以后NUnit在设计和可用性上作了极大地改进,和JUnit有了很大的区别,给突飞猛进的测试框架生态系统注入了新的活力。
如何在VS安装并运行呢?用Nuget是最方便的一种形式了,以下图:

Avatar
若是各位的visualStudio中安装有Resharper插件,则只须要安装红色部分框选的内容便可,若是没有安装也没有关系,可使用VisualStudio自带的测试工具也是能够的,
如下讲解用的也是VisualStudio自带的测试工具.
须要注意的是若是使用VisualStudio自带的测试工具,还须要安装Nunit.Console

编写第一个单元测试

咱们在刚才新建的项目中添加一个名为FirstUnitTest的项目
咱们要引入using NUnit.Framework;方可以使用Nunit
咱们新建的第一个测试代码以下
Avatar
其中TestFixture注解标识这个类为单元测试类,若是没有此标识,则此类没法在单元测试工具中运行
方法上的Test注解标注此方法为一个单元测试方法,若是没有Test注解,则此方法在单元测试运行的时候将会被忽略掉
类注解和方法注解添加之后,单元测试就能够跑起来了.

运行第一个单元测试

使用VisualStudio自带单元测试工具运行

Avatar
如上图示,点击菜单栏的Test(测试)-Windows(窗口)-Test Explorer(测试浏览器)即可以在VisualStudio中打开测试浏览器,只要咱们保存了项目,就能够在Test Explorer中看到刚才建立的单元测试了(刚建立的单元测试名为FirstUnitTest)
运行单元测试,咱们点击Test Explorer中FirstUnitTest下的测试方法名,出现如下选项
Avatar
咱们点击Run Selected Test(运行选中的单元测试)即可以运行这个单元测试了

Avatar

运行之后即可以在Test Explorer中看到结果了
单元测试图标含义
单元测试结果很容易根据图标看出来其含义,其中圆圈内一个红色X 号表明测试失败,须要处理,圆圈里一个绿色对勾 表明测试成功,菱形内一个蓝底! 号表明测试结果待定(单元测试没有运行的状态是待定)
除了这几个状态外还有一种状态是三角形内一个黄底感叹号 ,表明警示,后面会介绍这个状态.

单元测试状态查看

经过以上状态咱们很清析地看到咱们建立的单元测试失败了,咱们点击这个单元测试,Test Explorer下面部分便会显示关于此次测试的基本信息
Avatar
咱们从错误信息里能够看到错误缘由是期待的结果True,其实是False.若是测试过程当中因为异常致使错误,StackTrace还会显示异常的堆栈信息.

小技巧-快速定位到错误方法:在实际工做中,随意项目的深刻,测试方法会愈来愈多,咱们写完一个测试方法后而后点击测试,这样不会有什么问题,而后实际状况是随着测试方法积累愈来愈多,咱们往后要运行单元测试的时候每每是点击整个单元测试项目运行,这时候若是有错误咱们虽然能够根据方法名定位到出错的测试方法,然而这样很不方便,咱们这时候能够点击错误信息栏里的Source后面的蓝色文字,快速定位到测试出现错误的方法.
Avatar

不少时候咱们只是查看一下这个面板,并不把鼠标移过来点击,更为快捷的定位到错误方法的的方式是咱们选中测试方法后,直接按下快捷键F12,就直接进入到错误方法了

Avatar

上面的面板中展现有错误的信息,若是信息过长时在面板查看很不方便,这时候咱们能够把它复制下来而后在本身喜欢的文本查看器中查看

Avatar

单元测试调试

经过以上状态咱们知道咱们的单元测试失败了,为何会失败很简单3+4*5/2不等于0,可是不少时候有些结果不是这么显而易见的,咱们须要借助单步调试来发现错误,如何对单元测试进行调试呢?
首先咱们像普通调试同样设置一个断点,而后在Test Explorer中右击方法名,出现弹出菜单,此次咱们选择Debug Select Tests(调试选择测试)

Avatar

此时咱们会看到像咱们普通调试同样,断点被击中

Avatar
咱们能够在断点调试模式发现错误所在.
这里还有一点须要指出的是,单元测试的成功失败状态只是针对本次有效,若是关闭VisualStudio全部的状态又会变成待定状态,须要再次运行测试才会有成功,失败等状态.

使用Resharper运行单元测试

Resharper为VisualStudio的一个插件,集成了不少功能,其中包含单元测试运行功能.若是你的VisualStudio里安装的Resharper插件,也可使用Resharper来运行单元测试,使用Resharper来进行测试测试比使用VisualStudio自带的单元测试工具更为方便.
若是安装了Resharper,VisualStudio的主菜单里会出现Resharper菜单,执行如下图示操做即可以打开Resharper Unit Test Explorer

Avatar

窗口和VisualStudio Test Explorer相似

Avatar

操做也和VisualStudio自带的Test Explorer操做相似,点击刚才新建立的FirstUnitTest类,便会出现如下菜单

Avatar

选择第一个Run Unit Test便会运行单元测试,点击Debug Unit Tests则会进入单元测试调试模式,和VisualStudio自带的测试工具操做相似.

Avatar

执行结果状态图标和Visual Studio自带的测试工具状态图标大同小异,很容易区分
一点很大的不一样在于它的单元测试信息显示在右边,这样若是面板的宽度太小而错误信息过长就会出现以下图示状况

Avatar

基本上不可读

Avatar

咱们能够经过如图示设置把它调到下面,这样就和VisualStudio自带的单元测试工具布局基本同样了

Avatar

一样能够点击蓝色或者青色文字快速导航到错误方法里.
一样,因为面板大小限制,若是错误内容信息过丰富查看起来不是很方便,VisualStudio自带的测试工具能够经过Copy All复制到剪切板,然而这个面板并无,没有办法把错误记录复制出来吗,答案是有的.
咱们右击方法名,便会出现下面一个级联菜单

Avatar

这里有导出Text,XML和HTML,导出到xml和html基本上不须要,只须要导出为Text便可,点击Export to Text出现以下对话框

Avatar

若是咱们选择一个路径便会将错误导出,不少时候并不须要这么作,咱们点击Copy to Clipborard把内容复制到剪辑板,即可以把它复制到本身喜欢的文本编辑器里查看了

Resharper测试技巧-状态过滤

当测试愈来愈多的时候,咱们每每对整个测试项目进行运行,而不是像在开发阶段写一个运行一个,有人可能会有疑问,单元测试写的时候测试经过,之后再测会变成不经过状态吗,答案是确定的.若是咱们的单元测试中包含外部依赖(理想状态下不该该包含),每每外部依赖的变化会致使单元测试结果的变化.另外,单元测试编写的不恰当也会引发测试结果的变化.外部依赖的变化每每因为项目自己缘由耦合度过高,一时又没法重构但仍然须要单元测试,这时候也能够勉强为之,然而不恰当的测试代码致使结果的不稳定是须要避免的.(最为常见的是日期中使用DateTime.Now因为Datetime.Now是变化的致使单元测试结果不可预测,这种状况是须要避免的.)
以上穿插的内容只是为了说明特定状况下单元测试的结果是会变的,所以不觉得编写完测试方法后运行一遍成功就万事大吉.

若是测试方法不少,运行完之后出现多处错误,此时想要一个个找出失败的单元测试不是很方便,此时咱们能够借助Resharper Unit Test Explorer中的测试状态过滤功能来过滤出全部的错误测试.

Avatar

如上图,咱们点击上面工具栏里的错误图标,这时候Explorer里列出的所有都是错误测试.
须要注意的是,因为咱们启用的过滤,一旦错误都解决之后,这里便没有错误测试可罗列,这时候这里变成一片空白,咱们须要点击一下最左边全部测试图标把全部测试都显示出来

Avatar

Resharper测试技巧之类内部启用测试

如今的测试还比较少,咱们在Test Explorer中找到刚刚编写好的单元测试方法并非一件很困难的事,可是当Explorer里单元测试方法愈来愈多的时候,想要快速找到刚编写好的方法启动是一件很是繁琐的事,
咱们每每须要把方法名复制下来,而后粘贴到Explorer(这里的Explorer根据语境指的是Resharper Unit Test Explorer或者VisualStudio Test Explorer,并不是windows explorer或者其它)里面,启动后还要删除查找内容,若是不删除则其它的方法都没法展现出来了.Resharper提供了一些很是贴心的简便功能,能够直接在类内部直接启动单元测试,而不须要到Explorer里找到测试方法而后运行.

Avatar

如上图示.当一个方法有了Test注解,Resharper便能感知它,这时候方法的前面出现一个如上图红框框选的阴阳图标
点击图标便会出现如下上下文菜单

Avatar

点击Run即可以运行测试.

Avatar

运行成功这时候阴阳图标右下角会有一个绿色小对勾指示测试成功

若是点击类名前面的双阴阳图标则会整个类的全部测试方法进行操做

Avatar

这时的Run和Debug后面都有一个All字,表示对此类的全部方法运行测试或者调试.