《重构》 — Delphi示例:影片出租店程序(2、单元测试)
2011-04-09 08:28
429 查看
说明:
重构的第一个步骤永远相同:为即将修改的代码建立一组可靠的测试环境。
注意:
(1)、使用"CnPack"自带的DUNIT单元测试
(2)、使用DUNIT单元测试工具实现,其中
* TestFrameWork是每个TestCase都必须使用的,后面要使用的TTestCase等类的定义都在TestFrameWork中。
* Dunit是通过RTTI(RunTime Type Information)来寻找并自动注册TestCase,具体实现是通过代码"TestFramework.RegisterTest(TTest.Suite); "
* 测试方法是没有参数的Procedure ,而且必须被申明为Published。
* Check方法用于检测测试结果,如果没有通过的话,Dunit将报错,错误提示在Check方法的第二个参数中定义。
代码:
//{$DEFINE DUNIT_CONSOLE_MODE}
program Project2;
uses
SysUtils,
TestFramework,
TestExtensions,
GUITestRunner,
TextTestRunner,
uMovieTest in 'uMovieTest.pas';
{$IFDEF DUNIT_CONSOLE_MODE}
{$APPTYPE CONSOLE}
{$ELSE}
{$R *.RES}
{$ENDIF}
begin
{$IFDEF DUNIT_CONSOLE_MODE}
if not FindCmdLineSwitch('Graphic', ['-', '/'],True) then
TextTestRunner.RunRegisteredTests(rxbHaltOnFailures)
else
{$ENDIF}
GUITestRunner.RunRegisteredTests;
end.
unit uMovieTest;
interface
uses
Windows,SysUtils,Classes,TestFramework,TestExtensions;
type
TTest = class(TTestCase)
published
procedure Test;
end;
implementation
uses uMovie;
procedure TTest.Test;
const
CNT_Text = 'Rental Record for ZhangSan'#$D#$A
+ 'aaa 2'#$D#$A
+ 'bbb 3'#$D#$A
+ 'ccc 1.5'#$D#$A
+ 'Amount owed is 6.5'#$D#$A
+ 'You earned 4 frequent renter points';
var
ACustomer: TCustomer;
AMovie1,AMovie2,AMovie3: TMovie;
AText: string;
begin
AMovie1 := TMovie.Create('aaa',REGULAR);
AMovie2 := TMovie.Create('bbb',NEW_RELEASE);
AMovie3 := TMovie.Create('ccc',CHILDRENS);
try
ACustomer := TCustomer.Create('ZhangSan');
try
with ACustomer do
begin
AddRental(TRental.Create(AMovie1,1));
AddRental(TRental.Create(AMovie2,2));
AddRental(TRental.Create(AMovie3,3));
end;
AText := ACustomer.Statement;
Check(AText = CNT_Text, 'Test fail');
finally
ACustomer.Free;
end;
finally
AMovie1.Free;
AMovie2.Free;
AMovie3.Free;
end;
end;
initialization
TestFramework.RegisterTest(TTest.Suite);
end.
重构的第一个步骤永远相同:为即将修改的代码建立一组可靠的测试环境。
注意:
(1)、使用"CnPack"自带的DUNIT单元测试
(2)、使用DUNIT单元测试工具实现,其中
* TestFrameWork是每个TestCase都必须使用的,后面要使用的TTestCase等类的定义都在TestFrameWork中。
* Dunit是通过RTTI(RunTime Type Information)来寻找并自动注册TestCase,具体实现是通过代码"TestFramework.RegisterTest(TTest.Suite); "
* 测试方法是没有参数的Procedure ,而且必须被申明为Published。
* Check方法用于检测测试结果,如果没有通过的话,Dunit将报错,错误提示在Check方法的第二个参数中定义。
代码:
//{$DEFINE DUNIT_CONSOLE_MODE}
program Project2;
uses
SysUtils,
TestFramework,
TestExtensions,
GUITestRunner,
TextTestRunner,
uMovieTest in 'uMovieTest.pas';
{$IFDEF DUNIT_CONSOLE_MODE}
{$APPTYPE CONSOLE}
{$ELSE}
{$R *.RES}
{$ENDIF}
begin
{$IFDEF DUNIT_CONSOLE_MODE}
if not FindCmdLineSwitch('Graphic', ['-', '/'],True) then
TextTestRunner.RunRegisteredTests(rxbHaltOnFailures)
else
{$ENDIF}
GUITestRunner.RunRegisteredTests;
end.
unit uMovieTest;
interface
uses
Windows,SysUtils,Classes,TestFramework,TestExtensions;
type
TTest = class(TTestCase)
published
procedure Test;
end;
implementation
uses uMovie;
procedure TTest.Test;
const
CNT_Text = 'Rental Record for ZhangSan'#$D#$A
+ 'aaa 2'#$D#$A
+ 'bbb 3'#$D#$A
+ 'ccc 1.5'#$D#$A
+ 'Amount owed is 6.5'#$D#$A
+ 'You earned 4 frequent renter points';
var
ACustomer: TCustomer;
AMovie1,AMovie2,AMovie3: TMovie;
AText: string;
begin
AMovie1 := TMovie.Create('aaa',REGULAR);
AMovie2 := TMovie.Create('bbb',NEW_RELEASE);
AMovie3 := TMovie.Create('ccc',CHILDRENS);
try
ACustomer := TCustomer.Create('ZhangSan');
try
with ACustomer do
begin
AddRental(TRental.Create(AMovie1,1));
AddRental(TRental.Create(AMovie2,2));
AddRental(TRental.Create(AMovie3,3));
end;
AText := ACustomer.Statement;
Check(AText = CNT_Text, 'Test fail');
finally
ACustomer.Free;
end;
finally
AMovie1.Free;
AMovie2.Free;
AMovie3.Free;
end;
end;
initialization
TestFramework.RegisterTest(TTest.Suite);
end.
相关文章推荐
- 《重构》 — Delphi示例:影片出租店程序(5、单元测试)
- 《重构》 — Delphi示例:影片出租店程序(3、重构——分解并重组Statement)
- 《重构》 — Delphi示例:影片出租店程序(1、重构前)
- 《重构》 — Delphi示例:影片出租店程序(4、添加功能)
- 《重构》 — Delphi示例:影片出租店程序(6、重构——引入状态模式)
- 《重构》 — Java示例:影片出租店程序(2、单元测试)
- 《重构》 — Java示例:影片出租店程序(5、单元测试)
- 《重构》 — Java示例:影片出租店程序(4、添加功能)
- 《重构》 — Java示例:影片出租店程序(6、重构——引入状态模式)
- 《重构》 — Java示例:影片出租店程序(3、重构——分解并重组Statement)
- 《重构》 — Java示例:影片出租店程序(1、重构前)
- 01-QQ 3-最终重构版 Demo示例程序源代码
- 修改马敏钊mmz-asio4delphi,使其能在Delphi Xe2 运行示例程序
- Delphi外挂辅助技术入门篇、Windows扫雷程序示例
- 修改马敏钊mmz-asio4delphi,使其能在Delphi Xe2 运行示例程序-End
- delphi多线程程序示例(与.net一样简单)
- win32下的系统日志钩子示例程序(Delphi 版)
- delphi简单判断程序30秒没有键盘和鼠标动作示例
- 重构Java代码的既有设计-影片出租店