引言:
举一个可能会发生在你身边的事件将更能贴近实际,幸好我们现在就有一件在程序员看来非常普通的任务:
你今天第一天上班,你的项目经理拿给你一叠不算厚的文档,告诉你今天的任务是按照文档中的要求编写一个.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编程过程中非常方便的进行单元测试,它图形化的界面和简单而强大的测试框架为我们提供了一个非常舒适而有趣的测试环境,能够让程序员觉得进行单元测试并不枯燥乏味,习惯后甚至还能成为一种乐趣。
看完本文,如果你是引言中那个可怜的程序员的话,你现在就一定能轻松的面对你的项目经理,交上一份令人放心的代码答卷。

使用NUnit在.Net编程中进行单元测试(转载)相关推荐

  1. 使用实例 ---- 使用NUnit在.Net编程中进行单元测试

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

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

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

  3. 在.NET开发中的单元测试工具之(1)——NUnit

    NUnit介绍 NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在xUnit体系中还有针对Java的JUnit和针对C++的CPPUnit,在开始的时候NUnit和x ...

  4. .NET 项目中的单元测试

    .NET 项目中的单元测试 Intro "不会写单元测试的程序员不是合格的程序员,不写单元测试的程序员不是优秀的工程师." -- 一只想要成为一个优秀程序员的渣逼程序猿. 那么问题 ...

  5. 好代码是管出来的——.Net Core中的单元测试与代码覆盖率

    测试对于软件来说,是保证其质量的一个重要过程,而测试又分为很多种,单元测试.集成测试.系统测试.压力测试等等,不同的测试的测试粒度和测试目标也不同,如单元测试关注每一行代码,集成测试关注的是多个模块是 ...

  6. 【学习笔记】C#中的单元测试

    周一老师讲完单元测试以后,感觉挺好玩,通过查资料和相关书籍学到了几种C#在VS2010的测试方法,跟大家分享下,图文并茂啊,有木有~~ 1.从被测试的代码中生成单元测试 1.1创建C#控制台程序,命名 ...

  7. 在 Java OOP 编程中的注意事项

    在 Java OOP 编程中的注意事项 重写 方法 字段 反射 static 接口 abstract Maven JUnit 重写 方法 当子类重写超类的方法时,子类该方法的被访问权限不能低于超类方法 ...

  8. 后端技术:Java编程中忽略这些细节,Bug肯定少不了

    在Java语言的日常编程中,也存在着容易被忽略的细节,这些细节可能会导致程序出现各种Bug. Java语言构建的各类应用程序,在人类的日常生活中占用非常重要的地位,各大IT厂商几乎都会使用它来构建自己 ...

  9. 异步编程中的最佳做法(Async/Await) --转

    近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支持的信息. 本文旨在作为学习异步编程的"第二步":我假设 ...

最新文章

  1. java gnu_GNU/Linux下Java开发环境的安装和配置 | 学步园
  2. @Resource和@Autowired作用和区别
  3. mnist手写数字识别python_Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】...
  4. List列表的万能的适配器
  5. slot多作用域 vue_vue插槽(slot)详解
  6. VB 域名转换IP地址函数
  7. 理解Twisted与非阻塞编程
  8. SuperMap AR三维管线制作
  9. 浅谈游戏被唾弃的原因
  10. 传感器学习——TB6612
  11. 上海十大it外包公司
  12. 分享几个软件测试逻辑思维和综合面试题【含答案】
  13. PHP程序员全栈,PHP程序员画的 “全栈工程师技能树” 思维导图
  14. Android攻城狮ScrollView
  15. 测试jre 和jdk是否安装好
  16. Oracle 字符集 原理及问题解决 (全)
  17. 聊天会话常用JS/CSS代码
  18. Ubuntu下安装配置gitLab(一)
  19. 2016年最新高效的60个网络推广方法汇总
  20. C++模拟实现哈希表

热门文章

  1. iptables 防火墙为什么不占用端口?
  2. 将字符串或数字倒序输出
  3. Mac osx 技巧
  4. 从用户的角度看解决方案
  5. firefox访问页面 直接显示代码问题问题解决办法
  6. 程序员面试金典——17.1无缓存交换
  7. hexo之next主题添加分类
  8. 计算机系统内部五大部件的主要连接关系总结
  9. 在Macbook M1上安装Parallels Desktop 17虚拟机和Originlab 2021
  10. C++获取当前时间及计算当前时间距某个时间点的时间段