利用TestDriven.net和NUnit进行单元测试

1 准备TestDriven和NUnit

单元测试对于程序员来说基本是一个必备的技能。“千里之堤,溃于蚁穴”这句话对于程序员也适用。记得一位大牛说过“笨蛋都能写出让机器看懂的程序,真正的聪明人写出让人看得懂的程序”。单元测试能显著提高自己程序的质量,当项目变得很大的时候,良好的单元测试也能提高项目的质量,当然,它也能让人充满成就感。好吧,让我们开始单元测试之旅。

下载TestDriven:http://www.testdriven.net/default.aspx
下载NUnit:http://www.nunit.org/index.php?p=download

NUnit名气非常大,而且功能也很强,尽管NUnit支持GUI和Console两种工作方式,但是它使用起来确实不够直观,我们不得不不停地切换窗口以看到测试结果。而TestDriven就非常方便,它和Visual Studio .Net2003和2005都集成的非常好,做到了即指即测。能较大的提高我们测试的效率。在安装好TestDriven后,就可以看到下面的一个小小的图标。

我们可以针对整个测试文件和单个函数进行测试,非常方便。下面主要谈谈TestDriven支持的属性和参数。

2 TestDriven支持的一些重要的属性

TestDriven其实可以支持大部分NUnit支持的属性,但是有些属性是无法支持的。其实对于自己进行单元测试来说,只需要知道常用的10多个属性就可以进行很好的测试了。下面就最常用和最重要的属性做一些解释。
在开始测试之前,记得引用nunit.framework这个dll,然后

using  NUnit.Framework;

2.1  [TestFixture] 属性

这个属性通常是用来修饰测试类,表明这个类是用于测试的。一般把它放在类声明的上面,就像下面这样

 [TestFixture]
 //这个类是一个用来执行单元测试的类
 public class TestSimpleCalculator
 {
  // something
 }

2.2 [TestFixtureSetUp] 属性

这个属性通常用来修饰一个方法,表明这个方法先于所有测试方法之前运行,类似于构造函数。那么我们可以用来初始化一些对象等,非常有用。

[TestFixture]
 public class UnitTestDemo
 {
  SimpleCalculator myMath;
  
  //在所有测试方法运行之前运行
  [TestFixtureSetUp]
  public void InitFixture()
  {
   myMath = new SimpleCalculator();
  }
 }

 2.3  [TestFixtureTearDown] 属性

这个属性也是用于修饰方法,它会在所有测试方法运行完毕以后运行。你可以用它来释放一些资源。

 [TestFixture]
 public class UnitTestDemo
 {
  SimpleCalculator myMath;
  
  //在所有测试方法运行完之后运行
  [TestFixtureTearDown]
  public void InitFixture()
  {
   //释放一些资源
   myMath.Dispose();
  }
 }

2.4 [SetUp]属性

这个属性用来修饰方法,表明它会在每一个测试方法运行之前运行。那么可以用它来重设一些变量,是每个方法在运行之前都有良好的初值。

 [TestFixture]
 public class TestSimpleCalculator
 {
  SimpleCalculator myMath;
  private double a;
  private double b;

// 在任何一个测试方法运行之前运行,可以用来重置一些变量
  [SetUp]
  public void Init()
  {
   a = 3.0;
   b = 5.0;
  }
 }

2.5 [TearDown]属性

这个属性通常用来修饰方法,表明这个方法会在每个测试方法运行完之后运行一次。 可以用来清理一些变量或者环境。

[TestFixture]
 public class TestSimpleCalculator
 {
  SimpleCalculator myMath;
  StringBuilder sb;

[TestFixtureSetUp]
  public void InitFixture()
  {
   myMath = new SimpleCalculator();
   sb = new StringBuilder();
  }

// 在每一个测试方法运行完了之后都会运行,可以用来清理一些暂存变量
  [TearDown]
  public void Teardown()
  {
   sb.Remove( 0, sb.Length );
  }
 }

2.6 [Test]属性

这个属性是最有用处的,因为它表明这是一个测试方法。

 [TestFixture]
 public class TestSimpleCalculator
 {
  SimpleCalculator myMath;
  private double a;  // a = 3.0  
  private double b; // b = 5.0

// 这是一个测试方法
  [Test]
  public void Add()
  {
   Assert.AreEqual( a, 3.0 ); // 返回真
   Assert.AreEqual( b, 5.0 );// 返回真
   a = myMath.Add( a, b );
   Assert.AreEqual(a, 7.0, "The expect result is 7, and the actual result is 8");// 返回假,并且会打印出错误信息
  }
 }

2.7 [ExpectedException(typeof(OneSupportedException))] 属性

这个属性其实非常有用处,它表明这个函数会抛出一个预期的异常。在一个项目中,异常的处理是不可避免的。如果异常处理机制不好的话,会给程序带来相当大的混乱。也许你的程序充满了try,catch,但是确总也捕捉不到自己想要的异常。混乱的异常对于程序员来说就是灾难。

  [Test]
  [ExpectedException(typeof(InvalidOperationException))]
  public void ExpectAnException()
  {
   throw new InvalidCastException();// 这个地方抛出了非预期的异常,所以测试方法失败。
  }

2.8 [Ignore("name")]属性

这个属性也挺有用处,它表示这个测试方法会被忽略掉。也许你的代码进行了一些升级,以前的测试方法已经不再重要,但是你仍然希望保留它们。那么你尽可以把它们标志成Ignore,然后统一放到一个文件或者Region中,以做存档之用。

  [Test]
  [Ignore("ignored test")]
  [ExpectedException(typeof(InvalidOperationException))]
  public void IgnoredTest()
  {
   throw new Exception(); // 如果可以运行这个测试方法,那么这个方法不会通过测试,但是现在它已经被忽略掉了。
  }

2.9 [Platform("SupportedPlatform")]属性

这个属性也相当实用,它表明这个测试方法会运行在指定的平台上。大家都知道,.Net Framework就有几个版本,还有各种版本的Windows系统。不同的版本对于某些类库或者API的支持是不一样的。比如WMI查询语句的某些用法在Win2000上就无法通过测试。某些类库在.net1.1中无法找到,如果指定了平台,就一切都变得井井有条了。

  [Test]
  [Platform("NET-1.1")]
  //更多支持的平台请查阅NUnit的文档
  public void DotNetOneOneTests()
  {
   Assert.AreEqual( "This case run on .Net1.1", "This method will not be executed" );  // 这个测试方法只会运行在.Net1.1的平台下。
  }

2.10 [Category("NameOfCategory")]属性

这个属性也很好。但是在TestDriven中无法使用。它表明我们可以把某些测试归成一类(Category),我们可以给这个类别取个名字,然后可以指定是否对这个类别进行测试。假设你有个函数需要运行很长的时间,你肯定不希望每次都去运行它。那么你可以把它归到某个类别中,然后在NUnit的GUI中将它排除在测试范围之外。

[Test]
  [Category("Long")]
  // 这个测试方法属于名字为Long的类别,我们可以在NUnit的GUI中选择是否需要运行这一类别的测试方法,但是TestDriven.net无法使用这个属性。
  public void VeryLongTest()
  { 
   Assert.AreEqual( "This test will consum a very long time", "No, It will be completed in 0.1 seconds");
  }

2.11 [Explicit]属性

这个属性和Ignore有相似之处,但是也有不同。如果指定了这个属性,那么在测试的时候是不会运行的。但是如果你指定了它(比如你把鼠标放在这个方法上,然后选择RunTest)这个测试方法就会运行。它也非常有用处,对于某些你想暂时避过的测试,它是一个好的选择。

  [Test, Explicit]
  public void ExplicitTest()
  {
   Assert.AreEqual(1, 2); // 这个测试方法会自动地被忽略掉,除非我们在NUnit的GUI中手动选择它或者把鼠标放在它上面,再运行TestDriven.net, 它才会被执行
  }

3 总结

其实NUnit的实际功能比我上面列举的强大得多。但是对于程序员自己单元测试来说,了解一些常用的属性就已经足够。TestDriven支持大部分属性,使用起来也非常的方便。而且TestDriven还能提供NCover这个分析的利器。你大可以为自己的应用程序创建一个工程,同时还为自己的测试代码创建一个工程,测试和开发同步进行。良好的单元测试一定可以提高程序的质量,同时也未必会耽误太多时间,延缓项目的进度。单元测试是如此的简单,也是如此的有用。希望上面的这些属性对大家有所帮助,能够提高大家的程序水平。

转载于:https://www.cnblogs.com/Yjianyong/archive/2010/08/26/1808992.html

利用TestDriven.net和NUnit进行单元测试(转)相关推荐

  1. 使用NUnit做单元测试(总结版)

    使用NUnit做单元测试(总结版) [按:有关于NUnit的详细介绍请见:<NUnit2.0详细使用方法 >http://confach.cnblogs.com/archive/2005/ ...

  2. 利用COM+对数据库操作进行单元测试

    当单元测试需要对数据库执行CRUD(Create,Retrieve,Update,Delete)操作时,测试过后会在我们的数据库中留下大量重复的垃圾数据,这些垃圾很碍眼不是吗?而且我们的下一个测试有可 ...

  3. VS2010整合NUnit进行单元测试

    1.下载安装NUnit(最新win版本为NUnit-2.6.0.12051.msi) http://www.nunit.org/index.php?p=download 2.下载并安装VS的Visua ...

  4. 5分钟实现VS2010整合NUnit进行单元测试

    1.下载安装NUnit(最新win版本为NUnit-2.6.0.12051.msi) http://www.nunit.org/index.php?p=download 2.下载并安装VS的Visua ...

  5. Nunit中如何进行事务性单元测试

    单元测试要求:单元测试方法并不真正去变更数据库,也就是说单元测试不依赖于数据库中的数据.那我们如何解决执行单元测试方法后,不变更数据库中数据呢? 一般的解决方案有两种: 1. 新建一个单元测试数据库, ...

  6. 使用单元测试工具TestDriven.NET调试程序

    文本Tag: TestDirector 单元测试 测试工具 .NET [IT168 技术文档] 引言 在实际的项目中,我们会遇到如下的问题: 1. 在编写一些不太好调试的程序时,如WebService ...

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

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

  8. 单元测试与Nunit的基本使用

    一.单元测试是什么 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,C# ...

  9. Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)...

    本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试 ...

  10. 一步一步学NUnit

    转载:http://tech.sina.com.cn/s/2009-07-17/1129988785.shtml 单元测试基础知识 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明 ...

最新文章

  1. Django之路——6 Django的模型层(一)
  2. Flutter开发之HTTP网络请求:Http库(27)
  3. centos7服务器搭建elasticsearch7.6.0集群
  4. python语言具有使用变量需要先定义后使用的特点_3、Python语法入门之变量
  5. Object Detection中的IOU
  6. JavaWeb课程复习资料(四)——创建Servlet
  7. nusoap php 7,nusoap-用php的NuSoap 访问webservice遇到的问题。
  8. 在欲而无欲,居尘不染尘
  9. STL内嵌数据类型: value_type
  10. yolov5数据集txt解析
  11. android x86 5.1 .iso,凤凰OS5.1通用ISO1.5.0
  12. Android 8.0 新特性(一) - 可下载字体
  13. 计算机网络代表第几次革命,互联网:人类生产力的第三次革命
  14. 大学生html5实训心得体会,实训心得体会600字(精选5篇)
  15. 【LeetCode系列】数的奥秘之幂数与完全平方数
  16. 手机上网占多大流量?WiFi要不要进行限速?
  17. 好书推荐|VirtualLab Fusion入门与进阶实用教程(第二版)
  18. 周末去哪儿架构师跟你聊:大数据平台快速解决方案
  19. Scrapy+MySQL爬取去哪儿网
  20. jump-game(跳跃游戏)

热门文章

  1. 数据库优化java设计模式架构 策略 责任链
  2. Zookeeper案例之监听配置中心
  3. Web项目中时间格式化的方法
  4. Spring源码之getBean(获取 bean)方法(一)解读
  5. mac git 自动补全
  6. 物联网标准组织OCF成立 有望解决碎片化问题
  7. C语言 · 字符删除
  8. Spring 一二事(1)
  9. java ognl 值栈_ognl-值栈基本操作
  10. vscode自定义代码片段