当前位置:编程学习 > asp >>

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

 NUnit介绍
  NUnit是一个专门针对于.NET来写的单元测试框架,它是xUnit体系中的一员,在xUnit体系中还有针对Java的JUnit和针对C++的CPPUnit,在开始的时候NUnit和xUnit体系中的大多数的做法一样,仅仅是将Smalltalk或者Java版本转换而来,但是在.NET2.0之后它加入了一些特有的做法。NUnit的官方网站是:http://www.nunit.org/,目前的最新版本是:2.6.2。
NUnit下载与安装
  NUnit的每个版本都提供了两种形式的下载:安装文件和免安装方式,分别是*.msi格式和*.zip格式。前者需要安装才能使用,并且会在安装过程中创建一些快捷方式和注册NUnit的dll到GAC,这样以后编写NUnit测试类的时候添加NUnit的dll就像添加.Net Framework的dll一样。如果是下载的zip格式的文件,则不会创建快捷方式和注册dll,在编写单元测试类时需要手动指定NUnit的dll的路径。
  NUnit的运行有三种方式:命令行和图形用户界面。以周公当前电脑上安装的NUnit2.5.10为例,安装路径为:C:\Program Files (x86)\NUnit 2.5.10,其下有三个目录:bin、doc和samples。在doc目录下是软件的文档(英文),在samples目录下则是一些样例代码。如果是采用免安装模式的话,运行NUnit就需要运行bin目录下的文件,在bin目录下有net-1.1和net-2.0两个文件夹,分别对应.net的不同版本。
  下面介绍如何以不同的方式启动NUnit:
  命令行模式:运行nunit-console.exe。
  图形用户界面模式:运行nunit.exe。
  并行(parallel)模式:运行pnunit-launcher.exe。
  注意:.Net2.0版本的NUnit是使用/platform:anycpu参数来编译的,我们知道这样的结果是运行在x86的系统上会被JIT编译成32位的程序,而在x64的系统上会被JIT编译成64位的程序。如果使用NUnit在x64系统上测试32位的程序就会带来问题。为了避免这个问题,可以使用nunit-agent-x86.exe/nunit-x86.exe来测试,因为在编译的时候使用了/platform:x86作为编译参数。
  下图是运行NUnit的GUI界面:
NUnit的常用Attribute标记
  这些都是可以用来作为类或者方法的属性,它们都是System.Attribute类的直接或间接子类,有如下:
  Category:用来将测试分类。这个在主界面可以看到Tests/Categories两个选项卡,如果给方法标记了Category属性就会在Categories选项卡中看得到。
  Combinatorial:用来将来测试时需要测试各种可能的组合,比如如下代码:
  [Test, Combinatorial]
  public void MyTest(
  [Values(1, 2, 3)] int x,
  [Values("A", "B")] string s)
  {
      string value = x + s;
      Assert.Greater(2, value.Length);
  }
  测试时实际会测试6种情况:MyTest(1, "A")/MyTest(1, "B")/MyTest(2, "A")/MyTest(2, "B")/MyTest(3, "A")/MyTest(3, "B")。
  Culture:设置测试时的语言环境,这对我们测试一些语言敏感的场景下有用,比如DateTime.ToString()在不同语言环境下得到的字符串并不相同。
  Description:用于指定测试对应的描述,如果选择将测试结果生成XML文件,那么就会在XML文件中看到这些描述。
  ExpectedException:指出执行测试时将会抛出Exception。
  Explicit:如果测试的类或者方法使用此Attribute,那么在使用带GUI的NUnit测试时这个类或者方法必须在界面上选定才会被执行。
  Explicit:忽略某个测试类或者方法。
  Maxtime:测试方法最大执行的毫秒数,如果程序的执行时间超过指定数值,那么就会被认为测试失败。
  Random:用于指定如何随机生成参数来测试方法。如下面的代码:
  [Test]
  public void TestDemo1(
  [Values(1, 2, 3)] int x,
  [Random(-10,10,2)] int y)
  {
      Assert.Greater(x + y, 0);
  }
  表示方法TestDemo1会生成6个测试,1,2,3分别作为参数x的值与两次从-10到10之间的随机数y组成6次测试。
  Range:指定参数的方法,如下面的方法:
  [Test]
  public void TestDemo2(
  [Range(0, 11, 4)] int x)
  {
      Assert.AreEqual(x%3,0);
  }
  表示从0开始递增,步长为4,且不大于11。
  Repeat:将重复测试的次数。
  RequiresMTA:表示测试时需要多线程单元(multi-threaded apartment)。
  RequiresSTA:表示测试时需要单线程单元(single-threaded apartment)。
  SetUp:在每个测试方法开始之前执行的初始化操作。在NUnit 2.5之前要求每个类只能有一个带SetUp属性的实例方法,但在NUnit 2.5之后则没有次数和必须是实例方法的限制。
  TearDown:与SetUp的作用相反,是在每个测试方法执行结束之后执行的方法。在NUnit 2.5之前要求每个类只能有一个带SetUp属性的实例方法,但在NUnit 2.5之后则没有次数和必须是实例方法的限制。
  Test:用来标记需要测试的方法,在NUnit 2.5之前只能用于标记实例方法,在NUnit 2.5之后则可以用于标记静态方法。
  TestCase:标记方法具有参数并且提供了在测试时需要的参数。如下面的代码:
  [TestCase(12, 3, 4)]
  [TestCase(12, 2, 6)]
  [TestCase(12, 4, 3)]
  public void DivideTest(int n, int d, int q)
  {
      Assert.AreEqual(q, n / d);
  }
  将会执行三次测试,相当于:
  [Test]
  public void DivideTest()
  {
      Assert.AreEqual(4,12/3);
  }
  [Test]
  public void DivideTest()
  {
      Assert.AreEqual(6,12/2);
  }
  [Test]
  public void DivideTest()
  {
      Assert.AreEqual(3,12/4);
  }
  TestFixture:标记一个类可能具有[Test]/[SetUp]/[TearDown]方法,但这个类不能是抽象类。
  TestFixtureSetUp:标记在类中所有测试方法执行之前执行的方法。在NUnit 2.5之前只能在类中将此标记最多使用于一个实例方法,在NUnit 2.5之后则可以标记多个方法,而且不限于实例方法还可以用于静态方法。
  TestFixtureTearDown:标记在类中所有测试方法执行之后再执行的方法。在NUnit 2.5之前只能在类中将此标记最多使用于一个实例方法,在NUnit 2.5之后则可以标记多个方法,而且不限于实例方法还可以用于静态方法。
  Timeout:标记被测试的方法最大的执行时间,如果超出标记的时间,则会被取消执行并且被标记为测试失败。
  Values:标记作为测试方法的一系列的参数。前面的代码实例中就有用法实例。
NUnit的断言(Assertions)
  断言是所有基于xUnit单元测试系列的核心,NUnit通过NUnit.Framework.Assert类提供了丰富的断言。具体说来,NUnit总共提供了11个类别的断言,它们是:
  Equality Asserts:用于断言对象是否相等方面的断言,主要表现为两个方法的重载:Assert.AreEqual()和Assert.AreNotEqual()两种形式的重载,重载参数包括了常见的基本数值类型(int/float/double等)和引用类型(表现为使用object作为参数).
  Identity Asserts:用于判断引用类型的对象是否是同一个引用的断言及断言对象是否存在于某个集合中,如Assert.AreSame、Assert.AreNotSame及Assert.Contains。
  Condition Asserts:用于某些条件的断言,如:Assert.IsTrue、Assert.True、Assert.IsFalse、Assert.False、Assert.IsNull、Assert.Null、Assert.IsNotNull、Assert.NotNull、Assert.IsNaN、Assert.IsEmpty及Assert.IsNotEmpty。
  Comparisons Asserts:用于数值及实现了IComparable接口的类型之间的断言,如Assert.Greater(大于)、Assert.GreaterOrEqual(大于或等于)、Assert.Less(小于)、Assert.LessOrEqual(小于或等于)。
  Type Asserts:用于类型之间的判断,比如判断某个实例是否是某一类型或者是从某个类型继承,如:Assert.IsInstanceOfType、Assert.IsNotInstanceOfType、Assert.IsAssignableFrom、Assert.IsNotAssignableFrom。在NUnit 2.5之后就增加了泛型方法,如Assert.IsInstanceOf<T>、Assert.IsNotInstanceOf<T>、Assert.IsAssignableFrom<T>、Assert.IsNotAssignableFrom<T>。。
  Exception Asserts:有关异常方面的断言,如Assert.Throws/Assert.Throws<T>、Assert.DoesNotThrow、Assert.Catch/Assert.Catch<T>。
  Utility Methods:用于精确控制测试过程,总共有四个方法,分别是:Assert.Pass、Assert.Fail、Assert.Ignore、Assert.Inconclusive。Assert.Pass和Assert.Fail是相反的,前者是表示将立即
补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,