Original in Russian: http://programmingmindstream.blogspot.com/2014/02/3.html
Table of contents
All source code is available here.
In the previous series, we’ve implemented the test of ADDITION.
Right now, let’s add three more tests – tests of SUBTRACTION, MULTIPLICATION and DIVISION.
First, let’s make over our TPlusTest
We create one more ABSTRACT test - TOperationTest:
TPlusTest now looks as follows:
At this point, we add TMinusTest, TMulTest and TDivTest:
That’s what we get:
What are the results?
We have covered ALL operations of the calculator with tests.
We have, one might say, “ensured the minimal test coverage” of all precedents in our application.
We could speak of testing of "various data sets” or “random data sets”.
We could also speak about testing of boundary conditions like, for example, division by zero.
We could speak of testing of input data validation.
We’ll discuss these in the next chapters.
We’ll also speak of “changing the architecture”. We’ve come close to it.
We will speak, but in the next posts.
Meanwhile, I take a pause and I’d like you to have a look at what I’ve given above.
I advise you to read this article if you have not yet - http://18delphi.blogspot.com/2015/04/how-to-test-totally-untestable.html.
P.S. I’ve been asked to draw UML-diagram for classes and tests of the application. Is it INTERESTING? Do you NEED it? Can I get away with classes diagram ALONE or do you need sequence-diagram too?
Repository
Table of contents
All source code is available here.
In the previous series, we’ve implemented the test of ADDITION.
Right now, let’s add three more tests – tests of SUBTRACTION, MULTIPLICATION and DIVISION.
First, let’s make over our TPlusTest
We create one more ABSTRACT test - TOperationTest:
unit OperationTest;
interface
uses
CalculatorGUITest,
MainForm
;
type
TOperation = (opAdd, opMinus, opMul, opDiv);
TOperationTest = class(TCalculatorGUITest)
protected
procedure VisitForm(aForm: TfmMain); override;
function GetOp: TOperation; virtual; abstract;
end;//TOperationTest
implementation
uses
TestFrameWork,
SysUtils
;
procedure TOperationTest.VisitForm(aForm: TfmMain);
const
aA = 10;
aB = 20;
begin
aForm.Edit1.Text := IntToStr(aA);
aForm.Edit2.Text := IntToStr(aB);
case GetOp of
opAdd:
begin
aForm.Button1.Click;
Check(StrToFloat(aForm.Edit3.Text) = aA + aB);
end;
opMinus:
begin
aForm.Button2.Click;
Check(StrToFloat(aForm.Edit3.Text) = aA - aB);
end;
opMul:
begin
aForm.Button3.Click;
Check(StrToFloat(aForm.Edit3.Text) = aA * aB);
end;
opDiv:
begin
aForm.Button4.Click;
Check(StrToFloat(aForm.Edit3.Text) = aA / aB);
end;
end;//case GetOp
end;
end.
TPlusTest now looks as follows:
unit PlusTest;
interface
uses
OperationTest
;
type
TPlusTest = class(TOperationTest)
protected
function GetOp: TOperation; override;
end;//TPlusTest
implementation
uses
TestFrameWork,
SysUtils
;
function TPlusTest.GetOp: TOperation;
begin
Result := opAdd;
end;
initialization
TestFramework.RegisterTest(TPlusTest.Suite);
end.
At this point, we add TMinusTest, TMulTest and TDivTest:
unit MinusTest;
interface
uses
OperationTest
;
type
TMinusTest = class(TOperationTest)
protected
function GetOp: TOperation; override;
end;//TMinusTest
implementation
uses
TestFrameWork,
SysUtils
;
function TMinusTest.GetOp: TOperation;
begin
Result := opMinus;
end;
initialization
TestFramework.RegisterTest(TMinusTest.Suite);
end.
unit MulTest;
interface
uses
OperationTest
;
type
TMulTest = class(TOperationTest)
protected
function GetOp: TOperation; override;
end;//TMulTest
implementation
uses
TestFrameWork,
SysUtils
;
function TMulTest.GetOp: TOperation;
begin
Result := opMul;
end;
initialization
TestFramework.RegisterTest(TMulTest.Suite);
end.
unit DivTest;
interface
uses
OperationTest
;
type
TDivTest = class(TOperationTest)
protected
function GetOp: TOperation; override;
end;//TDivTest
implementation
uses
TestFrameWork,
SysUtils
;
function TDivTest.GetOp: TOperation;
begin
Result := opDiv;
end;
initialization
TestFramework.RegisterTest(TDivTest.Suite);
end.
That’s what we get:
What are the results?
We have covered ALL operations of the calculator with tests.
We have, one might say, “ensured the minimal test coverage” of all precedents in our application.
We could speak of testing of "various data sets” or “random data sets”.
We could also speak about testing of boundary conditions like, for example, division by zero.
We could speak of testing of input data validation.
We’ll discuss these in the next chapters.
We’ll also speak of “changing the architecture”. We’ve come close to it.
We will speak, but in the next posts.
Meanwhile, I take a pause and I’d like you to have a look at what I’ve given above.
I advise you to read this article if you have not yet - http://18delphi.blogspot.com/2015/04/how-to-test-totally-untestable.html.
P.S. I’ve been asked to draw UML-diagram for classes and tests of the application. Is it INTERESTING? Do you NEED it? Can I get away with classes diagram ALONE or do you need sequence-diagram too?
Repository

Комментариев нет:
Отправить комментарий