2011-11-02 7 views
7

Hemos escrito analizadores para diferentes formatos de datos científicos en Perl. Recientemente, agregué un paquete de prueba con un archivo parser_*.t para cada formato y subformato.¿Cómo planificar pruebas adicionales ejecutadas por un sub externo?

Por supuesto, la API de los analizadores es exactamente la misma, solo difieren los datos leídos de los archivos de ejemplo que se utilizan para probar el análisis. Para simplificar los archivos de prueba, escribí un sub que pasa el objeto analizador y una estructura hash que representa los datos esperados. Parece que

my $parser = new MyApp::Parser($file); 
test_nested_objects = ($parser, { 
    property1 => "value", 
    property2 => 123, 
    subobject_accessor => { 
     property3 => "foobar", 
    } 
} 

El sub test_nested_objects paseos por el hash y realiza pruebas para todas las propiedades definidas en el hash, por ejemplo si se puede llamar al subobject_accessor, devuelve un objeto y ese objeto se puede llamar property3.

Comprobé cuántas pruebas ejecuta el archivo completo *.t y agregué tests => 123 a todos los archivos *.t. Ahora, agregué algunos controles a la función genérica y todos los planes son incorrectos.

¿Cómo hacer que mi plan esté al tanto de las sub pruebas? Me gustaría lograr lo siguiente:

  • número de pruebas antes de ejecutarlos de vista de progess
  • número total aumentó de forma automática → ningún cambio de los números a mano durante la edición de la sub
  • pruebas individuales en sub visible cuando se ejecuta probar (ocultar pruebas en sub y devolver solo 0 o 1 no es aceptable porque realmente necesito saber qué está mal con los datos analizados)

Espero que puedan entender. Perdón por la larga historia, pero pensé que la gente probablemente no entendería sin un poco de conocimiento previo.

Respuesta

10

La última tendencia en la planificación de pruebas es simplemente no hacerlo. Al final de su archivo de prueba, usted declara que llegado al final:

done_testing(); 

Muchos usos de un plan de pruebas existen sólo para asegurarse de que el script de prueba completado. Si vio el número correcto de pruebas, el script debe haber llegado hasta el final. Eso no es cierto, pero es una ficción conveniente y viable.

Si usted tiene que hacer algunos cálculos para determinar el número de pruebas, como la medición del tamaño de una estructura de datos, hacer eso, entonces llamar plan más tarde:

use Test::More; # don't declare the plan yet 

my $test_count = ...; 

plan tests => $test_count; 

En lugar de hacer grandes planes, sin embargo, puedes dividir tus pruebas en subtests. Cada subprueba sólo tiene que saber cuántas pruebas se ejecuta, y el guión sólo tiene que saber el número de subpruebas:

subtest some_label => sub { 
     plan tests => $n; 
     ... 
     }; 

Cada uno de sus llamadas a una función de prueba sería una prueba, y la función usaría una subprueba para hacer lo que quisiera hacer sin exponer demasiado a su interlocutor.

0

Si conoce el número de subpruebas por formato, puede hacer los cálculos de las pruebas en un bloque BEGIN antes de usar Test :: More.

Cuestiones relacionadas