单元测试(Unit Testing)是针对最小的可测试软件元素(单元)的,它所测试的内容包括单元的内部结构(如逻辑和数据流)以及单元的功能和可观测的行为。通俗一点讲,就是咱们编程的时候,编写的一个测试方法用于检测功能是否正确的代码段,一般而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。visual-studio
好比咱们在编写代码的时候,写一个功能的实现代码,而后再编写一个Test方法用于测试这个功能的代码正确性,其实这个Test方法就是单元测试,又如在制造飞机的时候,一般会先生产飞机的零部件,而后再把这些成千上万的零部件进行组装,可是在组装以前,一般会对每一个飞机零部件进行测试,经过了才能称为真正的飞机零部件,这个零部件测试其实就是“单元测试”。换个角度思考,若是再飞机组装后再进行测试,你会发现这是多么的愚蠢,这也说明了“单元测试”的重要性。 单元测试
通常认为,在结构化程序时代,单元测试所说的单元是指函数,在当今的面向对象时代,单元测试所说的单元是指类。以类做为测试单位,复杂度高,可操做性较差,所以仍然主张以函数做为单元测试的测试单位,但能够用一个测试类来组织某个类的全部测试函数。单元测试不该过度强调面向对象,由于局部代码依然是结构化的。单元测试的工做量较大,简单实用高效才是硬道理。测试
有一种见解是,只测试类的接口(公有函数),不测试其余函数,从面向对象角度来看,确实有其道理,可是,测试的目的是找错并最终排错,所以,只要是包含错误的可能性较大的函数都要测试,跟函数是否私有没有关系。
注:上面部分概念来源百度百科。
为何使用使用单元测试?简单来讲,缘由就像孕妇作“胎前检查”同样。咱们在开发项目的过程当中,作某一模块的功能,代码写完了,而后生成一下就丢给测试人员去测试,最后测试人员就提出一大堆的Bug,虽然代码的语义上没有问题,可是并不表明代码实现功能没问题,这时候就须要作“单元测试”了,在提交给测试人员以前确保“代码功能”实现没有问题,固然需求错误就是另外一方面的问题了,这是“单元测试”所测试不了的。
关于“单元测试”,不少程序员不多主动的去作,至少我是这样,为何?
上面几条通常是咱们抵制“单元测试”的几个主要缘由,说白了,就是咱们太自信、太懒了,关于“单元测试”的好处就很少说了,就像上面的例子同样,若是你不作“胎前检查”,等到你的孩子生下来身体有所“缺陷”,你后悔也来不及,这也就是使用“单元测试”的缘由。
NUint是咱们作“单元测试”经常使用框架之一,官网地址:http://www.nunit.org/,官网上也提供相关文档,能够下载参考下:NUnit-2.6.3-docs.zip,NUint在项目中的安装使用主要有三种方式:
关于NUint的使用,先贴一段最简单的“单元测试”的代码:
1 [TestFixture] 2 public class Test1 3 { 4 [Test] 5 public void TestMethod() 6 { 7 Assert.AreEqual("1", "2"); 8 } 9 }
能够看到在测试类和测试方法前有TestFixture和Test属性,TestFixture表示须要测试的类,也就是说测试的单元,Test表示测试用例,也就是测试方法,NUint中的TestFixture和Test属性是咱们最经常使用的属性,固然除了他们俩以外NUint还提供了其余的一些属性,用来标注测试。
NUnit 属性 | 属性说明 |
TestFixture | 标识测试类 |
Test | 标识测试用例(TestCase) |
TestFixtureSetup | 标识测试类初始化函数 |
TestFixtureTearDown | 标识测试类资源释放函数 |
Setup | 标识测试用例初始化函数 |
TearDown | 标识测试用例资源释放函数 |
N/A | 标识测试用例说明 |
Ignore | 标识忽略该测试用例 |
ExpectedException | 标识该用例所指望抛出的异常 |
Explicit | 标识测试用例是否须要显式执行 |
Category | 标识测试用例的分类 |
关于NUint的属性详细使用能够去官网的说明文档中查看,除了TestFixture和Test属性经常使用外,还有几个用于测试用例初始化的属性:
TestFixtureSetup对应TestFixtureTearDown,Setup对应TearDown,Setup在AutoMapper源码使用以下,用于AutoMapper的初始化:
1 [SetUp] 2 public void SetUp() 3 { 4 Mapper.Reset(); 5 }
从咱们一开始贴的简单测试示例中能够看出,除了TestFixture和Test属性,还有就是这段代码:Assert.AreEqual("1", "2");,这就是NUint的另外一个概念-断言,什么是断言?”断“是判断的意义,”言“能够看作是测试用例的描述,也就是说用于测试用例的判断,如上段代码就是判断”1“和”2“是否相等,NUint经常使用断言:
断言 | 说明 | 示例 |
Assert.AreEqual(object expected, object actual[, string message]) | 验证两个对象是否相等 | Assert.AreEqual(2, 1+1) |
Assert.AreSame(object expected, object actual[, string message]) | 验证两个引用是否指向赞成对象 | object expected = new object(); object actual = expected; Assert.AreSame(expected, actual) |
Assert.IsFalse(bool) | 验证bool值是否为false | Assert.IsFalse(false) |
Assert.IsTrue(bool) | 验证bool值是否为true | Assert.IsTrue(true) |
Assert.IsNotNull(object) | 验证对象是否不为null | Assert.IsNotNull(new object()) |
Assert.IsNull(object) | 验证对象是否为null | Assert.IsNull(null); |
若是NUint安装好了,测试用例也编写好了,下面咱们就要使用NUint进行”单元测试“了,若是选用的是NUint安装程序,咱们能够直接在桌面打开”nunit.exe“程序,先生成一下咱们编写的测试用例,能够是类库项目也能够是应用程序,而后在打开的NUint程序中选择:”File“-”Open Project“,选择生成的dll或是exe,打开后点击”Run“就开始测试了:
从测试结果看出,咱们编写的测试用例是不经过的,由于”1!=2“,在测试结果中会有错误提示,好比:Expected: "1",But was: "2",咱们修改下测试用例:Assert.AreEqual("1", "1");,而后再生成下,看下测试结果:
从测试结果看出,咱们编写的测试用例是测试经过的,由于”1=1“,这边注意一下,若是咱们指定了测试dll或是exe,在生成后,不须要从新打开项目,直接能够点击”Run“进行测试,由于咱们在编写代码的时候就进行”单元测试“了,这种常规的测试队程序员来讲很不方便,咱们但愿能够再VS中集成NUint,这样就能够在编写代码的过程当中很方便的进行”单元测试“了,怎么配置?请接着往下看。
”扩展工具条“这种方式只是在VS中能够方便打开NUint程序,其实并无方便多少,可是仍是比上面常规方式奥方便些。
在VS中按下面方式配置:工具-外部工具,打开后添加以下命令:
命令:NUint的安装路径,参数:$(TargetName)表示目标文件路径,$(TargetExt)表示目标文件扩展名,初始目录:$(ProjectDir)表示当前程序的物理路径,后面加”\bin\Debug“,也就是表示当前项目的生成路径。点击肯定后,在工具条中会发现多了”NUint“工具:
这边须要注意的是,在点击”NUint“这个工具以前,须要在代码窗体中打开须要测试的项目,好比当前代码窗体是”Class.cs“,那么打开”NUint“工具条,自动打开的就是”Class.cs“所在的项目。
Visual Nunit 2010是NUint在VS的扩展插件,注意此插件只适用VS2010,下载地址:http://visualstudiogallery.msdn.microsoft.com/c8164c71-0836-4471-80ce-633383031099,安装后须要重启VS,打开:视图-其余窗口-Visual Nunit,或者按”Ctrl+F7“快捷键打开:
打开Visual Nunit后,会有几个选项:Project、Mamespace和Fixture,分别表示测试项目、测试项目命名空间和测试用例,仍是上面的示例,适用Visual Nunit插件测试结果:
经过上面Visual Nunit的使用,你会发现其插件仍是蛮好用的,但遗憾的是只支持VS2010,找”Visual Nunit 2012“找了很久也没找到。最后发现,在VS2012中使用Nunit变了一种方式,就是NUnit Test Adapter,什么意思?顾名思义,就是NUnit测试适配器的意思,网上有人说使用”NUnit Test Adapter“,测试项目必须是微软的”单元测试项目“,我试了下类库和应用程序都是能够测试的。
使用”NUnit Test Adapter“,须要在VS2012中添加其扩展:工具-扩展和更新-联机-搜索”NUnit Test Adapter“:
安装完成后,在测试-窗口-测试资源管理器中打开其窗口,仍是咱们上面的测试用例,测试结果:
示例代码下载:http://pan.baidu.com/s/1nt0oKUP
关于“单元测试”,以及NUint几年前都存在了,奈何小菜如今才开始接触,只恨本身生于太晚,但也为时未晚,本篇都是一些基础的知识或配置,但愿大神们看到莫笑,若是能帮像菜鸟我同样的你,那真是莫大荣幸,本篇也只是开始,接下来会在项目中使用“单元测试”,到时候再作些总结或感想与你们分享,还请关注。
若是你以为本篇文章对你有所帮助,请点击右下部“推荐”,^_^
参考资料: