NAME

Quiq::Test::Class - Basisklasse für Testklassen

BASE CLASS

Quiq::Object

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()).

o

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.

o

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.

o

Test(N)

Die normale Testmethode ist vom Typ Test(N), sie wird im Zuge des Gesamttests genau einmal aufgerufen.

o

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).

o

Startup(N), Shutdown(N)

Mit jedem Iterationsschritt werden alle Testmethoden vom Typ Startup(N) aufgerufen, am Ende alle Testmethoden vom Typ Shutdown(N).

o

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

-create => $bool (Default: 0)

Erzeuge Verzeichnis, falls es nicht existiert.

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()

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()

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.135

AUTHOR

Frank Seitz, http://fseitz.de/

COPYRIGHT

Copyright (C) 2019 Frank Seitz

LICENSE

This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.