当前位置:中国易下载软件教材中心文章中心编程语言Delphi → Delphi单元测试工具Dunit介绍

Delphi单元测试工具Dunit介绍

减小字体 增大字体 作者:佚名  来源:不详  发布时间:2007-8-21 0:57:51
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
喜欢这些内容嘛,请告诉你身边的朋友,易下载中心-QQ资源-itnetcn.com一起享受这份乐趣,本站内容来源互联网
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Delphi单元测试工具Dunit介绍K92海岸线网络安全资讯站
Dunit基本介绍K92海岸线网络安全资讯站
    Dunit是Xunit家族中的一员,用于Dephi的单元测试。是Extreme Programming测试实现Xtreme Testing的一种工具。Dunit是一个Free的测试工具,没有代码覆盖率功能。K92海岸线网络安全资讯站
Dunit的官方Web Site 是https://sourceforge.net/projects/dunit/。K92海岸线网络安全资讯站
使用Dunit应该先看看Dunit安装目录下的docREADME.html。本文也是参看Readme写的。K92海岸线网络安全资讯站
配置测试环境K92海岸线网络安全资讯站
在使用Dunit前应该将下载的Dunit解压。然后后将Dunit的路径加到菜单  Tools->Environment Options 里面的Library->Library Path中。K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
Dunit的主要文件K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
File  Description K92海岸线网络安全资讯站
TestFramework.pas  The framework itself. K92海岸线网络安全资讯站
TestExtensions.pas  Decorator classes that may be used to extend test cases. K92海岸线网络安全资讯站
GUITesting.pas  Classes for testing user interfaces (Forms and Dialogs). K92海岸线网络安全资讯站
TextTestRunner.pas  Routines to run tests in console mode. K92海岸线网络安全资讯站
GUITestRunner.pas  The graphical user interface to the framework.. K92海岸线网络安全资讯站
GUITestRunner.dfm  The GUITestRunner Form K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
Dunit基本实现方法(GUI方式)K92海岸线网络安全资讯站
 Dunit的基本实现思路是将被测试代码(单元)与测试代码(单元)分开。提供一个FrameWork及一个运行界面。 所有的测试单元都应继承TtestCase。K92海岸线网络安全资讯站
 运行GUI界面K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
   运行TestCaseK92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
 这里要注意的一点是SetUp方法和TearDown是每个测试方法运行时都被调用的,如果想要只运行一次Setup及TearDown,应该使用TtestSetup类,具体情况后面《Dunit附加功能》一节。K92海岸线网络安全资讯站
创建一个简单的例子K92海岸线网络安全资讯站
创建一个被测试的ProjectK92海岸线网络安全资讯站
创建一个名为BeTestProject的Project,将确省的Unit1保存为BeTestUnit.pas文件。把确省的TForm1改名为BeTestForm中增加一个Public的函数BeTestFunction,BeTestFunction代码如下:K92海岸线网络安全资讯站
function BeTestForm.BeTestFunction(i,j:integer):integer;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  Result:=i*j;K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
创建一个测试ProjectK92海岸线网络安全资讯站
创建新的ProjectK92海岸线网络安全资讯站
再创建一个Project,命名为TestProject。如果没有和BeTestProject放在同一目录,将BeTestProject的存放路径加到加到菜单  Tools->Environment Options 里面的Library->Library Path中。K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
编写TestCaseK92海岸线网络安全资讯站
删除确省的Unit1(Form1),创建一个的Unit,注意不是Form.K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
将创建的Unit保存为TestUnit,在interface中加入以下代码K92海岸线网络安全资讯站
usesK92海岸线网络安全资讯站
      TestFrameWork,BeTestUnit;K92海岸线网络安全资讯站
    TestFrameWork是每个TestCase都必须使用的,后面要使用的TtestCase等类的定义都在TestFrameWork中。BeTestUnit是将要被测试单元。K92海岸线网络安全资讯站
    K92海岸线网络安全资讯站
定义TestCase,测试类定义代码如下:K92海岸线网络安全资讯站
TTestCaseFirst = class(TTestCase)K92海岸线网络安全资讯站
 privateK92海岸线网络安全资讯站
   BeTestForm : TBeTestForm;  //要测试的类K92海岸线网络安全资讯站
 protectedK92海岸线网络安全资讯站
   procedure SetUp; override;  //初始化类K92海岸线网络安全资讯站
   procedure TearDown; override;  //清除数据K92海岸线网络安全资讯站
 publishedK92海岸线网络安全资讯站
   procedure TestFirst;      //第一个测试方法K92海岸线网络安全资讯站
   procedure TestSecond;     //第二个测试方法K92海岸线网络安全资讯站
 end;K92海岸线网络安全资讯站
在定义测试方法时候注意,Dunit是通过RTTI(RunTime Type Information)来寻找并自动注册测试方面的,具体实现是通过代码K92海岸线网络安全资讯站
TestFramework.RegisterTest(TTestCaseFirst.Suite);K92海岸线网络安全资讯站
这段代码将在后面提到,TtestCaseFirst.Suit在寻找的规则是:K92海岸线网络安全资讯站
1、  测试方法是没有参数的ProcedureK92海岸线网络安全资讯站
2、  测试方法被申明为PublishedK92海岸线网络安全资讯站
K92海岸线网络安全资讯站
SetUp,TearDown是在运行测试方法前、后运行的,所有一般把要测试的类的初始化及清除放在这两个过程中。K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
以下是实现的代码K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
procedure TTestCaseFirst.SetUp;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  BeTestForm := TBeTestForm.Create(Nil);K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
procedure TTestCaseFirst.TearDown;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  BeTestForm.Destroy;K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
procedure TTestCaseFirst.TestFirst;      //第一个测试方法K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  Check(BeTestForm.BeTestFunction(1,3) = 3,'First Test fail');K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
procedure TTestCaseFirst.TestSecond;     //第二个测试方法K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  Check(BeTestForm.BeTestFunction(1,3)=4,'Second Test fail');K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
//Register TestCaseK92海岸线网络安全资讯站
initializationK92海岸线网络安全资讯站
 TestFramework.RegisterTest(TTestCaseFirst.Suite);K92海岸线网络安全资讯站
end.K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
Check是TestCase类提供的一个方法。以下是TestCase的实现代码K92海岸线网络安全资讯站
procedure TTestCase.Check(condition :boolean; msg :string);begin    if (not condition) then        Fail(msg, CallerAddr);End;K92海岸线网络安全资讯站
如果Check没有通过的话,Dunit将报错。错误提示就在第二个参数中定义,其他有关类及方法的定义请看连机文档,文档放在K92海岸线网络安全资讯站
Dunit安装目录docAPIIDH_Library_DUnit_-_Xtreme_Unit_Testing_for_Delphi.htmK92海岸线网络安全资讯站
K92海岸线网络安全资讯站
Initialzation代码完成测试单元的注册。K92海岸线网络安全资讯站
修改Project主文件K92海岸线网络安全资讯站
 运行前的最后一步是修改Project主文件TestProject.dpr。先使用菜单Project->View Source打开TestProject.dpr.K92海岸线网络安全资讯站
 修改后的代码如下:K92海岸线网络安全资讯站
program TestProject;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
usesK92海岸线网络安全资讯站
  Forms,K92海岸线网络安全资讯站
  TestFrameWork,K92海岸线网络安全资讯站
  GUITestRunner,K92海岸线网络安全资讯站
  TestUnit in 'TestUnit.pas';K92海岸线网络安全资讯站
{$R *.res}K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  Application.Initialize;K92海岸线网络安全资讯站
  //Application.Run;K92海岸线网络安全资讯站
  GUITestRunner.RunRegisteredTests;K92海岸线网络安全资讯站
end.K92海岸线网络安全资讯站
上面的加粗代码是要增加和修改。K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
运行测试例子K92海岸线网络安全资讯站
  运行的测试结果如下:K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
使用TestSuiteK92海岸线网络安全资讯站
 使用TestSuite的目的是对TestCase进行分类管理,如果我们再增加一个TestCase 如下K92海岸线网络安全资讯站
TTestCaseSecond = class(TTestCase)K92海岸线网络安全资讯站
 publishedK92海岸线网络安全资讯站
   procedure TestThrid;K92海岸线网络安全资讯站
 end;K92海岸线网络安全资讯站
添加TestThrid实现代码后,在initialization代码处增加K92海岸线网络安全资讯站
     TestFramework.RegisterTest(TTestCaseSecond.Suite);K92海岸线网络安全资讯站
运行以后我们可以看到结果如下:K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
   如果我们将initialization处的代码改为如下:K92海岸线网络安全资讯站
initializationK92海岸线网络安全资讯站
 TestFramework.RegisterTest('Simple suite',TTestCaseFirst.Suite);K92海岸线网络安全资讯站
 TestFramework.RegisterTest('Simple suite',TTestCaseSecond.Suite);K92海岸线网络安全资讯站
end.K92海岸线网络安全资讯站
      那么运行的结果如下:K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
   这就是一个简单的TestSuite的使用,我们将TestCaseFirst和TestCaseSecond放到Simple suite中来进行管理。K92海岸线网络安全资讯站
  对于复杂的应用,我们也可以使用多层的TestSuite来进行管理。先增加一个函数:K92海岸线网络安全资讯站
function UnitTests: ITestSuite;K92海岸线网络安全资讯站
varK92海岸线网络安全资讯站
 ATestSuite,BTestSuite: TTestSuite;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  BTestSuite := TTestSuite.Create('Some trivial tests',K92海岸线网络安全资讯站
                         [K92海岸线网络安全资讯站
                          TTestCaseFirst.Suite,K92海岸线网络安全资讯站
                          TTestCaseSecond.SuiteK92海岸线网络安全资讯站
                          ]);K92海岸线网络安全资讯站
                          K92海岸线网络安全资讯站
 ATestSuite := TTestSuite.create('Some other  trivial tests');K92海岸线网络安全资讯站
 ATestSuite.addTest(TTestCaseFirst.Suite);K92海岸线网络安全资讯站
 ATestSuite.addTest(BTestSuite);K92海岸线网络安全资讯站
 Result := ATestSuite;K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
我们先使用TtestSuite.Create创建一个一层的TestSuite, BtestSuite.然后在将BtestSuite加入到AtestSuite。K92海岸线网络安全资讯站
最后将initialization处的代码改为如下:K92海岸线网络安全资讯站
initializationK92海岸线网络安全资讯站
TestFramework.RegisterTest('Simple Test', UnitTests);K92海岸线网络安全资讯站
end.K92海岸线网络安全资讯站
注册AtestSuite就可以了,以下是运行结果:K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
控制台(console)模式K92海岸线网络安全资讯站
 如果想在Dos方式下直接运行TestCase,只要修改Dpr文件即可。K92海岸线网络安全资讯站
{$APPTYPE CONSOLE}K92海岸线网络安全资讯站
program TestProject;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
usesK92海岸线网络安全资讯站
Forms,K92海岸线网络安全资讯站
TestFrameWork,K92海岸线网络安全资讯站
GUITestRunner,K92海岸线网络安全资讯站
TextTestRunner,K92海岸线网络安全资讯站
TestUnit in 'TestUnit.pas';K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
{$R *.res}K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
Application.Initialize;K92海岸线网络安全资讯站
//  GUITestRunner.RunRegisteredTests;K92海岸线网络安全资讯站
TextTestRunner.RunRegisteredTests;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
end.K92海岸线网络安全资讯站
先定义应用程序类型,加入{$APPTYPE CONSOLE},然后使用TextTestRunner替代GUITestRunner就可以了。K92海岸线网络安全资讯站
   确省情况下,测试程序将把运行所有的TestCase后给出报告,如果想在达到一定错误就停止运行,可以使用K92海岸线网络安全资讯站
 TextTestRunner.RunRegisteredTests(rxbHaltOnFailures);K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
Dunit附加功能K92海岸线网络安全资讯站
 使用Dunit的附加功能要先在Uses中加入:K92海岸线网络安全资讯站
    TestExtensions, // needed for TrepeatedTestK92海岸线网络安全资讯站
   Dunit的主要附加功能有:K92海岸线网络安全资讯站
1、  重复运行某一TestCaseK92海岸线网络安全资讯站
2、  使用TtestSetup类初试化K92海岸线网络安全资讯站
Dunit的TestExtensions还提到了两个类TactiveTest、TexceptionTestCase来实现:K92海岸线网络安全资讯站
3、  在独立线程中运行测试K92海岸线网络安全资讯站
4、  Exception测试K92海岸线网络安全资讯站
   但在Dunit中的最新源码,这两个类只是简单继承了TtestDecorator而没有做任何的修改,在Dunit的Readme中也没有提到这两个类的用法。因此应该属于还没有实现的类。K92海岸线网络安全资讯站
重复运行TestCaseK92海岸线网络安全资讯站
 要重复运行某一TestCase,只需要将initialization里面的注册代码K92海岸线网络安全资讯站
TestFramework.RegisterTest(TTestCaseFirst.Suite);K92海岸线网络安全资讯站
   简单替换为:K92海岸线网络安全资讯站
TestFramework.RegisterTest(TRepeatedTest.Create(TTestCaseFirst.Suite, 2));K92海岸线网络安全资讯站
   就可以,TRepeatedTest.Create的第一个参数为要重复的TestSuite/TestCase,第二个参数代表次数。运行后的结果如下:K92海岸线网络安全资讯站
  K92海岸线网络安全资讯站
 请注意,TestCaseFirst前面多了“2x”。K92海岸线网络安全资讯站
使用TtestSetup类K92海岸线网络安全资讯站
 使用TtestSetup类的作用就是在运行所有的测试方法前后只运行一次Setup几TearDown。可以用于创建数据库连接等等。K92海岸线网络安全资讯站
 要使用TtestSetup,我们先在《创建一个简单的例子》一节中创建的TestUnit中声明一个新的类(先在Uses中加入Dialogs,TestExtensions)K92海岸线网络安全资讯站
TestSetupTest = class (TTestSetup)K92海岸线网络安全资讯站
   protectedK92海岸线网络安全资讯站
     procedure SetUp; override;  //初始化类K92海岸线网络安全资讯站
     procedure TearDown; override;  //清除数据K92海岸线网络安全资讯站
  end;K92海岸线网络安全资讯站
  加入实现代码K92海岸线网络安全资讯站
procedure TestSetupTest.SetUp;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  ShowMessage('TestSetupTest Setup');K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
procedure TestSetupTest.TearDown;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  ShowMessage('TestSetupTest TearDown');K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
  修改TtestCaseFirst.SetUp及TTestCaseFirst.TearDown,加入下面加粗语句。K92海岸线网络安全资讯站
procedure TTestCaseFirst.SetUp;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  BeTestForm := TBeTestForm.Create(Nil);K92海岸线网络安全资讯站
  ShowMessage('TTestCaseFirst Setup');K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
procedure TTestCaseFirst.TearDown;K92海岸线网络安全资讯站
beginK92海岸线网络安全资讯站
  BeTestForm.Destroy;K92海岸线网络安全资讯站
  ShowMessage('TTestCaseFirst TearDown');K92海岸线网络安全资讯站
end;K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
最后将initialization改为K92海岸线网络安全资讯站
initializationK92海岸线网络安全资讯站
//TestFramework.RegisterTest(TTestCaseFirst.Suite);K92海岸线网络安全资讯站
 TestFramework.RegisterTest(TestSetupTest.Create(TTestCaseFirst.Suite));K92海岸线网络安全资讯站
end.K92海岸线网络安全资讯站
运行之后的结果如下:K92海岸线网络安全资讯站
 K92海岸线网络安全资讯站
注意TtestCaseFirst前面加了”[d]”。运行一次测试就可以清楚看到TestSetupTest类中Setup和TearDown只运行了一次,而TtestCaseFirst中的Setup和TearDown运行了两次K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
K92海岸线网络安全资讯站
测试ExceptionK92海岸线网络安全资讯站
   虽然TexceptionTestCase没有实现,但是Dunit在源码附加examplestestexception目录中有一个如何测试Exception的例子。K92海岸线网络安全资讯站
   主要的实现在procedure TTestMyObject.CheckException和procedure TTestMyObjectOverrideRunTest.RunTest中。具体的实现可以看代码。  

K92海岸线网络安全资讯站