2009-01-22 28 views
20

He escrito un pequeño script de Perl y ahora me gustaría crear un conjunto de pruebas para él. Pensé que sería bueno poder use el script como un módulo, importar los subs definidos en el script y probarlos. ¿Hay alguna manera de tener el script tanto en la secuencia de comandos Perl independiente como en el módulo Perl? (No quiero dividir la secuencia de comandos en un módulo separado y el "ejecutable", ya que planeo distribuir la secuencia de comandos como un solo archivo.)¿Cómo puedo probar una secuencia de comandos de Perl independiente?

¿O existe una mejor manera de probar la secuencia de comandos?

Respuesta

29

Dado que Brian parece estar dormido en este momento, aquí hay un indicador de lo que él llama modulinos. Esta es básicamente una receta para construir scripts que actúen como módulos o módulos que se pueden ejecutar como scripts. Suena exactamente como lo que estás buscando.

Mastering Perl es definitivamente un libro que vale la pena leer (y comprar).

+0

Gracias, esto es exactamente lo que estaba buscando. – zoul

+0

Creo que es conveniente hacer que un módulo actúe como un script, pero no veo el valor de hacer que un script actúe como un módulo. Al menos, aún no ... –

+0

La respuesta está en la pregunta (no tu pregunta, sino la original). Es mucho más fácil probar un módulo por unidad que probar la unidad en una secuencia de comandos – innaM

1

¿Por qué no escribir un banco de pruebas en un script de shell, con el script de Perl llamado como cualquier otro comando de shell?

+0

Sí, eso es sin duda una opción, pero el uso de los subs directamente me parece mucho más conveniente. – zoul

6

(no quiero dividir la secuencia de comandos en un módulo separado y el “ejecutable”, ya que tengo la intención de distribuir el script como un solo archivo.)

mayoría de las personas puntada archivos juntos como esto en tiempo de compilación App :: Ack en el CPAN es un ejemplo de algo que se puede construir de esta manera.

Si realmente desea probar su aplicación correctamente, debe colocar la funcionalidad en un módulo y luego escribir un script de prueba Test :: More-based que ejerza las funciones que proporciona el módulo. A continuación, la secuencia de comandos real es sólo un envoltorio delgado alrededor del módulo, por lo general algo como:

#!/usr/bin/env perl 
use Your::Class; 
Your::Class->new(args => \@ARGV)->run; 

Consulte también: MooseX::Getopt.

2

Depende de si desea probar el script o probar los subs que componen el script. Si desea probar el guión, entonces una prueba externa sería más apropiada, p. un guion de shell Si desea probar las funciones que componen el script, entonces puede escribir esas pruebas como más funciones dentro del script o refactorizar los elementos en un módulo Perl y probar el módulo (que usted dice que no desea hacer) .

Si la secuencia de comandos es lo suficientemente pequeña, la refabricación podría no ser necesaria. Simplemente agregue un argumento de línea de comando '-test' y llame a un sub de prueba, que a su vez prueba todo lo demás. Si hago esto, me gustaría imprimir un indicador de progreso de algún tipo (por ejemplo, un '.' Para cada prueba que aprueba).

Si la secuencia de comandos es más compleja, es posible que desee considerar la refactorización de bits en uno o más módulos y probarlos con Test::Simple o Test::More.

3

Quiero hacer lo mismo. ¿Hay alguna razón para no hacer lo siguiente? (No soy un experto en Perl, la solución parece funcionar bien para mí, sin embargo):

al comienzo de la secuencia de comandos pido un interruptor ("-test") o lo que sea y que ramificar a un sub así:

my $myargs = CmdLineOptions->new(args=>\@ARGV); 
if ($myargs->was_given(option=>"-test")) { &tests; } 

sub tests { 
    require "Test/More.pm"; 
    Test::More->import('no_plan'); 

    is(1,1,"my tests go here"); 
    exit; 
} 

(mediante el uso de requiero e importación i suprimir el mensaje que consigo cuando se utiliza el 'test de uso :: Más' sin hacer ninguna prueba '# No hay pruebas se ejecutan!'.Supongo que también reduce la sobrecarga.)

Cuestiones relacionadas