SOPTestV10DUNIT使用Word格式文档下载.docx
《SOPTestV10DUNIT使用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《SOPTestV10DUNIT使用Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
然后后将Dunit的路径加到菜单Tools->
EnvironmentOptions里面的Library->
LibraryPath中。
Dunit的主要文件
File
Description
TestFramework.pas
Theframeworkitself.
TestExtensions.pas
Decoratorclassesthatmaybeusedtoextendtestcases.
GUITesting.pas
Classesfortestinguserinterfaces(FormsandDialogs).
TextTestRunner.pas
Routinestoruntestsinconsolemode.
GUITestRunner.pas
Thegraphicaluserinterfacetotheframework.
GUITestRunner.dfm
TheGUITestRunnerForm
Dunit基本实现方法(GUI方式)
Dunit的基本实现思路是将被测试代码(单元)与测试代码(单元)分开。
提供一个FrameWork及一个运行界面。
所有的测试单元都应继承TTestCase。
图表1运行GUI界面
这里要注意的一点是SetUp方法和TearDown是每个测试方法运行时都被调用的,如果想要只运行一次Setup及TearDown,应该使用TTestSetup类,具体情况见后面《Dunit附加功能》一节。
创建一个简单的例子
1.创建一个被测试的Project。
创建一个名为BeTestProject的Project,将缺省的Unit1保存为BeTestUnit.pas文件。
把缺省的TForm1改名为BeTestForm中增加一个Public的函数BeTestFunction,BeTestFunction代码如下:
functionBeTestForm.BeTestFunction(i,j:
integer):
integer;
begin
Result:
=i*j;
end;
2.创建一个测试Project
再创建一个Project,命名为TestProject。
如果没有和BeTestProject放在同一目录,将BeTestProject的存放路径加到加到菜单Tools->
(是否可以加到测试工程的环境变量中)
3.编写TestCase
删除缺省的Unit1(Form1),创建一个的Unit,注意不是Form.
将创建的Unit保存为TestUnit,在interface中加入以下代码
uses
TestFrameWork,BeTestUnit;
TestFrameWork是每个TestCase都必须使用的,后面要使用的TTestCase等类的定义都在TestFrameWork中。
BeTestUnit是将要被测试单元。
定义TestCase,测试类定义代码如下:
TTestCaseFirst=class(TTestCase)
private
BeTestForm:
TBeTestForm;
//要测试的类
protected
procedureSetUp;
override;
//初始化类
procedureTearDown;
//清除数据
published
procedureTestFirst;
//第一个测试方法
procedureTestSecond;
//第二个测试方法
在定义测试方法时候注意,Dunit是通过RTTI(RunTimeTypeInformation)来寻找并自动注册测试方面的,具体实现是通过代码
TestFramework.RegisterTest(TTestCaseFirst.Suite);
这段代码将在后面提到,TTestCaseFirst.Suit在寻找的规则是:
1、测试方法是没有参数的Procedure
2、测试方法被申明为Published
SetUp,TearDown是在运行测试方法前、后运行的,所有一般把要测试的类的初始化及清除放在这两个过程中。
以下是实现的代码:
procedureTTestCaseFirst.SetUp;
=TBeTestForm.Create(Nil);
procedureTTestCaseFirst.TearDown;
BeTestForm.Free;
procedureTTestCaseFirst.TestFirst;
Check(BeTestForm.BeTestFunction(1,3)=3,'
FirstTestfail'
);
procedureTTestCaseFirst.TestSecond;
Check(BeTestForm.BeTestFunction(1,3)=4,'
SecondTestfail'
//RegisterTestCase
initialization
end.
Check是TestCase类提供的一个方法。
以下是TestCase的实现代码:
procedureTTestCase.Check(condition:
boolean;
msg:
string);
if(notcondition)then
Fail(msg,CallerAddr);
End;
如果Check没有通过的话,Dunit将报错。
错误提示就在第二个参数中定义,其他有关类及方法的定义请看连机文档,文档放在Dunit安装目录:
docAPIIDH_Library_DUnit_-_Xtreme_Unit_Testing_for_Delphi.htm
Initialzation代码完成测试单元的注册。
4.修改Project主文件
运行前的最后一步是修改Project主文件TestProject.dpr。
先使用菜单Project->
ViewSource打开TestProject.dpr.
修改后的代码如下:
programTestProject;
Forms,
TestFrameWork,
GUITestRunner,
TestUnitin'
TestUnit.pas'
;
{$R*.res}
Application.Initialize;
//Application.Run;
GUITestRunner.RunRegisteredTests;
end.
5.运行测试例子
运行的测试结果如下:
6.使用TestSuite
使用TestSuite的目的是对TestCase进行分类管理,如果我们再增加一个TestCase如下
TTestCaseSecond=class(TTestCase)
procedureTestThrid;
添加TestThrid实现代码后,在initialization代码处增加
TestFramework.RegisterTest(TTestCaseSecond.Suite);
运行以后我们可以看到结果如下:
如果我们将initialization处的代码改为如下:
TestFramework.RegisterTest('
Simplesuite'
,TTestCaseFirst.Suite);
,TTestCaseSecond.Suite);
那么运行的结果如下:
这就是一个简单的TestSuite的使用,我们将TestCaseFirst和TestCaseSecond放到Simplesuite中来进行管理。
对于复杂的应用,我们也可以使用多层的TestSuite来进行管理。
先增加一个函数:
functionUnitTests:
ITestSuite;
var
ATestSuite,BTestSuite:
TTestSuite;
BTestSuite:
=TTestSuite.Create('
Sometrivialtests'
,
[
TTestCaseFirst.Suite,
TTestCaseSecond.Suite
]);
ATestSuite:
=TTestSuite.create('
Someothertrivialtests'
ATestSuite.addTest(TTestCaseFirst.Suite);
ATestSuite.addTest(BTestSuite);
Result:
=ATestSuite;
我们先使用TTestSuite.Create创建一个一层的TestSuite,BtestSuite.然后在将BtestSuite加入到AtestSuite。
最后将initialization处的代码改为如下:
SimpleTest'
,UnitTests);
注册AtestSuite就可以了,以下是运行结果:
控制台(console)模式
如果想在Dos方式下直接运行TestCase,只要修改Dpr文件即可。
{$APPTYPECONSOLE}
TextTestRunner,
//GUITestRunner.RunRegisteredTests;
TextTestRunner.RunRegisteredTests;
先定义应用程序类型,加入{$APPTYPECONSOLE},然后使用TextTestRunner替代GUITestRunner就可以了。
缺省情况下,测试程序将把运行所有的TestCase后给出报告,如果想在达到一定错误就停止运行,可以使用
TextTestRunner.RunRegisteredTests(rxbHaltOnFailures);
Dunit附加功能
使用Dunit的附加功能要先在Uses中加入:
TestExtensions,//neededforTrepeatedTest
Dunit的主要附加功能有:
1、重复运行某一TestCase
2、使用TTestSetup类初试化
Dunit的TestExtensions还提到了两个类TactiveTest、TexceptionTestCase来实现:
3、在独立线程中运行测试
4、Exception测试
但在Dunit中的最新源码,这两个类只是简单继承了TTestDecorator而没有做任何的修改,在Dunit的Readme中也没有提到这两个类的用法。
因此应该属于还没有实现的类。
重复运行TestCase
要重复运行某一TestCase,只需要将initialization里面的注册代码
简单替换为:
TestFramework.RegisterTest(TRepeatedTest.Create(TTestCaseFirst.Suite,2));
就可以,TRepeatedTest.Create的第一个参数为要重复的TestSuite/TestCase,第二个参数代表次数。
运行后的结果如下:
请注意,TestCaseFirst前面多了“2x”。
使用TTestSetup类
使用TTestSetup类的作用就是在运行所有的测试方法前后只运行一次Setup和TearDown。
可以用于创建数据库连接等等。
要使用TTestSetup,我们先在《创建一个简单的例子》一节中创建的TestUnit中声明一个新的类(先在Uses中加入Dialogs,TestExtensions)
TestSetupTest=class(TTestSetup)
加入实现代码
procedureTestSetupTest.SetUp;
ShowMessage('
TestSetupTestSetup'
procedureTestSetupTest.TearDown;
TestSetupTestTearDown'
修改TTestCaseFirst.SetUp及TTestCaseFirst.TearDown,加入下面加粗语句。
TTestCaseFirstSetup'
BeTestForm.Destroy;
TTestCaseFirstTearDown'
最后将initialization改为
//TestFramework.RegisterTest(TTestCaseFirst.Suite);
TestFramework.RegisterTest(TestSetupTest.Create(TTestCaseFirst.Suite));
运行之后的结果如下:
注意TTestCaseFirst前面加了”[d]”。
运行一次测试就可以清楚看到TestSetupTest类中Setup和TearDown只运行了一次,而TTestCaseFirst中的Setup和TearDown运行了两次
测试Exception
虽然TexceptionTestCase没有实现,但是Dunit在源码附加examplesestexception目录中有一个如何测试Exception的例子。
主要的实现在procedureTTestMyObject.CheckException和procedureTTestMyObjectOverrideRunTest.RunTest中。
具体的实现可以看代码。
附件
Dunit包文件
提示:
双击上面的链接,如果无法打开很可能是dunit-7.2.0.zip与本文档不在同一个目录下。