一、
NUnit是一个单元测试框架,专门针对于.NET来写的.其实在前面有JUnit(Java),CPPUnit(C++),他们都是xUnit的一员.最初,它是从JUnit而来.现在的版本是2.2.接下来我所用的都是基于这个版本.
NUnit最初是由James W. Newkirk, Alexei A. Vorontsov 和Philip A. Craig, 后来开发团队逐渐庞大起来.在开发过程中, Kent Beck 和Erich Gamma2位牛人也提供了许多帮助.看来对于NUnit还真是下了一番力气了.J
NUnit是xUnit家族种的第4个主打产品,完全由C#语言来编写,并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等.
最重要的一点是它适合于所有.NET语言。
 
二、十大属性
1.TestFixtureAttribute
    用来修饰测试类
。这个属性标记一个类包含了测试方法。
    被TestFixtureAttribute修饰的类需满足以下限制
        a.必须是一个public类型,否则NUnit不会识别它。 
        b.它必须有一个缺省的构造子,否则Nunit不能构建他。 
        c.构造子不应该有任何方面的负面影响,因为在一个对话的过程中,NUnit可能构造类多次。
 
        如:
        using System;
        using NUnit.Framework;
       [TestFixture]
        public class SuccessTests
        {
        // ...
        }
2.TestAttribute 
    用来修饰测试方法
Test属性标记某个类的某个方法为一个测试方法,而且此类必需已经标记为一个TestFixture。
    一个测试方法的签名定义如下: 
        public void MethodName()
    注意:测试方法必须没有参数。
如果程序员将测试方法标记为不正确的签名,它不会运行。
        如:
        using System;
        using NUnit.Framework;
       [TestFixture]
        public class SuccessTests
        {
            [Test] 
            public void Add()
            {
                //...
            }
        }

3.SetUpAttribute
    用来修饰方法。所属的类必需已经标记为一个TestFixture。
一个TestFixture可以仅有一个SetUp方法。如果有多个定义,TestFixture也会编译成功,但是测试不会运行。SetUpAttribute标记的方法是在每个测试方法被调用之前来完成的。
        如:
        using System;
        using NUnit.Framework;
        [TestFixture]
        public class SuccessTests
        {
            [SetUp] 
            public void Init()
            { /* ... */ }

[TearDown] 
            public void Dispose()
            { /* ... */ }

    [Test] 
            public void Add()
            { /* ... */ }
        }

SetUp属性是从任何基类继承而来。因此,如果基类已经定义了一个SetUp方法,那么这个方法会在每个派生的类的测试方法之前调用。如果你打算在派生类里加入更多的SetUp功能,你需要将方法标记为适当的属性,然后调用基类方法。

SetUpAttribute使用案例:
        如:我们以测试加减法为例
        using System; 
        using NUnit.Framework; 
        [TestFixture] 
        public class NumersFixture 
        { 
                    [Test] 
                    public void AddTwoNumbers() 
                    { 
                                int a=1; 
                                int b=2; 
                                int sum=a+b; 
                                Assert.AreEqual(sum,3); 
                    } 
                   [Test] 
                    public void MultiplyTwoNumbers() 
                    { 
                                int a = 1; 
                                int b = 2; 
                                int product = a * b; 
                                Assert.AreEqual(2, product); 
                    } 
        } 
        不难看出两个测试方法中有重复的代码,如何去除重复的代码呢?我们可以提取这些代码到一个独立的方法,然后标志这个方法为SetUp 属性,这样2个测试方法可以共享对操作数的初始化了,这里是改动后的代码: 
        using System; 
        using NUnit.Framework; 
        [TestFixture] 
        public class NumersFixture 
        { 
                    private int a; 
                    private int b; 
                   [SetUp] 
                    public void InitializeOperands() 
                    { 
                                a = 1; 
                                b = 2;
 
                    }

   [Test] 
                    public void AddTwoNumbers() 
                    { 
                                int sum=a+b; 
                                Assert.AreEqual(sum,3); 
                    } 
                    [Test] 
                    public void MultiplyTwoNumbers() 
                    { 
                                int product = a * b; 
                                Assert.AreEqual(2, product); 
                    } 
        } 
        这样NUnit将在执行每个测试前执行标记SetUp属性的方法.在本例中就是执行InitializeOperands()方法.记住,这里这个方法必须为public,不然就会有以下错误:Invalid Setup or TearDown method signature

4.TearDownAttribute 
   用来修饰方法
所属的类必需已经标记为一个TestFixture。一个TestFixture可以仅有一个TearDown方法。如果有多个定义,TestFixture也会编译成功,但是测试不会运行。被TearDownAttribute修饰的方法是每个测试方法被调用之后来执行的。
        如:
        using System;
        using NUnit.Framework;
        [TestFixture]
        public class SuccessTests
        {
            [SetUp] 
            public void Init()
            { /* ... */ }

 [TearDown] 
            public void Dispose()
            { /* ... */ }

   [Test] 
            public void Add()
            { /* ... */ }
        }
    TearDown属性是从任何的基类继承而来。因此,如果基类已经定义了一个TearDown方法,那么这个方法会在每个派生的类的测试方法之后调用。如果你打算在派生类里加入更多的TearDown功能,你需要将方法标记为适当的属性,然后调用基类方法。

5.TestFixtureSetUpAttribute 
    用来修饰方法。所属的类必需已经标记为一个TestFixture。这些个属性标记的方式在fixture任何测试执行之前完成。TestFixture可以仅有一个TestFixtureSetUp方法。
如果定义了多个,TestFixture可以成功编译,但是测试不会被执行。

6.TestFixtureTearDownAttribute
    用来修饰方法。所属的类必需已经标记为一个TestFixture。这些个属性标记的方式在fixture任何测试执行之后完成。TestFixture可以仅有一个TestFixtureTearDownAttribute方法。
如果定义了多个,TestFixture可以成功编译,但是测试不会被执行。
        如:
        namespace NUnit.Tests
        {
          using System;
          using NUnit.Framework;

 [TestFixture]
          public class SuccessTests
          {
           [TestFixtureSetUp] 
            public void Init()
            { /* ... */ }

 [TestFixtureTearDown] 
            public void Dispose()
            { /* ... */ }

[Test] 
            public void Add()
            { /* ... */ }
          }
        }

SetUp/TearDown方法提供达到测试隔离性的目的.SetUp确保共享的资源在每个测试运行前正确初始化,TearDown确保没有运行测试产生的遗留副作用. TestFixtureSetUp/TestFixtureTearDown同样提供相同的目的,但是却在test fixture范围里
    我们写一个简单的测试来说明什么方法调用了,怎么合适调用
        using System; 
        using NUnit.Framework; 
        [TestFixture] 
        public class LifeCycleContractFixture 
        { 
            [TestFixtureSetUp] 
            public void FixtureSetUp() 
            { 
                Console.Out.WriteLine("FixtureSetUp");
            }
            [TestFixtureTearDown]
            public void FixtureTearDown()
            {
                Console.Out.WriteLine("FixtureTearDown");
            }
            [SetUp]
            public void SetUp()
            {
                Console.Out.WriteLine("SetUp");
            }
            [TearDown]
            public void TearDown()
            {
                Console.Out.WriteLine("TearDown");
            }
           [Test]
            public void Test1()
            {
                Console.Out.WriteLine("Test 1");
            }
            [Test]
            public void Test2()
            {
                Console.Out.WriteLine("Test 2");
            }
        }
        运行结果:
        FixtureSetUp
        SetUp
        Test 1
        TearDown
        SetUp
        Test 2
        TearDown
        FixtureTearDown
    
7.ExpectedExceptionAttribute
    修饰方法,用来测试一个方法是否抛出了指定的异常。
本属性有两种重载方式。第一种是一个Type,此Type为期望的异常的精确类型。 第二种是一个期望的异常全名的字符串。
    在执行测试时,如果它抛出了指定的异常,那么测试通过。如果抛出一个不同的异常,测试就失败。如果抛出了一个由期望异常继承而来的异常,这也是成功的。
        using System;
        using NUnit.Framework;
        [TestFixture]
        public class SuccessTests
        {
           [Test]
            [ExpectedException(typeof(InvalidOperationException))]
            public void ExpectAnExceptionByType()
            { /* ... */ }

 [Test]
            [ExpectedException("System.InvalidOperationException")]
            public void ExpectAnExceptionByName()
            { /* ... */ }
        }
        
8.CategoryAttribute 
    修饰方法或修饰类。用来把测试分组,可以使用NUnit的Categories选项卡选择要测试的组,或排除一些组。
    对类分组:
        using System;
        using NUnit.Framework;
        [TestFixture]
        [Category("LongRunning")]
        public class LongRunningTests
        {
        // ...
        }
    对方法分组:
        using System;
        using NUnit.Framework;
        [TestFixture]
        public class SuccessTests
        {
            [Test]
            [Category("Long")]
            public void VeryLongTest()
            { /* ... */ }
        }

9.ExplicitAttribute
    用来修饰类或方法。Explicit属性会忽略一个测试或测试Fixture,直到它被显式的选择运行
。。如果test和test fixture在执行的过程中被发现,就忽略他们。所以,这样一来进度条显示为黄色,因为有test或test fixture忽略了。
    修饰类:
        using System;
        using NUnit.Framework;
        [TestFixture, Explicit]
        public class ExplicitTests
        {
        // ...
        }
    修饰方法:
        using System;
        using NUnit.Framework;

    [TestFixture]
        public class SuccessTests
        {
            [Test, Explicit]
            public void ExplicitTest()
            { /* ... */ }
        }
    
10.IgnoreAttribute
    用来修饰类或方法。由于种种原因,有一些测试我们不想运行
.当然,这些原因可能包括你认为这个测试还没有完成,这个测试正在重构之中,这个测试的需求不是太明确.但你有不想破坏测试,不然进度条可是红色的哟.怎么办?使用Ignore属性.你可以保持测试,但又不运行它们。
    这个特性用来暂时不运行一个测试或fixture。比起注释掉测试或重命名方法,这是一个比较好的机制,因为测试会和余下的代码一起编译,而且在运行时有一个不会运行测试的标记,这样保证不会忘记测试。
    修饰类:
        using System;
        using NUnit.Framework;
        [TestFixture]
        [Ignore("Ignore a fixture")]
        public class SuccessTests
        {
        // ...
        }

修饰方法
        using System;
        using NUnit.Framework;

[TestFixture]
        public class SuccessTests
        {
            [Test]
            [Ignore("Ignore a test")]
            public void IgnoredTest()
            { /* ... */ }
        }

Nunit概要的更多相关文章

  1. .Net 分布式云平台基础服务建设说明概要

    1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根 ...

  2. 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...

  3. 使用NUnit为游戏项目编写高质量单元测试的思考

    0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...

  4. 舍弃Nunit拥抱Xunit

    前言 今天与同事在讨论.Net下测试框架的时候,说到NUnit等大多数测试框架的SetUp以及TearDown方法并不是显得那么完美,所以在公司内部的项目中采用了Xunit框架.那么究竟是什么样的原因 ...

  5. HTML5 学习总结(一)——HTML5概要与新增标签

    一.HTML5概要 1.1.为什么需要HTML5 HTML4陈旧不能满足日益发展的互联网需要,特别是移动互联网.为了增强浏览器功能Flash被广泛使用,但安全与稳定堪忧,不适合在移动端使用(耗电.触摸 ...

  6. CSS3与页面布局学习总结(一)——概要、选择器、特殊性与刻度单位

    web前端开发者最最注的内容是三个:HTML.CSS与JavaScript,他们分别在不同方面发挥自己的作用,HTML实现页面结构,CSS完成页面的表现与风格,JavaScript实现一些客户端的功能 ...

  7. 更改WAS Profiles的概要文件的server1的SDK版本

    WebSphere只能使用IBM JDK 哦,不能使用sun的JDK哦.不过如果只是改jdk的版本的话可以参考如下步骤:(以集群为例,假设具有管理节点Dmgr01,应用概要AppSrv01) 1. 确 ...

  8. HTML5 学习笔记(一)——HTML5概要与新增标签

    目录 一.HTML5概要 1.1.为什么需要HTML5 1.2.什么是HTML5 1.3.HTML5现状及浏览器支持 1.4.HTML5特性 1.5.HTML5优点与缺点 1.5.1.优点 1.5.2 ...

  9. Comparing the MSTest and Nunit Frameworks

    I haven't seen much information online comparing the similarities and differences between the Nunit ...

随机推荐

  1. Delphi组件indy 10中IdTCPServer修正及SSL使用心得

    indy 10终于随着Delphi2005发布了,不过indy套件在我的印象中总是复杂并且BUG不断,说实话,不是看在他一整套组件的面子上,我还是喜欢VCL原生的Socket组件,简洁,清晰.Indy ...

  2. 匿名hash

    [root@oadb test]# cat a1.pl use Data::Dumper; my @a=qw/1 3 5 7 9/; push @b ,{@a}; print Dumper(@b); ...

  3. Hadoop RPC源码阅读-交互协议

    Hadoop版本Hadoop2.6 RPC主要分为3个部分:(1)交互协议(2)客户端 (3)服务端 (1)交互协议 协议:把某些接口和接口中的方法称为协议,客户端和服务端只要实现这些接口中的方法就可 ...

  4. Unity3D常见技术点(持续更新)

    一:获取对象, 添加对象等 1:使用prefab生成对象 GameObject ballObj = GameObject.Instantiate(Resources.Load(, Quaternion ...

  5. 牛刀小试、用SharePoint 实现请假管理功能

    转:http://www.cr173.com/html/15518_1.html "请假管理"应用,应该算是 SharePoint 的"Hello World!" ...

  6. 数据表列名与数据库关键字冲突,在Hibernate下的解决办法

    设计了一个数据库,某一个列名字是key,这与mysql数据库关键字冲突了,Hibernate下save总是报错. 在mysql命令中,解决办法很简单,只需要将关键字key用引号括起来就好了. 在Hib ...

  7. HTML5与CSS3权威指南.pdf4

    拖放API HTML5实现了直接拖放操作API,简化HTML4利用mousedown.mousemove等事件实现的操作 实现拖放的步骤 1要将被拖动元素的draggable属性设置为true,img ...

  8. Spark RDD概念学习系列之rdd持久化、广播、累加器(十八)

    1.rdd持久化 2.广播 3.累加器 1.rdd持久化 通过spark-shell,可以快速的验证我们的想法和操作! 启动hdfs集群 spark@SparkSingleNode:/usr/loca ...

  9. [Yii][RBAC]Yii中应用RBAC完全指南

    开端筹办 Yii供给了强大的设备机制和很多现成的类库.在Yii中应用RBAC是很简单的,完全不须要再写RBAC代码.所以筹办工作就是,打开编辑器,跟我来. 设置参数.建树数据库 在设备数组中,增长以下 ...

  10. POJ 3922 A simple stone game

    题目: E - A simple stone game Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d &am ...