Delphi.cz

Český portál Delphi

Unit testing

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.

DUnit

DUnit

DUnit

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.

DUnit

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.

DUnit

Nyní už vybereme jen výsledný soubor, kde bude uložen náš Test Case a je to. Wizard vygeneruje základní kostru.

DUnit

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;

DUnit

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í.

Datum: 2011-07-26 22:09:00 Tagy: nastroje, delphi, ladeni, začátečníci, IDE, RTTI

Návody