2009-10-01 3 views
6

Ich habe ein Perl-Testskript geschrieben mit Test::More. Kurz vor dem Beenden, und wenn alle Tests bestanden haben, möchte ich einige Bereinigungsaktionen durchführen. Wenn irgendwelche Tests fehlgeschlagen sind, möchte ich alles für die Fehlersuche an Ort und Stelle lassen.Kann ich feststellen, ob alle Tests unter Perl's Test :: More bestanden wurden?

Gibt es ein Flag innerhalb Test::More, oder eine andere Best Practice innerhalb eines einzelnen Testskripts, um zu sagen, ob "alles ist gut", wenn die Tests selbst abgeschlossen sind?

Antwort

10

Sie können den aktuellen Status der Tests Zugriff mit Test::Builder, erhältlich über Test::More->builder:

use strict; 
use warnings; 
use Test::More tests => 1; 

ok(int rand 2, 'this test randomly passes or fails'); 

if (Test::More->builder->is_passing) 
{ 
    print "hooray!\n"; 
} 
else 
{ 
    print "aw... :(\n"; 
} 

Alternativ können Sie Ihre Bereinigung am Ende des Skripts nur tun, aber Ausgang früh, wenn die Dinge schief gehen, mit Test::More 's BAIL_OUT("reason why you are bailing");.

Es gibt viele andere Daten und Statistiken, die Sie über den Zustand Ihrer Tests sammeln können; Siehe die Dokumentation für Test::Builder. Hier

+0

ich habe Kann Objekt-Methode „is_passing“ über Paket „Test :: Builder“ auf ./put.pl Linie 9. mit Perl v5 lokalisieren .8.4 mit 31 registrierten Patches (unter Solaris 10): o ( – philant

+0

Ich habe das auch mit Test :: More Version 0.8, hatte aber b mehr Glück mit Test :: Mehr Version 0.93. – mob

+1

Test :: Builder-> is_passing() wurde in der Version 0.89_01 hinzugefügt, siehe CHANGES-Datei: http://cpansearch.perl.org/src/MSSCHWERN/Test-Simple-0.94/Changes – Ether

0

ist, was ich kam zu, um das zu vermeiden, Fehler am Ende der Antwort gezeigt „Can not Objektmethode finden“:

#! /usr/bin/perl 

use strict; 
use warnings; 
use Test::More tests => 1; 

ok(int rand 2, 'this test randomly passes or fails'); 

my $FAILcount = 0; 
foreach my $detail (Test::Builder->details()) { 
    if (${%$detail}{ok}==0) { $FAILcount++; } 
} 

if ($FAILcount == 0) { 
    print "hooray!\n"; 
} else { 
    print "aw... :(\n"; 
} 

Auf Solaris 10 mit Perl v5.8.4 (mit 31 registrierten Patches), bekam ich die folgende

Can't locate object method "is_passing" via package "Test::Builder" 
+0

Sie müssen Ihren Test aktualisieren :: Einfache Verteilung - siehe die Notizen in der anderen Antwort. – Ether

+0

Ich weiß, dass Sie unter Solaris sind, aber auf ActivePerl Upgrade Test :: Simple ist der Weg. Test :: Builder hat keinen eigenen PPM-Eintrag in meiner Win32 5.10-Installation. Es hat ein paar Minuten gedauert, bis ich herausgefunden habe, dass diese Notiz vielleicht jemand anderem die Zeit sparen wird. – aczarnowski

Verwandte Themen