Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Unittest - Kopieren einer Klasse (https://www.delphipraxis.net/189095-unittest-kopieren-einer-klasse.html)

SProske 3. Mai 2016 10:30

Unittest - Kopieren einer Klasse
 
Hallo allerseits,
wir haben hier einige Datenhaltungsklassen, die zusätzlich noch eine Methode zum kopieren des Objektinhalts haben, im einfachsten Falle so:

Delphi-Quellcode:
  TFoo = class
  strict protected
    FBar: Integer;
  public
    property Bar: Integer read FBar write FBar;
    procedure Assign(const Source: TFoo);
  end;

procedure TFoo.Assign(const Source: TFoo);
begin
  self.FBar := Source.Bar;
end;
Wie geht man hier das Thema Unittesting am besten an?

- Gar nicht testen?
- Im Test prüfen, dass Bar korrekt gesetzt ist - sollte irgendwann eine neue Property hinzukommen, muss man daran denken, dafür einen neuen Unittest zu schreiben - bis dahin laufen die Unittests durch, auch wenn die neue Property nicht korrekt gesetzt wird
- Im Test prüfen, dass alle Properties korrekt gesetzt sind, also auch derzeit noch nicht bekannte (wie??)
- Irgendwie ganz anders?

Das verwendete Framework ist DUnit, Delphiversion ist XE3.

Der schöne Günther 3. Mai 2016 10:40

AW: Unittest - Kopieren einer Klasse
 
TFoo die
Delphi-Quellcode:
function Equals(const other: TFoo): Boolean
hinzufügen, Tests dafür schreiben. Der Test ob Assign funktioniert beschränkt sich dann ob nach einem Assign(..) dann Equals(..) True zurück liefert. :stupid:

Zitat:

Im Test prüfen, dass alle Properties korrekt gesetzt sind, also auch derzeit noch nicht bekannte (wie??)
Man könnte z.B. mittels RTTI über alle Felder gehen und mittels Default-Comparer vergleichen. Ich finde das zu unsicher und den Aufwand nicht wert. Wenn ich an einer Klasse herumdoktere muss ich dafür akzeptieren auch die Erwartungen (den Unit-Test) nochmal anschauen zu müssen. Die Assign-Methode (und ähnliches) muss man dann ja sowieso anpassen wenn man z.B. ein neues Feld hinzufügt.

Mein Weltbild ist manchmal schockierend simpel.

Sir Rufo 3. Mai 2016 10:46

AW: Unittest - Kopieren einer Klasse
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1337340)
TFoo die
Delphi-Quellcode:
function Equals(const other: TFoo): Boolean
hinzufügen, Tests dafür schreiben. Der Test ob Assign funktioniert beschränkt sich dann ob nach einem Assign(..) dann Equals(..) True zurück liefert. :stupid:

Mein Weltbild ist manchmal schockierend simpel.

Dann hast du nur geprüft ob nach einem
Delphi-Quellcode:
Assign
Delphi-Quellcode:
Equals
wie erwartet
Delphi-Quellcode:
true
zurückliefert. Mehr nicht.

War das so gewollt?

Über RTTI würde ich keinen Vergleich machen, wohl aber die Eigenschaftsnamen abfragen und mit denen vergleichen, die im Test berücksichtigt werden. Dann gibt es eine Meldung darüber und man kann den Test anpassen.

Der schöne Günther 3. Mai 2016 10:56

AW: Unittest - Kopieren einer Klasse
 
Zitat:

Zitat von Sir Rufo (Beitrag 1337341)
War das so gewollt?

Ja, denn meinem Test für
Delphi-Quellcode:
Equals(..)
muss ich vertrauen. Wenn man unter Assign() jetzt etwas anderes versteht als die "subjektive Gleichheit" dann passt das natürlich nicht. Wie gesagt, in meinem simplen Weltbild ist das so.

Interne Caches wären jetzt etwas das ich bspw. weder mit Assign() übertragen würde, noch mich bei einer Gleichheit wie Equals() interessieren würde.

Uwe Raabe 3. Mai 2016 11:02

AW: Unittest - Kopieren einer Klasse
 
Zitat:

Zitat von SProske (Beitrag 1337339)
sollte irgendwann eine neue Property hinzukommen, muss man daran denken, dafür einen neuen Unittest zu schreiben

Das hinter den Unittests stehende Paradigma besagt ja auch, daß du den Unittest schreiben musst, bevor das neue Property dazu kommt. Damit der dann compiliert musst du das property und gegebenfalls das dahinter liegende Feld auch in der Klasse einführen. In dem Moment läuft der Test, schlägt aber fehl bis das Assign angepasst wurde. Wenn du dich an diese Reihenfolge hältst, kann eigentlich nichts schief gehen.

Ich habe so meine Bedenken bei sich selbst anpassenden Tests.

Stevie 3. Mai 2016 11:18

AW: Unittest - Kopieren einer Klasse
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1337344)
Das hinter den Unittests stehende Paradigma besagt ja auch, daß du den Unittest schreiben musst, bevor das neue Property dazu kommt.

Du spielst auf TDD an. Kann ich nur empfehlen, obwohl ich auch schuldig bin, das nicht immer zu praktizieren.
Aber schlussendlich führt es zu besserem Code, da man sich in aller Regel vorher Gedanken macht (da man ja den Test schreiben muss), sowohl über die API als auch über die Implementierung.

Testen von Methode A durch Aufrufen von Methode B halte ich für ziemlich fehleranfällig.

Uwe Raabe 3. Mai 2016 11:22

AW: Unittest - Kopieren einer Klasse
 
Zitat:

Zitat von Stevie (Beitrag 1337347)
Kann ich nur empfehlen, obwohl ich auch schuldig bin, das nicht immer zu praktizieren.

Ich glaube kaum, daß hier irgendjemand im biblischen Sinne den ersten Stein werfen könnte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 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