Original in Russian: http://18delphi.blogspot.ru/2013/11/blog-post_15.html
GUI-testing. Table of contents
I have already written about checkpoints in first chapter.
I use this approach quite broadly.
I implement test code in designed files.
I’ll venture to give an example:
Here two “checkpoints” f_ReadLnLog and f_GetCharLog have been introduced to the class TscriptParser.
Usually, I do such “checkpoints” at the model level instead of doing it “manually”. Anyway, I hope the idea is clear.
At the same time, I usually load the “etalons” in CVS/SVN and control the difference. On different test sets. I’ll write about it a bit later.
The example is available here - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/GUITests/Chapter0/
GUI-testing. Table of contents
I have already written about checkpoints in first chapter.
I use this approach quite broadly.
I implement test code in designed files.
I’ll venture to give an example:
unit Script.Parser;
interface
uses
Classes,
CoreObject
;
{$IfNDef NoTesting}
{$Define TestParser}
{$EndIf NoTesting}
type
TscriptParser = class(TCoreObject)
private
f_Stream : TStream;
{$IfDef TestParser}
f_GetCharLog : TStream;
// - right away we think of testing, we’ll output in this stream
// the result of function GetChar
f_ReadLnLog : TStream;
// - right away we think of testing, we’ll output in this stream
// the result of function ReadLn
{$EndIf TestParser}
f_EOF : Boolean;
f_CurrentLine : String;
protected
procedure Cleanup; override;
function ReadLn: String;
protected
function GetChar(out aChar: AnsiChar): Boolean;
public
constructor Create(const aStream : TStream; const aFileName : String); overload;
constructor Create(const aFileName : String); overload;
function EOF: Boolean;
procedure NextToken;
end;//TscriptParser
implementation
uses
System.SysUtils
;
constructor TscriptParser.Create(const aStream : TStream; const aFileName : String);
begin
inherited Create;
f_EOF := false;
f_Stream := aStream;
{$IfDef TestParser}
f_GetCharLog := TFileStream.Create(aFileName + '.GetChar.log', fmCreate);
f_ReadLnLog := TFileStream.Create(aFileName + '.ReadLn.log', fmCreate);
{$EndIf TestParser}
end;
constructor TscriptParser.Create(const aFileName : String);
var
l_FileName : String;
begin
l_FileName := ExtractFilePath(ParamStr(0)) + '\' + aFileName;
Create(TFileStream.Create(l_FileName, fmOpenRead), l_FileName);
end;
procedure TscriptParser.Cleanup;
begin
FreeAndNil(f_Stream);
{$IfDef TestParser}
FreeAndNil(f_GetCharLog);
FreeAndNil(f_ReadLnLog);
{$EndIf TestParser}
inherited;
end;
function TscriptParser.GetChar(out aChar: AnsiChar): Boolean;
begin
if (f_Stream.Read(aChar, SizeOf(aChar)) = SizeOf(aChar)) then
begin
Result := true;
{$IfDef TestParser}
f_GetCharLog.Write(aChar, SizeOf(aChar));
{$EndIf TestParser}
end
else
Result := false;
end;
function TscriptParser.ReadLn: String;
{$IfDef TestParser}
const
cEOL : AnsiString = #13#10;
var
l_Result : AnsiString;
{$EndIf TestParser}
var
l_Char : AnsiChar;
l_Line : String;
begin
{$IfDef TestParser}
try
{$EndIf TestParser}
l_Line := '';
while GetChar(l_Char) do
begin
if (l_Char = #13) then
begin
if GetChar(l_Char) then
begin
if (l_Char = #10) then
begin
Result := l_Line;
Exit;
end//l_Char = #10
else
Assert(false, 'Something has gone wrong, there is no character 10 after 13');
end//GetChar(l_Char)
else
Assert(false, 'Something has gone wrong, at once the file end after character 13');
end;//l_Char = #13
l_Line := l_Line + l_Char;
end;//while GetChar(l_Char)
f_EOF := true;
Result := l_Line;
{$IfDef TestParser}
finally
l_Result := Result;
f_ReadLnLog.Write(@l_Result[1], Length(l_Result));
f_ReadLnLog.Write(@cEOL[1], Length(cEOL));
end;//try..finally
{$EndIf TestParser}
end;
procedure TscriptParser.NextToken;
begin
while(f_CurrentLine = '') do
begin
f_CurrentLine := ReadLn;
if (f_CurrentLine = '') then
if f_EOF then
Exit;
end;//while(f_NextToken = '')
f_CurrentLine := '';
end;
function TscriptParser.EOF: Boolean;
begin
Result := f_EOF;
end;
end.
Here two “checkpoints” f_ReadLnLog and f_GetCharLog have been introduced to the class TscriptParser.
Usually, I do such “checkpoints” at the model level instead of doing it “manually”. Anyway, I hope the idea is clear.
At the same time, I usually load the “etalons” in CVS/SVN and control the difference. On different test sets. I’ll write about it a bit later.
The example is available here - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/GUITests/Chapter0/
Комментариев нет:
Отправить комментарий