Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi DunitX Testcase parameter (https://www.delphipraxis.net/203415-dunitx-testcase-parameter.html)

Klaus01 14. Feb 2020 12:12

DunitX Testcase parameter
 
Hallo,

sind in Delphi die DUnitX Testcase Parameter auf Strings begrenzt?
Kann ich über die Parameter keine Object-Instanzen übergeben?

Mir würde sowas vorschweben:
Delphi-Quellcode:
    [Test]
    [Testcase('with nil parameter','nil')]
    [Testcase('with correct parameter','TUserGroupData.Create("tester")')]
    procedure addUserGroup(item: TBasicElement);
Die Tests laufen erfogreich durch - in beiden Fällen ist aber "item" nil.

Grüße
Klaus

Stevie 14. Feb 2020 12:26

AW: DunitX Testcase parameter
 
Was erwartest du? Dass der Text genommen und zu Code kompiliert wird? :-D

Zitat:

Zitat von Klaus01 (Beitrag 1457502)
sind in Delphi die DUnitX Testcase Parameter auf Strings begrenzt?

Nicht nur auf Strings, aber auf alles, was const sein kann - das schließt Objekte aus.
Allerdings kannst du Testdaten auch anderes erzeugen, dazu musst du dir das TestCaseProviderAttribute anschauen - bestimmt gibts im DUnitX Verzeichnis oder in den Tests ein Beispiel wie das einzusetzen ist.

Klaus01 14. Feb 2020 12:33

AW: DunitX Testcase parameter
 
.. nein nicht direkt.

Wenn ich aber eine Instanz übergeben
Delphi-Quellcode:
    [Test]
    [Testcase('with nil parameter','nil')]
    [Testcase('with correct parameter',TUserGroupData.Create('tester'))]
    procedure addUserGroup(item: TBasicElement);
Dann kompiliert das ganze nicht:
[dcc32 Error] TestUserGroupList.pas(17): E2250 There is no overloaded version of 'Create' that can be called with these arguments

Integer werden auch als String übergeben und dann anscheinend konvertiert.
Beispiel: https://www.howtobuildsoftware.com/i...case-in-dunitx

Grüße
Klaus

Klaus01 14. Feb 2020 12:33

AW: DunitX Testcase parameter
 
Zitat:

Zitat von Stevie (Beitrag 1457505)
Allerdings kannst du Testdaten auch anderes erzeugen, dazu musst du dir das TestCaseProviderAttribute anschauen - bestimmt gibts im DUnitX Verzeichnis oder in den Tests ein Beispiel wie das einzusetzen ist.

Danke werde ich machen.

Klaus01 17. Feb 2020 06:37

AW: DunitX Testcase parameter
 
folgende Units müssen eingebunden werden
(TestInsight ist nicht zwingend nötig)
Delphi-Quellcode:
uses
  System.Generics.Collections,
  DUnitX.InternalDataProvider,
  DUnitX.TestDataProvider,
  DUnitX.Types,
  DUnitX.TestFramework,
  TestInsight.DUnitX,
  ...
Die Erstellung der Ableitung von TTestDataProvider.

Delphi-Quellcode:
type
  TTestData = record
    userGroupData: TBasicElement;
    expectedListCount: Integer;
  end;

  TUserGroupDataAttributeProvider = class(TTestDataProvider)
    private
      fList : TList<TTestData>;
      procedure initTestData;
    public
      constructor Create; override;
      function GetCaseCount(const Methodname:string):integer; override;
      function GetCaseName(const Methodname:string):String; override;
      function GetCaseParams(const Methodname:string;const casenr:integer):TValuearray; override;
      Destructor Destroy;override;
  end;

  [TestFixture]
  TestTUserGroupList = class(TObject)
  public
    [Test]
    procedure CreateUserGroupList;
    [Test]
    [TestCaseProvider('UserGroupDataAttributeProvider')]
    procedure addUserGroup(item: TBasicElement; expected: Integer);
  end;

Delphi-Quellcode:
constructor TUserGroupDataAttributeProvider.create();
begin
  inherited;
  fList := TList<TTestData>.Create();
  initTestData;
end;

destructor TUserGroupDataAttributeProvider.Destroy;
begin
  fList.Free;
  inherited;
end;

function TUserGroupDataAttributeProvider.GetCaseCount(const Methodname: string): integer;
begin
  result := fList.Count;
end;

function TUserGroupDataAttributeProvider.GetCaseName(const Methodname: string): String;
begin
  result := '';
  if Methodname = 'addUserGroup' then
    result := 'TestAddUserGroup';
end;

function TUserGroupDataAttributeProvider.GetCaseParams(const Methodname: string;
  const casenr: integer): TValuearray;
begin
  SetLength(result,0);
  if (Casenr >=0) and (Casenr < flist.count) then
  begin
    SetLength(result,2);
    result[0] := fList[CaseNr].userGroupData;
    result[1] := fList[CaseNr].expectedListCount;
  end;
end;

// TestDaten
procedure TUserGroupDataAttributeProvider.initTestData;
var
  item: TTestData;
begin
  item.userGroupData := nil;
  item.expectedListCount := 0;
  fList.Add(item);
  item.userGroupData := TUserGroupData.create();
  item.expectedListCount := 0;
  fList.Add(item);
  item.userGroupData := TUserGroupData.create('tester');
  item.expectedListCount := 1;
  fList.Add(item);
end;
Delphi-Quellcode:
initialization
  TestDataProviderManager.RegisterProvider('UserGroupDataAttributeProvider',TUserGroupDataAttributeProvider);
  TDUnitX.RegisterTestFixture(TestTUserGroupList);
end.
Der Testcase sieht dann "ganz normal" aus.
Delphi-Quellcode:
procedure TestTUserGroupList.addUserGroup(item: TBasicElement; expected: Integer);
var
  userGroupList: TUserGroupList;
  itemCount: Integer;
begin
  userGroupList := TUserGroupList.Create();
  try
    try
      itemCount := userGroupList.Count;
      userGroupList.addNew(item);
      assert.AreEqual(expected, userGroupList.count - itemCount,'ok');
    except
      on e:Exception do
        assert.Fail(e.Message);
    end;
  finally
    userGroupList.Free;
  end;
end;
Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz