定义TestCase,测试类定义代码如下:
TTestCaseFirst = class(TTestCase)
private
BeTestForm : TBeTestForm; //要测试的类
protected
procedure SetUp; override; //初始化类
procedure TearDown; override; //清除数据
published
procedure TestFirst; //第一个测试方法
procedure TestSecond; //第二个测试方法
end;
在定义测试方法时候注意,Dunit是通过RTTI(RunTime Type Information)来寻找并自动注册测试方面的,具体实现是通过代码
TestFramework.RegisterTest(TTestCaseFirst.Suite);
这段代码将在后面提到,TtestCaseFirst.Suit在寻找的规则是:
1、测试方法是没有参数的Procedure
2、测试方法被申明为Published
SetUp,TearDown是在运行测试方法前、后运行的,所有一般把要测试的类的初始化及清除放在这两个过程中。
以下是实现的代码:
procedure TTestCaseFirst.SetUp;
begin
BeTestForm := TBeTestForm.Create(Nil);
end;
procedure TTestCaseFirst.TearDown;
begin
BeTestForm.Destroy;
end;
procedure TTestCaseFirst.TestFirst; //第一个测试方法
begin
Check(BeTestForm.BeTestFunction(1,3) = 3,'First Test fail');
end;
procedure TTestCaseFirst.TestSecond; //第二个测试方法
begin
Check(BeTestForm.BeTestFunction(1,3)=4,'Second Test fail');
end;
//Register TestCase
initialization
TestFramework.RegisterTest(TTestCaseFirst.Suite);
end.
Check是TestCase类提供的一个方法。以下是TestCase的实现代码:
procedure TTestCase.Check(condition :boolean; msg :string);
begin
if (not condition) then
Fail(msg, CallerAddr);
End;
如果Check没有通过的话,Dunit将报错。错误提示在第二个参数中定义,其他有关类及方法的定义请看连机文档,文档放在
Dunit安装目录docAPIIDH_Library_DUnit_-_Xtreme_Unit_Testing_for_Delphi.htm
Initialzation代码完成测试单元的注册。
修改Project主文件
运行前的后一步是修改Project主文件TestProject.dpr。先使用菜单Project->View Source打开TestProject.dpr.
修改后的代码如下:
program TestProject;
uses
Forms,
TestFrameWork,
GUITestRunner,
TestUnit in 'TestUnit.pas';
{$R *.res}
begin
Application.Initialize;
//Application.Run;
GUITestRunner.RunRegisteredTests;
end.
上面的加粗代码是要增加和修改。
运行测试例子
运行的测试结果如下:
使用TestSuite
使用TestSuite的目的是对TestCase进行分类管理,如果我们再增加一个TestCase 如下
TTestCaseSecond = class(TTestCase)
published
procedure TestThrid;
end;
添加TestThrid实现代码后,在initialization代码处增加
TestFramework.RegisterTest(TTestCaseSecond.Suite);
运行以后我们可以看到结果如下:
如果我们将initialization处的代码改为如下:
initialization
TestFramework.RegisterTest('Simple suite',TTestCaseFirst.Suite);
TestFramework.RegisterTest('Simple suite',TTestCaseSecond.Suite);
end.