Jedna z důležitých věcí je testování. Nevím jak vy, ale já nesnáším opakované testy. Tj. člověk udělá nějaké změny a následně by měl přetestovat úplně všechno. Ale všichni známe jak to dopadne …
A proto je vhodné použít unit testing, tj. nástroj, který za nás bude opakovaně provádět testy, které mu předepíšeme. Pro Delphi se jedná o DUnit, který je navíc součástí vyšších verzí Delphi (tj. od D2007 nebo možná i starších).
Předpokládá se, že píšete kód za pomocí tříd - ale to většinou není problém.
Mějme tuto primitivní třídu jako ukázku.
unit uCalc;
interface
type
TCalc = class
public
function Add(i, j: Integer):Integer;
function Multi(i, j: Integer):Integer;
end;
implementation
{ TCalc }
function TCalc.Add(i, j: Integer): Integer;
begin
Result := i + j;
end;
function TCalc.Multi(i, j: Integer): Integer;
begin
Result := i * j;
end;
end.
Pro testování je zapotřebí založit nový projekt, který bude obsahovat DUnit framework.
Zde vyberte zda se bude jednat o GUI tester nebo jen console tester (to určuje jak bude vypadat tester, nikoliv co se dá testovat). Console verze je vhodná třeba jako součást dávkového testování.
Nyní máme prázdný projekt s frameworkem, přidáme naši třídu a jdeme na testování. Vrátíme se opět do prvního menu, kde nám mezitím přibyla nová položka Test Case.
Po jejím zvolení můžeme vybrat unit s testovanou třídou a zároveň vybereme metody, které chceme testovat. V našem případě viz obrázek.
Nyní už vybereme jen výsledný soubor, kde bude uložen náš Test Case a je to. Wizard vygeneruje základní kostru.
unit TestuCalc;
{
Delphi DUnit Test Case
----------------------
This unit contains a skeleton test case class generated by the Test Case Wizard.
Modify the generated code to correctly setup and call the methods from the unit
being tested.
}
interface
uses
TestFramework, uCalc;
type
// Test methods for class TCalc
TestTCalc = class(TTestCase)
strict private
FCalc: TCalc;
public
procedure SetUp; override;
procedure TearDown; override;
published
procedure TestAdd;
procedure TestMulti;
end;
implementation
procedure TestTCalc.SetUp;
begin
FCalc := TCalc.Create;
end;
procedure TestTCalc.TearDown;
begin
FCalc.Free;
FCalc := nil;
end;
procedure TestTCalc.TestAdd;
var
ReturnValue: Integer;
j: Integer;
i: Integer;
begin
// TODO: Setup method call parameters
ReturnValue := FCalc.Add(i, j);
// TODO: Validate method results
end;
procedure TestTCalc.TestMulti;
var
ReturnValue: Integer;
j: Integer;
i: Integer;
begin
// TODO: Setup method call parameters
ReturnValue := FCalc.Multi(i, j);
// TODO: Validate method results
end;
initialization
// Register any test cases with the test runner
RegisterTest(TestTCalc.Suite);
end.
Metody SetUp a TearDown jsou určeny k vytvoření a zrušení testované třídy (nebo k inicializaci pro testování atd). Metody TestAdd a TestMulti jsou kostry bez validace.
Všimněte si, že testovací metody jsou published, což je důležité - testovací framework pomocí RTTI zjišťuje, co se má testovat. Tj. všechny published metody jsou určeny pro testování. Další důležitou informací je, že testovací třída je následníkem TTestCase, která obsahuje celkem dost metod, které můžeme použít.
Ale zpět. Upravíme testy:
procedure TestTCalc.TestAdd;
var
ReturnValue: Integer;
j: Integer;
i: Integer;
begin
i := 10;
j := 15;
ReturnValue := FCalc.Add(i, j);
// spatna hodnota jako ukazka
CheckEquals(24, ReturnValue, 'Add vrátilo špatný výsledek');
end;
procedure TestTCalc.TestMulti;
var
ReturnValue: Integer;
j: Integer;
i: Integer;
begin
i := 10;
j := 11;
ReturnValue := FCalc.Multi(i, j);
CheckTrue(ReturnValue = 110);
end;
Každý Test Case je jedna větev stromu, dají se volit jednotlivé větve nebo jen testy. A to je v podstatě základ testování.