施用NUnit做单元测试(总结版)

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

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


【按:有关于NUnit的详细介绍请见:《NUnit2.0详细使用方法 》http://confach.cnblogs.com/archive/2005/06/20/177817.aspx 本文是个人心得和简要总结】


一、本文摘要:


 ●什么单元测试
 ●什么是NUnit
 ●NUnit的下载以及安装
 ●NUnit的启动
 ●NUnit的最简单使用
 ●验证设计的功能是否实现
 ●SetUp/TearDown 属性
 ●TestFixtureSetUp/TestFixtureTearDown
 ●Category属性
 ●Explicit属性
 ●输出


二、什么单元测试

单元测试,就是局部测试,对于web应用程序或者Windows应用程序来说,都是由很多“局部”组成的。如果是一个具体的Web Page,那么可以通常运行、浏览页面看到具体的结果,但是如果是一个类,测试起来可能就会有一些麻烦,尤其是在类反复继承之后,想要查看程序运行过程中某个类的具体实现结果和实现过程,往往就不那么容易了。
vs IDE当中包含调试(Debug)和跟踪(Trace)的功能,但是它们也有一些局限,往往都是要对程序的整体进行测试,通过层层调用才能运行到某个类。
所以使用单元测试对局部进行测试就会有更好的结果了。
使用单元测试可以很轻松的实现:

静态类测试
静态方法测试
类的实例化测试
类的方法测试


三、什么是NUnit?

单元测试通过有两种办法:一个是微软在VS提供的单元测试,另一个是NUnit,前者可能更复杂也更全面(我只实践过一次,发现复杂是肯定有的),后者更简洁明了。

四、NUnit的下载以及安装

和普通的软件没有什么区别,略。
下载地址:http://www.nunit.org/

五、NUnit的启动

有两种方法,一个是单独启动(通过开始菜单快捷方式),这个时候需要指定已经编译好的dll路径;另一个是集成在VS中启动。

后者适合单独开发类库的时候使用,否则,在一个解决方案中既有类库,也有Web应用程序,还得反复切换“启动项目”。

单独启动的时候,指定好已经编译的DLL,按下"RUN"按钮,测试成功就会以绿色方式显示,失败就会显示红色,黄的部分则是通过Category指令跳过。

六、最简单使用


◆在项目(库类)中添加NUnit的引用。

NUnit.Framework 有针对 .net framwork 1.1和2.0两个版本,引用的时候需要注意

◆新建一个类

需要说明的是
i)NUnit通过创建这个类的实例,和运行这个实例的方法来完成测试。它和原始的、想测试的目标类,并不相同。假如写好一个类classA,想要对classA进行测试,那么现在新建的这个类就是Test_For_ClassA
ii)为了便于叙述,文中使用命名约定:“原始类”和“测试类”


◆并且使用Using指令把"NUnit.Framework;"命名空间包含进来

注意大小写,在添加引用的时候是全小写的,但是命名空间却不是。


◆在类名称前面加上指令:[TestFixtureSetUp],这个类必须是public


◆添加一个public void 方法,在这个方法前面加上 [Test]指令。后文管这种方法叫做“测试方法”


◆ Shift+F6或者F6生成


◆通过开始菜单快捷方式启动NUnit

◆通过“文件”菜单》“打开”,浏览并找到刚才生成的dll

◆按下Run按钮,NUnit显示绿色的进度条,表明测试成功。


以上就是NUnit的最简单使用,这里其实什么也没有测试,只是演练一下NUnit这个单元测试工具的使用。下面进一步介绍NUnit的使用方法。


七、验证设计的功能是否实现

7.1基本的测试

◆例如:类的实例化

新建一个测试类,添加一个“测试方法”,在这个方法中添加原始类的实例化代码,这时候可以使用各种构造函数,例如(这里使用范例代码不能运行):

class a  = new class();
class b = new class("abc");

使用NUnit测试。如果“测试方法”测试通过显示绿色的进度条,那就证明类的构造函数通过了测试。

◆例如:类的void方法

在“测试方法”中实例化原始类,然后再运运行相应的方法,例如(这里使用范例代码不能运行):

class a = new class();

a.go();

7.2详细测试:断言

以上的测试都是简单的验证原始类的某些代码运行过程中是否出现异常。对于复杂的类来说,这些远远不够,对于原始类的属性和有返回值的方法可以使用NUnit提供的Assert(断言)来测试。例如:

原始类:

public class tag
{
    public int Count;
    public tag(string html)
    {
        prase(html);
    }
    public void prase(string str)
    {
 Count = 0;
        //中间包含具体的解析代码,解析过程中统计标签的数量,略
        return ;
    }
}

测试类:

[TestFixture]
public class TestTag
{

    [Test]
    public void T1()
    {
        tag t = new tag("<i>abc</i>");
        Assert.AreEqual(1, t.Count);
    }
}


NUnit在测试的时候,就会比较t.Count是否和1相等,相等则通过测试,并且通过绿色表示出来。
需要说明的是,Assert.AreEqual只是针对值类型判断是否相等。其它的断言,请查看中文帮助:http://www.36sign.com/nunit/assertions.html

还有一些情况不能通过异常和或者断言来判断,那么有两个选择:
A 自己在测试类当中写私有的类业判断

B 在控制台中输出相关的信息。

 

 

八、SetUp/TearDown 指令

简单说,就是多个测试中包含的“重合”的代码,可以放到[SetUp]指令指导定的代码当中。每个[Test]方法都会在运行之前先运行[SetUp]运行结束再运行[TearDown]。


九、TestFixtureSetUp/TestFixtureTearDown 指令

这一组指令和前面的指令类似,但是又有些不同,主要的区别在于,这一组指令通常用来打开、释放某些共同的资源(例如数据库连接)


十、Category指令

跳过的测试


十一、Explicit指令

在7.1中是验证代码能否正常运行,如果不出现异常那么就通过测试了。在这里Explicit指令是故意验证,代码当中会不会出现某一具体的异常。

 

十二、输出

根据测试的需要,可以在NUnit测试的过程种在控制台输出测试类中指定的信息。

能过在NUnit工具的“Text Output”选项卡可以看到测试过程中输出的信息。

例如:

        [TestFixtureSetUp]
        public void Init()
        {
             Console.WriteLine("开始测试并且初始化。");
        }

 

PS:关于输出,我封装了一个类TestBase,除了输出文本以外,还可以输出DataTable的内容。具体请见下面的链接。

http://www.cnblogs.com/xpnew/admin/EditPosts.aspx?postid=1795867