Quiq::Test::Class - Basisklasse für Testklassen
Quiq::Object
Quiq::Test::Class ist eine Basisklasse für Testklassen (Unit-Tests). Als Vorbild diente Test::Class, welches nicht zu den Perl Kernmodulen zählt. Einige Details sind anders, etliche Funktionalität ist nicht implementiert, da sie (noch) nicht gebraucht wird.
Quiq::Test::Class definiert sechs Typen von Testmethoden: Init(N), Foreach, Startup(N), Shutdown(N), Setup(N), Teardown(N) und Test(N). Der Typ der Testmethode wird als Subroutine-Attribut angegeben. Eine Testmethode besitzt folgenden Aufbau:
sub NAME : TYPE(N) { my $self = shift; ... return; }
Hierbei ist NAME der Name der Testmethode, TYPE der Typ der Testmethode und N die Anzahl der Tests innerhalb der Methode. Der Typ Forech hat keinen Parameter N. Jede Testmethode besitzt einen Parameter - das Testobjekt, das an alle Testmethoden übergeben wird (Beschreibung siehe unten). Die Methode liefert keinen Wert zurück.
MEMO: Die Foreach-Methoden werden entgegen der unten stehenden Beschreibung zuerst aufgerufen! Die Testzählung muss anders implementiert werden, Test::More erlaubt die Angabe der Gesamtanzahl nun auch am Ende (Funktion done_testing()).
Init(N)
Zunächst werden alle Methoden vom Typ Init(N) aufgerufen. In diesen Methoden können jegliche Vorabprüfungen vor Ausführung des eigentlichen Testcodes durchgeführt werden, z.B. ob die Systemumgebung die Ausführung der Tests überhaupt gestattet oder ob das Modul überhaupt ladbar ist.
Foreach
Danach werden die Methoden vom Typ Foreach aufgerufen. Diese führen selbst keine Tests durch, sondern liefern jeweils eine Liste, über deren Elementen der anschließende Startup/Setup/Test/Teardown/Shutdown-Zyklus wiederholt durchlaufen wird. Bei jedem Iterationsschritt wird der nächste Wert als zweiter Parameter (erster ist das Testobjekt) an die Testmethoden übergeben.
Test(N)
Die normale Testmethode ist vom Typ Test(N), sie wird im Zuge des Gesamttests genau einmal aufgerufen.
Setup(N), Teardown(N)
Vor jeder Testmethode vom Typ Test(N) werden alle Methoden vom Typ Setup(N) aufgerufen und danach alle Methoden vom Typ Teardown(N).
Startup(N), Shutdown(N)
Mit jedem Iterationsschritt werden alle Testmethoden vom Typ Startup(N) aufgerufen, am Ende alle Testmethoden vom Typ Shutdown(N).
Ignore...
Beginnt der Typ mit der Zeichenkette "Ignore", wird die betreffende Testmethode ignoriert, also nicht ausgeführt. Dies kann angewendet werden, um Testmethoden als Ganzes auszukommentieren, z.B. wenn eine Reihe von Tests umgearbeitet werden.
Das Testobjekt wird vor Aufruf der ersten Testmethode instaniiert und nach Aufruf der letzten Testmethode destrukturiert, es wird also an alle Testmethoden, unabhängig von ihrem Typ, übergeben.
Mittels der Methoden set() und get() können Schlüssel/Wert-Paare auf dem Test gesetzt und abgefragt werden. Auf diese Weise können Objekte von den Startup- und Setup-Methoden an die Test-Methoden weitergegeben und dort abgefragt werden.
Testmethoden können mittels des Subroutine-Attributs Group(Regex) gruppiert werden. Diese Möglichkeit kann dazu genutzt werden, um bestimmte Setup-, Test- und Teardown-Methoden zu einer Einheit zusammenzufassen.
Mitunter sind die Testmethoden einer Testklasse ganz oder ab einem bestimmten Punkt nicht anwendbar, weil bestimmte Voraussetzungen auf dem System nicht vorhanden sind, z.B. ein bestimmtes Modul. In dem Fall sollen alle folgenden Tests übergangen werden.
Eine Überprüfung der Voraussetzungen in der ersten Testmethode kann folgendermaßen vorgenommen werden:
sub initMethod : Init(0) { my $self = shift; if (...auf Eigenschaft testen...) { $self->skipAllTests('...Meldung...'); return; } }
$test = $class->new;
Instantiiere ein Testobjekt und liefere eine Referenz auf dieses Objekt zurück.
Das Testobjekt kennt die Testmethoden, die zur Klasse $class und ihren Basisklassen gehören. Ferner ist es Träger der Attribut/Wert-Paare, die mittels set() und get() gesetzt und abgefragt werden können.
$val = $test->get($key); @vals = $test->get(@keys);
Liefere die Werte @vals zu den Attributen @keys. Existiert ein Attribut nicht, wird eine Exception geworfen.
$test->set(@keyVal);
Setze die angegebenen Attribut/Wert-Paare auf dem Testobjekt. Die Methode liefert keinen Wert zurück.
Die Methode ermöglicht Startup- und Setup-Methoden, Attribute auf dem Testobjekt zu setzen, die in den Test-, Shutdown- und Teardown-Methoden abgefragt werden können.
$dir = $this->fixtureDir(@opt); $dir = $this->fixtureDir($subpath,@opt);
Erzeuge Verzeichnis, falls es nicht existiert.
Liefere den Pfad zum Fixture-Verzeichnis der Testklasse. Ist Parameter $subpath angegeben, wird diese Zeichenkette, per / getrennt, zum Pfad hinzugefügt.
$dir = $this->testDir; $dir = $this->testDir($subPath);
Liefere den Pfad zum Testverzeichnis. Ist Parameter $subPath angegeben, wird diese Zeichenkette, per / getrennt, zum Pfad hinzugefügt.
Das Testverzeichnis ist das Verzeichnis, in dem die Datei Test.pm (Definition der Testklasse) liegt. Die Methode kann als Objekt- oder als Klassemethode gerufen werden. Der Aufruf als Klassenmethode ist nützlich, wenn auf die Testverzeichnisse anderer Testklassen zugegriffen werden soll.
$fullPath = $this->testPath($file);
@arr = $test->methods($type);
Liefere die Liste der Testmethoden von Typ $type.
Folgende Typen von Testmethoden sind definiert:
Init Foreach Startup Setup Test Teardown Shutdown
$this->runTests;
Führe die Tests der Testklasse bzw. des Testobjekts $this aus. Die Methode liefert keinen Wert zurück.
$test->skipAllTests($msg);
skipAll()
Setze Abbruchmeldung $msg auf dem Testobjekt und übergehe alle folgenden Tests aller Testmethoden. Die Methode liefert keinen Wert zurück.
$test->skipTest($msg); $test->skipTest($n,$msg);
Setze Abbruchmeldung $msg auf dem Testobjekt und übergehe alle folgenden Tests bzw. die nächsten $n Tests der aktuellen Testmethode. Die Methode liefert keinen Wert zurück.
Die Methoden
ok
is
isnt
like
unlike
haben jeweils einen Alias okTest, isTest usw., der verwendet werden kann, wenn in der Testklasse das Modul Test::More genutzt wird. Der Nameclash zwischen den Test::More-Funktionen und den gleich benannten Quiq::Test::Class-Methoden kann damit umgangen werden. Alte Testklassen, die Test::More direkt benutzen, sollten portiert werden. Wenn dies vollständig passiert ist, können die Aliase entfallen.
okTest
isTest
Test::More
Quiq::Test::Class
$bool = $test->useOk($module);
$bool = $test->syntaxOk($program); $bool = $test->syntaxOk($program,$text);
Name oder Pfad des Programms. Ist kein absoluter Pfad angegeben, wird das Programm über die Environment-Variable PATH gesucht.
nichts
$bool = $test->ok($bool); $bool = $test->ok($bool,$text);
okTest()
$bool = $test->is($got,$expected); $bool = $test->is($got,$expected,$text);
isTest()
$bool = $test->isnt($got,$expected); $bool = $test->isnt($got,$expected,$text);
isntTest()
$bool = $test->floatIs($got,$expected); $bool = $test->floatIs($got,$expected,$places); $bool = $test->floatIs($got,$expected,$places,$text);
Vergleiche die Float-Werte $got und $expected nachdem beide Werte auf $places Nachkommastellen gerundet wurden. Ist $places nicht angegeben oder undef, wird die Anzahl der Nachkommastellen von $expected genommen.
undef
$bool = $test->isClass($ref,$class); $bool = $test->isClass($ref,$class,$text);
Vergleiche die die Klasse von $ref gegen $class. Der Test ist erfolgreich, wenn ref($ref) und $class identisch sind.
$bool = $test->isDeeply($gotRef,$expectedRef); $bool = $test->isDeeply($gotref,$expectedRef,$text);
$bool = $test->like($got,qr/$expected/); $bool = $test->like($got,qr/$expected/,$text);
likeTest()
$bool = $test->unlike($got,qr/$expected/); $bool = $test->unlike($got,qr/$expected/,$text);
unlikeTest()
$bool = $test->cmpOk($this,$op,$that); $bool = $test->cmpOk($this,$op,$that,$text);
Vergleich auf numerische Verschiedenheit:
$test->cmpOk($bigNum,'!=',$otherBigNum);
$bool = $test->diag(@msg);
@attrib = $class->MODIFY_CODE_ATTRIBUTES($ref,@attrib);
Methode, die von Perl zur Compilezeit für jede Subroutine mit Attributen gerufen wird.
Die Methode instantiiert ein Methodenobjekt für jede Testmethode und speichert sie zur späteren Analyse in der klassenglobalen Liste @Methods.
1.142
Frank Seitz, http://fseitz.de/
Copyright (C) 2019 Frank Seitz
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Quiq, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Quiq
CPAN shell
perl -MCPAN -e shell install Quiq
For more information on module installation, please visit the detailed CPAN module installation guide.