转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
NUnit学习笔记之Delphi 2005篇         ★★★★

NUnit学习笔记之Delphi 2005篇

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2614 更新时间:2009/4/23 18:26:16

一、简介
  NUnit是一款堪与JUnit齐名的开源的回归测试框架,供.net开发人员做单元测试之用,可以从
www.nunit.org网站上免费获得,最新版本是2.2.0。在下载时,会看到NUnit 2.2.0版有NUnit-2.2.0.msi、NUnit-2.2.0-mono.zip、NUnit-2.2.0-src.zip等三个文件的下载连接,这三个连接前边有说明,分别是win、mono以及src,这说明前两个文件分别是供.net平台和Mono平台使用的,而最后一个是源码。这里需要的是NUnit-2.2.0.msi,而且该安装包中已含有源码。下载NUnit-2.2.0.msi后,双击该文件,然后按提示进行安装,这样系统中就具备NUnit环境了。
二、配置类库
  这次我选择的IDE是Borland的Delphi 2005(以下简称delphi)。打开后点击菜单"File"->"New"->"Other",打开"New Items"对话框:

在该对话框中,选择"C# Projects"或"Delphi for .NET Projects",虽然两者在操作上会稍有差异,但其实相差并不很大。然后选择其中的"Console Application",点击"OK"按钮。如果选择的是C#,那么会弹出一个"New Application"对话框:

请在其中设置项目名称和保存位置,我的项目名称为NUnitCS,位置为本机的G:\MDZPCK\Borland\MySY\NUnitCS,设置好后,点击"OK"按钮。如果选择的是Delphi,那么跟以前版本的delphi一样,项目会直接被创建,而不弹出任何对话框。此时请按下快捷键Ctrl + S,打开Save对话框,对项目进行保存,这是一个良好的习惯。我将自己的项目文件名称设为NUnitOP.bdsproj(因为Delphi使用的是Object Pascal语言嘛),该文件名就是项目名称,保存路径为G:\MDZPCK\Borland\MySY\NUnitOP。
  项目创建后,点击菜单"Project"->"Add Reference",打开"Add Reference"对话框:

在".NET Assembles"选项卡中找到组件名称为nunit.framework的一项,双击添加到"New References"中,别的组件不用管,然后点击"OK"按钮,此时在项目中就可以使用NUnit类库了。
三、编写用于测试的类
  用于测试的类很简单,名为Book,只有id和name两个属性,这两个属性将分别用于两个用例当中。
  下面开始编写,请点击菜单"File"->"New"->"Other",打开"New Items"对话框:

在该对话框中选择"C# Projects"或"Delphi for .NET Projects"下的"New Files",然后选中"Class",点击"OK"按钮。此时Class文件虽然在工程中已生成,但尚未保存在硬盘上,所以请先按下快捷键Ctrl + S,我将文件命名为Book.cs和Book.pas。这里插一句,我感觉delphi在文件保存这方面做的很差劲,如果没有经常保存文件的习惯,搞不好真的会出问题。
  类创建后,需要修改代码,下边是C#代码:
  using System;
  
  
namespace NUnitCS
  {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Book
    {
      private string pid = null;
      private string pname = null;
      
      public string id
      {
        get
        {
          return pid;
        }
        
        set
        {
          pid = value;
        }
      }
      
      public string name
      {
        get
        {
          return pname;
        }
        
        set
        {
          pname = value;
        }
      }
    }
  }
没什么可说的吧?下边是Delphi代码:
  unit Book;
  
  interface
  
  type
    TBook = class
    private
      pid : string;
      pname : string;
      
      
function GetId(): string;
      procedure SetId(value: string);
      
      
function GetName(): string;
      procedure SetName(value: string);
    public
      constructor Create;
      property id : string read GetId write SetId;
      property name : string read GetName write SetName;
  end;
  
  implementation
  
  constructor TBook.Create();
  begin
    inherited Create;
  end;
  
  function TBook.GetId(): string;
  begin
    GetId := pid;
  end;
  procedure TBook.SetId(value: string);
  begin
    pid := value;
  end;
  
  function TBook.GetName(): string;
  begin
    GetName := pname;
  end;
  procedure TBook.SetName(value: string);
  begin
    pname := value;
  end;
  
  end.
可以看到,和以前版本的Delphi代码相差不多,都是固定格式。这里可能引起费解的有两点:一个是属性,在Delphi中定义属性必须先为这个属性声明一个作为get访问器的函数和一个作为set访问器的过程,并实现之,然后使用property语句来定义属性,并将get访问器和set访问器与这两个函数和过程相关联。注意,这里建议将函数和过程声明在private部分,这样在调用时,就会只看到属性,而不会看到这两个函数和过程了。另一个费解的问题是,Book是类型还是命名空间。其实Book是命名空间,TBook才是类型,这种情况与Delphi文件的格式有关。在Delphi中,每建立一个文件都会相应建立一个命名空间,如果想让多个类在一个命名空间下,就需要把这几个类建在一个文件中,但这不符合Delphi的编码风格。最后,别忘了定义一个构造函数,Delphi是不会默认提供的。
  至此,用于测试的类编写完成了。
四、编写测试用例
  这里只用了一个类进行测试,名为BookTest,以前这样的类可能需要继承NUnit.Framework.TestCase类,但现在只需要对该类使用TestFixture属性进行标识即可,而无须继承了。BookTest类包含两个用例,分别对应该类的testId和testName方法,即每个方法实现了一个测试用例。注意,在NUnit中,这些用来实现测试用例的方法有两种手段进行标识:一个是以testXXX的格式来命名,一个是使用Test属性进行标识。此外,BookTest还有Init和Dispose这两个方法,并分别使用TestFixtureSetUp和TestFixtureTearDown属性来进行标识,前者在每个测试方法开始之前执行,多用来做初始化;后者在每个测试方法完成之后执行,多用来清理资源。注意,这两个方法的名称并没有什么限制,但必须用TestFixtureSetUp和TestFixtureTearDown属性进行标识。下面开始编写BookTest。
  点击菜单"File"->"New"->"Other",打开"New Items"对话框,在该对话框中选择"C# Projects"或"Delphi for .NET Projects"下的"New Files",然后选中"Class",点击"OK"按钮。此时请按下快捷键Ctrl + S,保存文件,我将文件命名为BookTest.cs和BookTest.pas。下面修改代码,C#代码如下:
  using System;
  using NUnit.Framework;
  
  
namespace NUnitCS
  {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    [TestFixture]
    public class BookTest
    {
      Book book = null;
      
      [TestFixtureSetUp]
      public void Init()
      {
        Console.WriteLine("测试开始!");
        book = new Book();
        Console.WriteLine("book对象被初始化!");
      }
      
      [Test]
      public void testId()
      {
        book.id = "001"; //设置id属性的值为001
        //使用Assert查看id属性的值是否为001
        Assert.AreEqual("001", book.id);
        Console.WriteLine("id属性被测试!");
      }
      
      [Test]
      public void testName()
      {
        book.name = "ASP"; //设置name属性的值为ASP
        //使用Assert查看name属性的值是否为JSP,这是个必然出现错误的测试
        Assert.AreEqual("JSP", book.name);
        Console.WriteLine("name属性被测试!");
      }
      
      
[TestFixtureTearDown]
      public void Dispose()
      {
        Console.WriteLine("book对象将被清理!");
        book = null;
        Console.WriteLine("测试结束!");
      }
    }
  }
这里Init和Dispose方法没什么好说的,就是执行了对book对象的初始化和清理,不过testId和testName需要说明一下。前者是在对book的id属性进行测试,首先赋值为"001",然后使用Assert的AreEqual方法查看id属性中存放的值是否是期待的值,由于我的期待值也是"001",所以执行后这个用例应该是成功的;后者则是对book的name属性进行测试,也是首先赋值为"ASP",然后使用Assert的AreEqual方法查看其值是否是期待的,由于我特意将期待值设定为根本不可能的"JSP",因此这个用例执行后会出现一个错误。但请注意,由于我是特意要让测试出现错误,所以将期待值设定成了不可能的值,如果你是测试人员,请千万不要这么做,否则如果别的地方导致了错误,很容易给自己造成不必要的麻烦。
  下面简单介绍一下上边用到的静态类NUnit.Framework.Assert。该类主要包含6个方法:
  1.AreEqual()方法,用来查看对象中存的值是否是期待的值,与字符串比较中使用的Equals()方法类似;
  2.IsFalse()和IsTrue()方法,用来查看变量是是否为false或true,如果IsFalse()查看的变量的值是false则测试成功,如果是true则失败,IsTrue()与之相反。
  3.AreSame()方法,用来比较两个对象的引用是否相等,类似于通过"Is"或"=="比较两个对象;
  4.IsNull()和IsNotNull()方法,用来查看对象是否为空和不为空。
  下面再看一下Delphi代码:
  unit BookTest;
  
  interface
  
  uses
    Book, NUnit.Framework;
  
  
type
    [TestFixture]
    TBookTest = class
      book : TBook;
    private
      { Private Declarations }
    public
      constructor Create;
      [TestFixtureSetUp]
      procedure Init();
      [Test]
      procedure testId();
      [Test]
      procedure testName();
      [TestFixtureTearDown]
      procedure Dispose();
  end;
  
  implementation
  
  
constructor TBookTest.Create();
  begin
    inherited Create;
  end;

  procedure TBookTest.Init();
  begin
    Console.WriteLine(''''测试开始!'''');
    book := TBook.Create();
    Console.WriteLine(''''book对象被初始化!'''');
  end;
  
  procedure TBookTest.testId();
  begin
    book.id := ''''001''''; //设置id属性的值为001
    //使用Assert查看id属性的值是否为001
    Assert.AreEqual(''''001'''', book.id);
    Console.WriteLine(''''id属性被测试!'''');
  end;
  
  procedure TBookTest.testName();
  begin
    book.name := ''''ASP''''; //设置name属性的值为ASP
    //使用Assert查看name属性的值是否为JSP,这是个必然出现错误的测试
    Assert.AreEqual(''''JSP'''', book.name);
    Console.WriteLine(''''name属性被测试!'''');
  end;
  
  procedure TBookTest.Dispose();
  begin
    Console.WriteLine(''''book对象将被清理!'''');
    book := nil;
    Console.WriteLine(''''测试结束!'''');
  end;

  end.
也是固定格式,没什么好说的吧?改好后,点击菜单"Run"->"Run"或按F9键运行程序。等等,main函数里头好象一句代码也没写过呢吧?没错,一句也没写,但如果你用的是C#照做就可以了,如果用的是Delphi,那么请把NUnitOP.bdsproj文件打开。我们需要对该文件进行修改,否则程序虽能生成,但却无法用于测试。什么,没有这个文件?按Ctrl + F12,在打开的"View Unit"对话框中选择NUnitOP一项,然后点击"OK"。在文件中修改代码如下:
  program NUnitOP;
  
  {$APPTYPE CONSOLE}
  
  {%DelphiDotNetAssemblyCompiler ''''e:\program files\nunit 2.2\bin\nunit.framework.dll''''}
  {%DelphiDotNetAssemblyCompiler ''''$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.dll''''}
  {%DelphiDotNetAssemblyCompiler ''''$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.Data.dll''''}
  {%DelphiDotNetAssemblyCompiler ''''$(SystemRoot)\microsoft.net\framework\v1.1.4322\System.XML.dll''''}

  uses
    SysUtils,
    Book in ''''Book.pas'''',
    BookTest in ''''BookTest.pas'''';
    
  var
    bt : TBookTest;
  begin
    bt := TBookTest.Create();
  end.
修改好后,按F9键运行程序。在看到黑屏一闪之后,编码工作完成。
五、运行NUnit
  编码完成后,就可以使用NUnit测试了。NUnit有两种界面,一种是命令行的,一种是可视化的,我使用的就是后者。点击"开始"菜单->"所有程序"->"NUnit 2.2"->"Nunit-Gui",打开NUnit的可视化界面:

[1] [2]  下一页


[系统软件]InstallShield Express for delphi制作安装程序定…  [常用软件]InstallShield Express制作Delphi数据库安装程序
[Delphi程序]为什么选择Delphi.Net ?  [Delphi程序]《关于VisiBroker For Delphi的使用》(4)
[Delphi程序]Delphi 程序员代码编写标准指南  [Delphi程序]转贴:Conversion to Delphi 6: Missing unit Pro…
[Delphi程序]Borland Delphi 9 的新特性  [Delphi程序]Delphi 键盘码表
[Delphi程序]Chuck Jazdzewski的离开意味着Delphi的终结吗?  [Delphi程序]Delphi Access violations 问题的解决之道
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台