2012-08-23 15 views
5

Estoy practicando para hacer un nuevo módulo usando Module :: Starter. He escrito algunos casos de prueba para un paquete, y funcionan bien a veces.¿Cómo depuro un módulo creado por Module :: Starter?

Sin embargo, me di cuenta de que hay dos problemas:

  • Cuando fallan los casos de prueba, quiero poner algunas declaraciones de impresión en la función que se están probando. Ejecuté make test y solo me dice que mis casos de prueba fallaron, no muestra mi salida impresa, a pesar de que estoy realmente seguro de que se han alcanzado los estados de impresión.

  • Digamos que tengo tres casos de prueba para probar una función, puse una declaración de impresión dentro de la función, cuando se ejecutan los casos de prueba, informa que solo se ejecutó 1 de los tres casos de prueba. Si elimino la declaración de impresión, se ejecutarán los tres casos de prueba. ¿Porqué es eso?

Aquí está mi código:

# package declaration and stuff... 
sub get_in { 
    my ($hash, @path) = @_; 
    my $ref = $hash; 
    print 'lol'; # This is the troublesome print statement. Remove this statement and all three test cases will run and pass 
    foreach (@path) { 
    if (ref($ref) eq 'HASH' && exists $ref->{$_}) { 
     $ref = $ref->{$_}; 
    } else { 
     return undef; 
    } 
    } 
    return $ref; 
} 

Se trata de los casos de prueba:

use Test::More tests => 3; 
use strict; 
use warnings; 
use diagnostics; 
require_ok('Foo::Doc'); 
ok(Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c') == 101); 
ok(@{ Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => [ 1, 2, 3 ] } } }, 'a', 'b', 'c') } == @{ [ 1, 2, 3 ] }); 
+3

Esta pregunta no es realmente específica de Module :: Starter. El diseño del proyecto estándar de Perl incluye un directorio 't' con las pruebas' * .t' que usan Test :: Simple o Test :: More o algo así como el éxito o el fracaso de la prueba de salida. Cada kit de herramientas de construcción de Perl proporciona herramientas para ejecutar sus pruebas y generar los resultados en el informe estándar utilizando las herramientas proporcionadas en el núcleo de Perl. – zostay

Respuesta

7

Hay algunos problemas con que las pruebas que deben ser abordados, así como su propia pregunta . Primero su pregunta:

Si desea que la salida se muestre en las pruebas, debe imprimir explícitamente al error estándar. Como buena práctica, también necesita que su salida tenga el prefijo #. El módulo Test::More proporciona herramientas que puede usar para hacer esto fácilmente.

my $got = Foo::Doc::get_in({ 'a' => { 'b' => { 'c' => 101 } } }, 'a', 'b', 'c'); 
ok($got == 101); # you probably want is() instead, see below 
diag("GOT $got"); # outputs "# GOT 101" or whatever to STDERR 

Si no desea imprimir que la producción cada vez, pero sólo cuando se solicita el registro detallado, puede utilizar note:

note("GOT $got"); 

Esto es útil cuando se utiliza para hacer funcionar su prove -v pruebas:

prove -l -v t/test.t 

también hay una función explain que volcar la salida compleja para su visualización:

diag explain $got; 
# OR 
note explain $got; 

En cuanto a sus otros problemas. Por lo general es preferible utilizar is() a ok():

is($got, 101); # gives slightly more readable output on error 

Además, al probar estructuras de datos complejas es necesario utilizar is_deeply() hacer una comparación completa:

is_deeply($got, [1, 2, 3]); 

Definitivamente, usted debe echar un vistazo a la documentación de Test::More porque hay una gran cantidad de información útil allí.

2

Para abordar su segunda pregunta, debe tener cuidado escribiendo a la salida estándar en scripts de prueba. Test::More escanea la salida estándar buscando resultados de prueba reveladores como ok 5 y not ok 6 - disgronificator enabled.Cuando escriba "lol" en la salida estándar pero no agregue una nueva línea, el módulo de prueba establecerá "lolok 9 - it works" y no lo reconocerá como resultado de la prueba. (Para mayor diversión, ponga print "not "; declaraciones antes de todas sus pruebas).

La mejor práctica es como dice zostay, para escribir en el error estándar, usando diag y las otras funciones de salida que proporciona Test::More.

Cuestiones relacionadas