2009-10-01 13 views
6

Ho uno script di test Perl scritto utilizzando Test::More. Appena prima di uscire, e se tutti i test sono passati, mi piacerebbe eseguire alcune azioni di pulizia. Se alcuni test falliscono, voglio lasciare tutto a posto per la risoluzione dei problemi.Posso sapere se tutti i test sono stati trasmessi in Perl's Test :: More?

C'è una bandiera all'interno di Test::More, o qualche altra best practice all'interno di un singolo script di test, per dire se "tutto va bene" una volta che i test sono completi?

risposta

10

È possibile accedere alla stato attuale dei test con Test::Builder, disponibile tramite 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"; 
} 

In alternativa, si può solo fare il vostro pulizia alla fine dello script, ma uscire presto se le cose vanno male, con Test::More 's BAIL_OUT("reason why you are bailing");.

C'è un sacco di altri dati e statistiche è possibile raccogliere circa lo stato delle tue prove; vedere la documentazione per Test::Builder.

+0

ho Impossibile individuare il metodo oggetto "is_passing" tramite pacchetto "test :: Builder" in linea ./put.pl 9. con Perl v5 .8.4 con 31 patch registrate (su Solaris 10): o ( – philant

+0

Anche con Test :: Più versione 0.8, ma con b migliore fortuna con Test :: Più versione 0.93. – mob

+1

Test :: builder-> is_passing() è stato aggiunto nella versione 0.89_01, vedere il file delle modifiche: http://cpansearch.perl.org/src/MSCHWERN/Test-Simple-0.94/Changes – Ether

0

Ecco quello che mi è venuta al fine di evitare l'errore "Impossibile trovare il metodo oggetto" mostrato in fondo a questa risposta:

#! /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"; 
} 

In Solaris 10, con il Perl v5.8.4 (con 31 patch registrati), ho ottenuto il seguente

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

È necessario aggiornare il test :: Distribuzione semplice - vedi le note nell'altra risposta. – Ether

+0

So che sei in Solaris, ma su ActivePerl l'aggiornamento Test :: Simple è il modo. Test :: Builder non ha la propria voce PPM nell'installazione di Win32 5.10. Mi ci sono voluti alcuni minuti per rintracciare così forse questa nota salverebbe qualcun altro il tempo. – aczarnowski

Problemi correlati