[Dresden-pm] Frage zum Testen

Steffen Schwigon ss5 at renormalist.net
Mi Mai 23 12:52:43 PDT 2012


Hans-Dietrich Kirmse <hd.kirmse at gmx.de> writes:
> Für ein Schulserver-Projekt habe ich ein paar Scripte zur User- und
> Rechnerverwaltung erstellt. Diese werden über ein Webinterface
> (erstellt unter Verwendung eines PHP-Frameworks) aufgerufen. Ich wurde
> schon mehrfach angemahnt, die Scripte so zu erstellen, dass die einen
> auswertbaren Errorcode zurückliefern. Ich habe deshalb begonnen, alle
> Scripte zu überarbeiten und konsequent jedes "die" zu ersetzen.

Wodurch hast Du das "die" ersetzt, durch Dein unten besagtes "exit"?

Weil prinzipiell ist "die" öfter die richtigere Variante.

Es geht im Program mit eval{} abzufangen oder macht anderenfalls ein
exit(). Die exit-Codes kannst Du mit $? und $! beeinflussen.

Ein direktes exit() lässt sich nicht abfangen, da kann keiner
Errorhandling drumrum schreiben.

Entweder direkt selber oder implizit mit einem der Exception-Module von
CPAN.


> Um gleichzeitig die Hinweise aus "Perl Best Practices" umzusetzen,
> habe ich eine Routine "do_exit" erstellt, die einerseits einen
> Errorcode zurückliefert und andererseits gut gehändelt werden kann, um
> verständliche Fehlermeldungen zu bringen.
>
> http://dev.delixs.de/wsvn/delixs/delixs-scripts/trunk/share/perl5/Delixs/Error.pm 

Das ganze in eine Funktion zu packen ist ok, aber ich empfehle, doch
wieder "die" am Ende zu verwenden, und die Funktion entsprechend anders
zu nennen, "do_error()" o.s.ä.

Du kannst "perldoc -f die" und "man perlvar" zu $! und $? lesen, damit
geht eine Menge.


Ich hab das nur mal zum Demonstrieren in

  http://pastie.org/3957135

exerziert, aber ich bin nicht sicher, ob das Setzen von $? und $! eine
Gute Sache(tm) ist.

Wenn Du derart ausführlich Fehler definieren willst, schau mal besser,
ob eines der Module von CPAN passt, z.B.

  https://metacpan.org/module/Exception::Class

Und prüf außerdem, ob Deine Kollegen die wohldefinierten exit-Code
*wirklich* brauchen. Gibt's denn die vielen wichtigen Zeilen Code schon,
die Deine exit-Codes auswerten?

Falls nicht, wirf einfach mit "die" oder Exception::Class nur die
Fehlerbeschreibung. Das reicht zu 99%.

Und wenn ja, wie tauscht ihr die Fehlercode-Definition mit dem
PHP-Programm aus? Oder wie wir in Dresden hier sagen: “Ick gloob da ni
dranne, wa.” :)



> Die Fehlermeldungen sehen so aus:
> http://www.erasmus-reinhold-gymnasium.de/delixs/scripte/fehlermeldung.txt
>
> Ich möchte gern zu jeder Routine aus den Modulen entsprechende Tests
> schreiben, aber genau hier ist mein Problem.
>
> Ich weiss leider nicht, wie ich diesen zurückgegebenen Errorcode von
> Perl aus abfragen kann. Auch die Ausgabe der Fehlermeldung würde ich
> gern testen. Hier sehe ich als einzige Chance, einen Fehler zu
> provozieren und dabei über eval zu gehen und diese Meldung dann aus $@
> auszulesen. Geht das auch anders oder ist das der übliche Weg für
> solche Tests?

Wenn Du "die" verwendest, kannst Du prinzipiell Dein eval{} und $@
machen, ja. Mit exit() wird das schwer. Prinzipiell funktioniert das im
Test genaus wie in meinem obigen Beispiel.

Schau aber besser nach einem richtigen Testmodul, wie z.B.

  https://metacpan.org/module/Test::Exception


Viel Glück. Halt uns auf dem laufenden.

Kind regards,
Steffen 
-- 
Steffen Schwigon <ss5 at renormalist.net>
Dresden Perl Mongers <http://dresden-pm.org/>


Mehr Informationen über die Mailingliste Dresden-pm