NAME
Quiq::Test::Class - Basisklasse für Testklassen
BASE CLASS
DESCRIPTION
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.
Testmethoden
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.
Aufrufreihenfolge
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.
Testobjekt
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.
Gruppierung von Testmethoden
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.
Folgende Tests überspringen
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;
}
}
METHODS
Konstruktor
new() - Konstuktor
Synopsis
$test = $class->new;
Description
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.
Getter/Setter
get() - Liefere Attributwerte
Synopsis
$val = $test->get($key);
@vals = $test->get(@keys);
Description
Liefere die Werte @vals zu den Attributen @keys. Existiert ein Attribut nicht, wird eine Exception geworfen.
set() - Setze Attribut/Wert-Paare
Synopsis
$test->set(@keyVal);
Description
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.
Directories
fixtureDir() - Liefere Pfad zum Fixture-Verzeichnis
Synopsis
$dir = $this->fixtureDir(@opt);
$dir = $this->fixtureDir($subpath,@opt);
Options
Description
Liefere den Pfad zum Fixture-Verzeichnis der Testklasse. Ist Parameter $subpath angegeben, wird diese Zeichenkette, per / getrennt, zum Pfad hinzugefügt.
testDir() - Liefere Pfad zum Testverzeichnis
Synopsis
$dir = $this->testDir;
$dir = $this->testDir($subPath);
Description
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.
testPath() - Liefere vollständigen Pfad zu Testverzeichnis/datei
Synopsis
$fullPath = $this->testPath($file);
Methoden
methods() - Liefere Liste von Testmethoden
Synopsis
@arr = $test->methods($type);
Description
Liefere die Liste der Testmethoden von Typ $type.
Folgende Typen von Testmethoden sind definiert:
Init
Foreach
Startup
Setup
Test
Teardown
Shutdown
runTests() - Führe Testmethoden aus
Synopsis
$this->runTests;
Description
Führe die Tests der Testklasse bzw. des Testobjekts $this aus. Die Methode liefert keinen Wert zurück.
skipAllTests() - Übergehe alle folgenden Tests
Synopsis
$test->skipAllTests($msg);
Alias
skipAll()
Description
Setze Abbruchmeldung $msg auf dem Testobjekt und übergehe alle folgenden Tests aller Testmethoden. Die Methode liefert keinen Wert zurück.
skipTest() - Brich Test-Methode ab
Synopsis
$test->skipTest($msg);
$test->skipTest($n,$msg);
Description
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.
Testmethoden
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.
useOk() - Prüfe, ob Modul geladen werden kann
Synopsis
$bool = $test->useOk($module);
syntaxOk() - Prüfe Syntax eines Perl-Programms
Synopsis
$bool = $test->syntaxOk($program);
$bool = $test->syntaxOk($program,$text);
Arguments
- $program
-
Name oder Pfad des Programms. Ist kein absoluter Pfad angegeben, wird das Programm über die Environment-Variable PATH gesucht.
Returns
nichts
ok() - Prüfe, ob boolscher Wert wahr ist
Synopsis
$bool = $test->ok($bool);
$bool = $test->ok($bool,$text);
Alias
okTest()
in() - Prüfe, ob Wert dem erwarteten Wert entspricht
Synopsis
$bool = $test->in($got,\@expected);
$bool = $test->in($got,\@expected,$text);
Alias
inTest()
is() - Prüfe, ob Wert dem erwarteten Wert entspricht
Synopsis
$bool = $test->is($got,$expected);
$bool = $test->is($got,$expected,$text);
Alias
isTest()
isnt() - Prüfe, ob Wert vom erwarteten Wert abweicht
Synopsis
$bool = $test->isnt($got,$expected);
$bool = $test->isnt($got,$expected,$text);
Alias
isntTest()
isText() - Prüfe, ob Wert dem erwarteten Wert entspricht
Synopsis
$bool = $test->isText($got,$expected);
$bool = $test->isText($got,$expected,$text);
Description
Im Unterschied zur Methode is(), wird auf das Argument $expected die Methode Quiq::Unindent->trimNl() angewendet. Dies ermöglicht den einfachen Vergleich im Falle eines mehrzeiligen Textes.
floatIs() - Prüfe, ob Float-Wert dem erwarteten Wert entspricht
Synopsis
$bool = $test->floatIs($got,$expected);
$bool = $test->floatIs($got,$expected,$places);
$bool = $test->floatIs($got,$expected,$places,$text);
Description
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.
isClass() - Prüfe, ob Referenz zur erwarteten Klasse gehört
Synopsis
$bool = $test->isClass($ref,$class);
$bool = $test->isClass($ref,$class,$text);
Description
Vergleiche die die Klasse von $ref gegen $class. Der Test ist erfolgreich, wenn ref($ref) und $class identisch sind.
isDeeply() - Prüfe, ob Datenstrukturen identisch sind
Synopsis
$bool = $test->isDeeply($gotRef,$expectedRef);
$bool = $test->isDeeply($gotref,$expectedRef,$text);
like() - Prüfe, ob Wert regulären Ausdruck matcht
Synopsis
$bool = $test->like($got,qr/$expected/);
$bool = $test->like($got,qr/$expected/,$text);
Alias
likeTest()
unlike() - Prüfe, ob Wert regulären Ausdruck nicht matcht
Synopsis
$bool = $test->unlike($got,qr/$expected/);
$bool = $test->unlike($got,qr/$expected/,$text);
Alias
unlikeTest()
cmpOk() - Prüfe, ob Vergleich wahr ist
Synopsis
$bool = $test->cmpOk($this,$op,$that);
$bool = $test->cmpOk($this,$op,$that,$text);
Example
Vergleich auf numerische Verschiedenheit:
$test->cmpOk($bigNum,'!=',$otherBigNum);
Ausgabe
diag() - Gib Diagnose-Nachricht aus
Synopsis
$bool = $test->diag(@msg);
Private Methoden
MODIFY_CODE_ATTRIBUTES() - Callback für Subroutines mit Attributen
Synopsis
@attrib = $class->MODIFY_CODE_ATTRIBUTES($ref,@attrib);
Description
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.
VERSION
1.220
AUTHOR
Frank Seitz, http://fseitz.de/
COPYRIGHT
Copyright (C) 2024 Frank Seitz
LICENSE
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.