[---  资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原作者保留所有权力,
如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意!
erwin_609#msn.com  ---]

引言:

举一个可能会发生在你身边的事件将更能贴近实际,幸好我们现在就有一件在程序员看来非常普通的任务:
你今天第一天上班,你的项目经理拿给你一叠不算厚的文档,告诉你今天的任务是按照文档中的要求编写一个.Net类,可能因为任务并不复杂,所以他看上去非常的随意。

今天能否很好的完成任务对你来说非常特殊,你拿过来后快速略过了前面大段的项目介绍,因为你知道那些对你并不重要,印象中好象是一个关于售票系统的工程。很快,你找了你需要关注的重点:类的需求说明文档。你详细的看了一遍,感觉并不复杂,类名Ticket,有一个只读的int型公共的属性,名称是Amount,还有两个方法,一个是名称是Sell,功能是将Amount减去一,表示卖掉了一张票,当然,票可不能为负数,如果是的话,抛出一个异常说明原因。另一个是Add,它有一个int型的参数,功能是将这个参数的值加到Amount中去,可能是表示进票之类的事情吧,你不太关心,反正这个程序很简单,你掩饰住内心的狂喜,打开电脑,调出编辑器,开始准备写程序了。

"喂,等等",项目经理不知道什么时候又转回来了,"我想知道你打算怎么进行单元测试,我最关心的是这个"。
"什么是单元测试?"你转过头一脸沮丧的看着失望的项目经理。

什么是单元测试:

在程序设计过程中会有许多种测试,单元只是其中的一种,单元测试并不能保证程序是完美无缺的,但是在所有的测试中,单元测试是第一个环节,也是最重要的一个环节。单元测试是一种由程序员自行测试的工作。简单点说,单元测试就是测试代码撰写者依据其所设想的方式执行是否产生了预期的结果。关于单元测试的重要性已经有许多文章做了很多深入的分析,这里就不再赘述。

NUnit是一个为Net准备的自动化单元测试框架,它的作用就是帮助你方便的完成单元测试工作,同鼎鼎有名的JUnit一样,都是xUnit家族的成员。它的下载地址是:http://www.nunit.org

测试先行:

"什么?先写测试?"你一定非常惊讶,对!就是先来编写测试代码,按照极限编程(XP)的理论,写测试就是对软件进行设计的过程,它的重要性甚至超过了实际完成功能的代码。先将测试写完,然后再来完成代码,这样,所有的测试通过之日也就是程序完成之时。

首先,我们将NUnit提供的要nunit.framework.dll文件引入到工程中,并创建一个名为TicketTest的类:

  1.  
  2. [TestFixture]
  3.  public class TicketTest
  4.  {
  5.   [Test]
  6.   public void Add()
  7.   {
  8.    Ticket ticket = new Ticket();
  9.    ticket.Add();
  10.    Assertion.AssertEquals(, ticket.Amount);
  11.   }
  12.  }
 

注意,其中的[TestFixture]和[Test]两个Attribute为NUnit所规定必须要添加的,这样,测试框架就可以知道哪些类或者方法需要进行测试。

我们在Add方法中定义了一个ticket对象,并给他加了100张票,然后就可以使用:
Assertion.AssertEquals(100, ticket.Amount);
来测试ticket的Amount属性是否确实为100。

接下来,我们再向TicketTest中添加一个测试Sell的方法:

  1.  
  2. [Test]
  3.   public void Sell()
  4.   {
  5.    Ticket ticket = new Ticket();
  6.    ticket.Add();
  7.    ticket.Sell();
  8.    ticket.Sell();
  9.    ticket.Sell();
  10.    Assertion.AssertEquals(, ticket.Amount);
  11.   }

这里,我们先加了100张票之后就一口气卖掉了3张,然后看看我们是否还剩下97张票。

好了,这两个方法的测试已经做完了,我们来看一下测试的结果,根据要求,我们写了如下代码:

  1.  
  2. public class Ticket
  3.  {
  4.   private int amount;
  5.   public int Amount
  6.   {
  7.    get
  8.    {
  9.     return amount;
  10.    }
  11.   }
  12.  
  13.   public void Add(int num)
  14.   {
  15.   }
  16.  
  17.   public void Sell()
  18.   {
  19.   }
  20. }
 

注意这段代码只是为了完成类的结构,方法的实现暂时先空着。然后将这段代码编译成一个dll动态连接库文件:UnitTest.dll。

我们运行NUnit的图形测试工具,打开我们编译好的dll文件,点"Run"按纽,就可以看到如下画面:

很醒目红色,表示测试并没有成功,不过这个是在我们的预料之中的。

接下来,我们向刚才的Ticket类中完成我们的Add方法实现代码:

  1. public void Add(int num)
  2. {
  3. amount += num;
  4. }
 

保存,重新编译。

切换到NUnit,再点Run,可以看到:

Add方法已经变成绿色了,再接着将Sell方法也完成:

  1. public void Sell()
  2. {
  3. amount -= ;
  4. }
 

再来测试,结果就变成:

啊,总算变成美丽的绿色了,大家现在体会到环保的重要性了吧。 :)

那么可以交任务了吗?等等,别急,还有个异常没测试呢,如果我们的Amount小于0的话,就会产生异常,那么,异常怎么测试呢?请接着看。

测试异常:
还是跟上面一样,先写出测试代码:

  1.  
  2. [Test]
  3.  [ExpectedException(typeof(Exception))]
  4.  public void ExcpetionTesting()
  5.  {
  6.   Ticket ticket = new Ticket();
  7.   ticket.Add();
  8.   ticket.Sell();
  9.   ticket.Sell();
  10.   ticket.Sell();
  11.   ticket.Sell();
  12.  }
 

其中,[ExpectedException(typeof(Exception))]表示我们希望能捕获到发生的异常,如果没有捕获到异常,则表示测试失败。

后面的代码很好理解,我们加了三张票,却卖了四张出去,这可不是炒股,以后没办法平仓的。 :)
编译运行,我们看到以下的测试画面:

在Ticket类中,我们修改一下Sell方法,让它变成:

  1. public void Sell()
  2. {
  3. if(amount -  < )
  4. throw new Exception("Amount不能为0");
  5. amount -= ;
  6. }
 

编译,再测试,结果如下:

好了,到了这里就算完成我们的单元测试之旅了,大家对如何在C#中进行单元测试一定已经有了一个基本的认识。另外,NUnit并不是只针对C#,事实上,你可以在任何.Net语言中使用NUnit来测试你的单元,方法都一样。

总结:
单元测试看上去虽然有点麻烦,但是它为程序员提供了一个安全的观点,让程序员对自己的程序更加有信心,在减少开发后期进行频繁Debug所耗费时间的同时也为应用软件提供了第一道安全防护网,因此,单元测试是提高开发效率和软件品质的一个重要的手段。

利用UNint,我们可以在.Net编程过程中非常方便的进行单元测试,它图形化的界面和简单而强大的测试框架为我们提供了一个非常舒适而有趣的测试环境,能够让程序员觉得进行单元测试并不枯燥乏味,习惯后甚至还能成为一种乐趣。
看完本文,如果你是引言中那个可怜的程序员的话,你现在就一定能轻松的面对你的项目经理,交上一份令人放心的代码答卷。

==

使用实例 ---- 使用NUnit在.Net编程中进行单元测试的更多相关文章

  1. 在.NET开发中的单元测试工具之(2)——xUnit.Net

    在上一篇<在.NET开发中的单元测试工具之(1)——NUnit>中讲述了如何使用NUnit在.NET开发中进行单元测试以及NUnit的一些缺点,今天将讲述如何使用xUnit.Net来进行单 ...

  2. [ SHELL编程 ] shell编程中数值计算方法实例

    SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结.主要包括let.bc.expr.(())等. 1.let 使用格式:let 表达式,表 ...

  3. C# 实例解释面向对象编程中的单一功能原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  4. C# 实例解释面向对象编程中的开闭原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  5. C# 实例解释面向对象编程中的里氏替换原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  6. C# 实例解释面向对象编程中的接口隔离原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  7. C# 实例解释面向对象编程中的依赖反转原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  8. 你不知道的this—JS异步编程中的this

    Javascript小学生都知道了javascript中的函数调用时会 隐性的接收两个附加的参数:this和arguments.参数this在javascript编程中占据中非常重要的地位,它的值取决 ...

  9. Java编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

随机推荐

  1. 十三 web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息, ...

  2. mongodb安装与权限配置

    mongodb下载地址:官方下载IDE工具:Robo 3T:官方下载 windows系统要求64位,最低2g内存,推荐8g内存及以上 安装过程没有需要配置的地方,直接下一步到结束,如果想要方便可以在环 ...

  3. 原生javascript-日历插件编写

    在线实例:http://lgy.1zwq.com/calendar/ 按照我们常用的日历格式,是7*6的格子,所以生成格子的总数就确定为42 例子:(如:2013年8月,这个时间为例子) /*---- ...

  4. HDU 4734 F(x) ★(数位DP)

    题意 一个整数 (AnAn-1An-2 ... A2A1), 定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1,求[0..B]内有多少 ...

  5. Python3 学习第十四弹: 模块学习六之re模块 + 正则表达式 (转)

    本文转自 AstralWind 的博客:Python正则表达式指南 特来收藏 1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有 ...

  6. laravel中新建文件并保存数据到文件中

    //base_path()获取当前的绝对路径 $path=base_path().'\config\web.php'; $str='abcdefg'; //要声明的字符串 file_put_conte ...

  7. C# 设计模式巩固 - 抽象工厂模式

    前言   继续工厂模式高级版,抽象工厂模式.抽象工厂模式其实是从工厂方法模式拓展而来.在实际的生活中一个工厂的产品不可能是单一的,肯定是多种系列的产品. 介绍 - 抽象工厂模式 定义:(摘自百度百科~ ...

  8. Personal Introduction

    专业:计算机科学与技术 我是博客园的新人,虽然接触编程世界只有一年,基础知识比较差,编程能力差,但对于这个专业,我还是充满兴趣,希望有一天能独当一面,从今天起,我将分享一些在学习web前端和其他方面的 ...

  9. yum 认知及使用

    https://www.cnblogs.com/zhichaoma/p/7533247.html

  10. iOS TableView常见问题

    Q:表视图只需要部分单元格,怎样删除下方多余的空白单元格? A:viewDidLoad中添加 self.tableView.tableFooterView=[[UIView alloc] init]; ...