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

[TestFixture]
 public class TicketTest
 {
  [Test]
  public void Add()
  {
   Ticket ticket = new Ticket();
   ticket.Add(100);
   Assertion.AssertEquals(100, ticket.Amount);
  }
 }

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

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

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

[Test]
  public void Sell()
  {
   Ticket ticket = new Ticket();
   ticket.Add(100);
   ticket.Sell();
   ticket.Sell();
   ticket.Sell();
   Assertion.AssertEquals(97, ticket.Amount);
  }

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

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

public class Ticket
 {
  private int amount;
  public int Amount
  {
   get
   {
    return amount;
   }
  }

public void Add(int num)
  {
  }

public void Sell()
  {
  }
}

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

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

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

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

public void Add(int num)
{
amount += num;
}

保存,重新编译。

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

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

public void Sell()
{
amount -= 1;
}

再来测试,结果就变成:

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

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

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

[Test]
 [ExpectedException(typeof(Exception))]
 public void ExcpetionTesting()
 {
  Ticket ticket = new Ticket();
  ticket.Add(3);
  ticket.Sell();
  ticket.Sell();
  ticket.Sell();
  ticket.Sell();
 }

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

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

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

public void Sell()
{
if(amount - 1 < 0)
throw new Exception("Amount不能为0");
amount -= 1;
}

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

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

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

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

==

转载于:https://www.cnblogs.com/mq0036/p/7839030.html

使用实例 ---- 使用NUnit在.Net编程中进行单元测试相关推荐

  1. 使用NUnit在.Net编程中进行单元测试(转载)

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

  2. python面向对象编程中_Python面向对象编程中关于类和方法

    类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句"物以类聚". 没错就是类, 归类 物以类聚 类 ...

  3. python关系运算符实例_python编程中最常用的比较运算符实例

    python运算符-编程中最常用的比较运算符(实例解析) 今天这篇文章我们来说说python比较运算符,这个一共有七种不一样的运算符分别是等于.不等于.大于.小于.大于等于.小于等于,这七种是比较常用 ...

  4. 函数式编程中的战斗机--elm编写实例(薛定鄂的猫

    函数式编程中的战斗机--elm编写实例(薛定鄂的猫) 1.初始设置 2.薛定谔的猫 3.定义规则 4.建立模型 5.建立更新模型的逻辑 6.构建前端界面 7.连接代码 8.运行程序 1.初始设置 今天 ...

  5. 函数式编程中的战斗机(二) --运用elm语言MUV设计模式做一个简单的应用实例

    @函数式编程中的战斗机(二) -运用elm语言MUV设计模式做一个简单的应用实例 1 elm语言设计模式的特点 1.1 面向对象设计模式的特点 每种编程语言都有其独特的语法和优缺点,从而导致与众不同的 ...

  6. shell 不等于_关于shell编程中的整数值比较的两种方式的简单操作实例

    谈一谈关于shell编程中的整数值比较的两种方式 Shell编程有时处理一个对象时,需要我们对对象进行测试. 只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错. 这个测试的对象可以是文件. ...

  7. 实例——在编程过程中进行单元测试

    这是一个真枪实弹的例子,如何在编程过程中进行单元测试. 本文以一个图书馆的书籍管理系统作为例子,讲述一个单元测试--编码的循环过程.这里只讲述一个独立画面的编写.画面的编码分两个部分,业务数据部分和界 ...

  8. 实例解析网络编程中的另类内存泄漏

    本文分享自华为云社区<[网络编程开发系列]一种网络编程中的另类内存泄漏>,作者:架构师李肯. 1 写在前面 最近在排查一个网络通讯的压测问题,最后发现跟"内存泄漏"扯上 ...

  9. ll文件显示为?????_关于shell编程中的文件测试简单的操作实例

    谈一谈关于shell编程中的文件测试 Shell编程有时处理一个对象时,需要我们对对象进行测试. 只有符合要求的才采取下一步操作,这样做的好处可以避免程序出错. 这个测试的对象可以是文件.字符串.数字 ...

最新文章

  1. HTTP/3 来了 !HTTP/2 还没怎么用起来呢,先一起扫个盲吧!
  2. Android 通过Intent调用系统功能和Action动作和服务广播【大全】
  3. 最小公倍数与最大公约数
  4. 特征图注意力_向往的GAT(图注意力模型)
  5. 罗汉塔最少步骤_如何以最少的步骤压缩和密码保护文件?
  6. Chocolatey 简介(软件自动化管理工具)
  7. Javascript第五章删除、克隆、插入、替换方法源码第九课
  8. mysql 两阶段加锁_MySql-两阶段加锁协议
  9. 在小鸟云进行服务器托管,怎么升级配置?
  10. 【Matlab】输出视频、图片操作
  11. 玄铁杯第二届RISC-V应用创新大赛火热报名中
  12. 招商大师与星范集团等医美龙头达成战略合作 从提业绩到建标杆
  13. FFplay退出分析
  14. 法坤老师:法坤电子书搜索系统搭建
  15. ABC科创之星上海集易网络科技有限公司亮相2019第五届中国(贵阳)大数据交易高峰论坛...
  16. YAMMER使用手册
  17. java基于微信小程序的电影院购票选座 uniapp 小程序
  18. 优优智能客户关系管理系统UUCRM5.0
  19. Claymore11内核+大力矿工拦截,收益提升3-5%
  20. 话筒好坏测试软件,如何判断无线话筒系统的好坏

热门文章

  1. python发送微信消息_python 发送QQ或者微信消息
  2. git 删除分支_常用Git操作命令指南
  3. 搭建etcd 3.4.15集群(详细教程,包括选举过程、数据备份和恢复)
  4. layui 鼠标移入变为小手_如何在 LayUI 数据表格的列元素上,鼠标悬浮,显示所有文字内容(修改源码)...
  5. 【codevs2144】砝码称重 2(折半搜索)
  6. java byte binary_java byte 与 binary 转换
  7. 基于matlab单目视觉焊缝跟踪系统,基于激光线结构光3D视觉的机器人轨迹跟踪方法与应用...
  8. jquery隐式迭代
  9. js-Tabs小案例
  10. Python入门--字符串的判断操作