AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Unittest - Kopieren einer Klasse

Ein Thema von SProske · begonnen am 3. Mai 2016 · letzter Beitrag vom 3. Mai 2016
Antwort Antwort
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Unittest - Kopieren einer Klasse

  Alt 3. Mai 2016, 10:30
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.
Sebastian
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.109 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Unittest - Kopieren einer Klasse

  Alt 3. Mai 2016, 10:40
TFoo die 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.

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.

Geändert von Der schöne Günther ( 3. Mai 2016 um 10:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Unittest - Kopieren einer Klasse

  Alt 3. Mai 2016, 10:46
TFoo die 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.

Mein Weltbild ist manchmal schockierend simpel.
Dann hast du nur geprüft ob nach einem Assign Equals wie erwartet 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 3. Mai 2016 um 10:51 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.109 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Unittest - Kopieren einer Klasse

  Alt 3. Mai 2016, 10:56
War das so gewollt?
Ja, denn meinem Test für 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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.986 Beiträge
 
Delphi 12 Athens
 
#5

AW: Unittest - Kopieren einer Klasse

  Alt 3. Mai 2016, 11:02
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Unittest - Kopieren einer Klasse

  Alt 3. Mai 2016, 11:18
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.986 Beiträge
 
Delphi 12 Athens
 
#7

AW: Unittest - Kopieren einer Klasse

  Alt 3. Mai 2016, 11:22
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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