Bitte Hilfe bei Unit-Testing

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Bitte Hilfe bei Unit-Testing

Beitrag von Marsmännchen »

Hi,

ich quäle mich grade damit ab, meine Unit-Tests zum Laufen zu kriegen (ich benutze FPCUnit, da gibt es ja wohl auch noch ein anderes Framework). Ich habe noch nicht viel Erfahrung mit diesem Kram, aber habe zumindest schon simple Tests zum Laufen bekommen. Jetzt aber beiße ich auf Granit:
Ich möchte, dass meine Klasse Exceptions wirft, wenn ihr fehlerhafte Daten zugewiesen werden (damit will ich sie von allem anderen entkoppeln: valide Daten werden geschluckt, fehlerhafte Daten werden zurückgewiesen und gemeldet).
Habe das auch so implementiert und wollte es jetzt automatisch testen lassen. Aber ich kriege die Testumgebung nicht richtig hin. Die Exception wird korrekt geworfen (Bild1), aber in der Testumgebung nicht richtig abgefangen, eigentlich müsste das Programm doch weiterlaufen, oder habe ich da einen Denkfehler? Wenn ich auf Fortfahren klicke, dann kriege ich ein SIGSEV um die Ohren gehaun (Bild2). Ich möchte eigentlich nur, dass auch in der Testumgebung eine fehlerhafte Wertzuweisung an mein Objekt eine Exception auslöst, diese aber abgefangen wird (Meldung an den User) und das Programm dann weiterläuft.

Ich habe auch schon mit AssertException rumprobiert, aber das funktioniert nicht, weil ich keine Methode testen will (die diese Assertion verlangt), sondern einen Ausdruck (die Zuweisung eines leeren Strings). Nun hab ich keinen Plan, was ich da machen muss und hoffe, jemand hilft mir weiter. Das Projekt hänge ich an.
Dateianhänge
Lazarus (Kopie).zip
(3.67 KiB) 71-mal heruntergeladen
Bild2.png
Bild1.png
Ich mag Pascal...

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitte Hilfe bei Unit-Testing

Beitrag von Mathias »

Wolltest du dies haben ?

Es macht einen Unterschied, ob du das Programm in der IDE oder direkt ohne IDE startest.
Dateianhänge
Bildschirmfoto vom 2017-08-05 20-53-45.png
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Bitte Hilfe bei Unit-Testing

Beitrag von Marsmännchen »

Hi,

das bringt mich auf jeden Fall schon mal einen Schritt weiter. Ich habe die Tests bisher immer aus der IDE gestartet (was anderes wäre mir gar nicht in den Sinn gekommen). Allerdings muss ich jetzt irgendwie rausfinden, warum der Test wegen einer Access Violation fehlschlägt. Scheint noch ein steiniger Weg zu sein, aber man lernt ja daran.

Auf jeden Fall Danke!
Ich mag Pascal...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Bitte Hilfe bei Unit-Testing

Beitrag von wp_xyz »

Schau dir fpspreadsheet an, da gibt es im Ordner tests eine Unmenge von Unit-Tests (https://sourceforge.net/p/lazarus-ccr/s ... eet/tests/). Oder, weil das für den Einstieg wahrscheinlich zu umfangreich ist, schau dir mal die Unit-Tests an, die gerade für dEXIF im github von af0815 entstehen (https://github.com/afriess/dexif/tree/wip_samples/tests).

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bitte Hilfe bei Unit-Testing

Beitrag von Mathias »

Ich habe die Tests bisher immer aus der IDE gestartet (was anderes wäre mir gar nicht in den Sinn gekommen).

Gucke mal folgendes Beispiel an:

Code: Alles auswählen

var
  s: string;
  i: longint;
begin
  s := 'abc';
  try
    i := StrToInt(s);
  except
    On E: EConvertError do ShowMessage('Fehler');
  end;
end;

Ohne IDE, kommt wie erwarte direkt die Fehlermeldung.
Mit der IDE kommt zuerst eine Debuggernachricht, bevor das ShowMessage kommt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Bitte Hilfe bei Unit-Testing

Beitrag von Marsmännchen »

Danke für die ganzen Hinweise. Ich habe es jetzt in den Griff bekommen. Auch die Sache mit dem Starten innerhalb oder außerhalb der IDE.

Die Access-Violation, die mir immer meinen Test zerschossen hat, habe ich auch gefunden, ich kapiers nur nicht:
Ich benutze die Setup-Routine des Testframeworks, um mir Mockobjekte zu schaffen, mit denen ich dann in den Tests arbeite

Code: Alles auswählen

procedure TMFK3Test.SetUp;
var
  i: Integer;
 
begin
  Einmalliste := TEinmalListe.Create(True);
  Einmalliste.Assign(MockListeBuchungEinmalig);
 
end;
 
 


wie ich es gelernt habe, will ich dann zum Schluss aufräumen, aber dabei fliegt mir der Test um die Ohren. Es gibt eine Access-Violation, weil offenkundig die Liste der Testobjekte schon vorher von irgendwas gelöscht wird??? Warum das so ist, weiß ich aber nicht. Oder muss man eine TFPGObjectList nicht freigeben???

Code: Alles auswählen

procedure TMFK3Test.TearDown;
begin
  //Einmalliste.Free;        //-> Wenn ich den entkommentiere, dann knallts hier!
  //Einmalliste := nil;
end;       


Projekt ist vorsichtshalber nochmal beigefügt. Hat jemand einen Tipp?
Dateianhänge
Lazarus (Kopie).zip
(29.48 KiB) 67-mal heruntergeladen
Ich mag Pascal...

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Bitte Hilfe bei Unit-Testing

Beitrag von Marsmännchen »

wp_xyz hat geschrieben:...schau dir mal die Unit-Tests an, die gerade für dEXIF im github von af0815 entstehen (https://github.com/afriess/dexif/tree/wip_samples/tests).

Der Link führt leider ins Leere bei mir. Gituhb behauptet, den gibts nicht...

In den Links auf sourceforge sind wirklich Unmengen von Tests. Ich habe jetzt für meine Testcases (Testen auf Exceptions) dort erstmal nix Passendes gefunden. ich vermute, dass ich mit ExpectException was anfangen könnte, aber dazu finde ich keine Dokumentation. Auf sourceforge wird auch auf eine FPC Unit Dokumentation verwiesen, die ich aber nicht finde. Auf der FPC-Unit-Homepage wird auf JUnit verwiesen (aber ich weiß nicht, wie ich die @Annotationen aus Java auf Object-Pascal übertragen sollte) und die weiterführenden Links im FPC-Unit-Wiki sind teilweise auch nicht mehr funktionsfähig. Die, die noch funktionieren führen zu Einführungstutorials, aber leider nicht in die Tiefe.
Ich mag Pascal...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Bitte Hilfe bei Unit-Testing

Beitrag von m.fuchs »

Marsmännchen hat geschrieben:wie ich es gelernt habe, will ich dann zum Schluss aufräumen, aber dabei fliegt mir der Test um die Ohren. Es gibt eine Access-Violation, weil offenkundig die Liste der Testobjekte schon vorher von irgendwas gelöscht wird??? Warum das so ist, weiß ich aber nicht. Oder muss man eine TFPGObjectList nicht freigeben???


Naja, das wird daran liegen dass du echt viel Murks machst. In deiner Funktion MockListeBuchungEinmalig erstellst du ein Buchungsobjekt, änderst es fünfmal und fügst es fünfmal der Liste zurück. Wenn deine Liste dann aufgeräumt wird, löscht sie das Objekt einmal, und versucht es dann viermal noch einmal zu löschen. Weil ja insgesamt fünf Referenzen auf dieses eine Objekt existieren. Du möchtest in deinem Mockup sicherlich fünf eigenständige Objekte erzeugen.

Abgesehen davon sind auch noch echt viele unschöne Codezeilen da drin, da sollte nochmal aufgeräumt werden.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Marsmännchen
Beiträge: 294
Registriert: So 4. Mai 2014, 21:32
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10
CPU-Target: 64bit
Wohnort: Oranienburg

Re: Bitte Hilfe bei Unit-Testing

Beitrag von Marsmännchen »

autsch... aber danke. Ich mach mich ans Korrigieren.
Ich mag Pascal...

Antworten