2009-10-05 10 views
12

¿Qué marcos y herramientas recomendaría para probar unidades y objetos simulados en Perl?¿Cuáles son los buenos marcos para pruebas unitarias y objetos simulados en Perl?

Tengo una aplicación Perl existente, que principalmente tiene acceso a la base de datos, lectura y escritura de archivos. La aplicación es básicamente un tipo de trabajo por lotes, lee muchas cosas de archivos y bases de datos y escribe un montón de archivos nuevos y algunas cosas en la base de datos.

La aplicación actualmente no tiene ninguna prueba de unidad, pero me gustaría que la aplicación de refactor tenga buenas pruebas de unidad.

¿Qué marcos y herramientas recomendaría para probar unidades y burlarse de objetos? Por ejemplo, algo similar a Hamcrest y JMock de Java?

Además, ¿hay algún buen marco de pruebas basado en el Comportamiento basado en el comportamiento (BDD, Behavior Driven Development)?

Respuesta

12

En términos de marcos de prueba, me gusta usar Test::Class, que le permite configurar jerarquías de pruebas de unidades agradables de una manera similar a JUnit. La documentación vinculada proporciona una visión general muy buena, aunque si aún no está familiarizado con las convenciones de prueba de Perl, consulte la documentación para Test::Simple y TAP, que es el formato de salida estándar para las pruebas de Perl.

Para burlarse, existe Test::Mock::Class, que es útil para configurar clases simuladas para bibliotecas fuera de su control directo, como los módulos de CPAN de los que depende su aplicación.

También existe la excelente Test::MockDBI que proporciona instalaciones especiales para burlarse de las cosas de su base de datos.

+0

Test :: Class es una fantástica herramienta para realizar pruebas basadas en objetos; es liviano y funciona con Test :: More y todas las herramientas de prueba de unidad relacionadas con Test :: Builder. –

7

Solo para añadir un poco sobre el bit BDD porque la respuesta de friedo creo que cubre todo lo demás.

echar un vistazo rápido a esta discusión Perlmonks Behavior Driven Development: suggested tools for perl?

Creo que algunas herramientas que se pueden apuntar en la dirección correcta:

Véase también esta cuestión de forma: Can you review my Perl rewrite of Cucumber?

esperanza alguna de esta ayuda.

/I3az/

6

Últimamente, con MooseX::Declare, he estado utilizando "objetos reales" como objetos simulados.

Digamos que tiene un controlador de base de datos que hace una interfaz como esta:

role Database { 
    requires 'connect'; 
    requires 'query'; 
}; 

entonces usted tiene un código como el que utiliza la base de datos:

class FooPage { 
    has 'database' => (
     is  => 'ro', 
     does  => 'Database', 
     required => 1, 
    ); 

    method get_foo() { 
     $self->database->query({ foo => 42 }); 
    } 

    method render_page(Str $user) { 
     "Hello, $user. Here is a foo for you: ". $self->get_foo; 
    } 
}; 

ahora quiere probar esto:

use Test::More tests => 2; 
use MooseX::Declare; 

my $fake_database = class with Database { 
    has 'data' => (is => 'ro', isa => 'HashRef'); 
    has 'connected' => (is => 'rw', isa => 'Bool'); 

    method connect() { $self->connected(1) } 
    method query(HashRef $query) { $self->data->{$query->{foo}} } 
}; 

my $test_database = $fake_database->name->new(
    data => { 
     42 => 'OH HAI', 
    }, 
}; 

my $foo_page = FooPage->new(database => $test_database); 
is $foo_page->get_foo, 'OH HAI', 'got correct foo'; 
is $foo_page->render_page('jrockway'), 
    'Hello, jrockway. Here is a foo for you: OH HAI', 
'got rendered page'; 

Observe cómo tiene una sintaxis concisa, pero la potencia total de un "real" Clase Moose como tu objeto simulado. Conveniente e infinitamente flexible.

(Estos son solo ejemplos ... también podría ser algo mucho mejor.)

+0

Esto se ve muy bien, pero si no estuviera usando Moose, probablemente me saltaría esto. –

Cuestiones relacionadas