2010-02-15 5 views
5

Quiero comenzar estrictamente haciendo Test-Driven-Development. Sin embargo, me preguntaba cuánto debería probar los métodos generados por Moose y MooseX :: FollowPBP. Por ejemplo, tengo la siguiente clase:¿Cuánto necesito para probar los métodos generados por Moose y MooseX :: FollowPBP?

package Neu::Series; 
use Moose; 
use MooseX::FollowPBP; 

use File::Find::Wanted; 

has 'file_regex' => (
    isa=>'RegexpRef', 
    is=>'rw', 
    default => sub{ 
       qr{ 
        [A-Z]  #Uppercase letter 
        [a-zA-Z]* #any letter, any number of times 
        [-]   #dash 
        (   #open capturing parenthesis 
        [0-9] 
        [0-9] 
        [0-9] 
        [0-9] 
        [a-zA-Z]? #any letter, optional 
        )   #close capturing parenthesis 
       }xms; 
      }, 
); 


has 'top_dir' => (
    isa=>'Str', 
    is=>'rw', 
); 


has 'access' =>(
    isa=>'Neu::Access', 
    is=>'ro', 
    required=>1, 

); 

1; 

Mi escritura de la prueba actual es:

use strict; 
use warnings; 
use Test::More tests => 8; 
use Neu::Access; 

BEGIN{ use_ok('Neu::Series'); } 

can_ok('Neu::Series', 'new'); 
can_ok('Neu::Series', 'set_file_regex'); 
can_ok('Neu::Series', 'get_file_regex'); 
can_ok('Neu::Series', 'set_top_dir'); 
can_ok('Neu::Series', 'get_top_dir'); 
can_ok('Neu::Series', 'get_access'); 

my $access = Neu::Access->new(dsn => 'test'); 
my $series_worker = Neu::Series->new(access => $access); 

isa_ok($series_worker, 'Neu::Series'); 

¿Es esta prueba suficiente o demasiado-mucho? (Es decir, además de las evidentes pruebas faltantes para la expresión regular).

Creo que vi una página web u otra publicación sobre esto en alguna parte, pero no he podido encontrarla hoy.

Respuesta

1

Me centraría en probar mi especificación. ¿Le dije a Moose lo que quería que hiciera correctamente?

Con este fin, me gustaría empezar con las siguientes pruebas:

  • Compruebe que lectura/escritura atributos tienen tanto un descriptor de acceso y una mutador.
  • Verifique que los atributos de solo lectura tengan un descriptor de acceso y ningún mutador.
  • Pruebe cualquier tipo de restricciones y coacciones. Verifique que solo se puedan establecer valores aceptables. Si un atributo sSi espera que VII se vea como Str y forzado a Int como 7, compruebe que sí lo hace.
+0

Gracias por su respuesta. Tienes razón en que debería probar * todo * que posiblemente podría equivocarme. –

2

Verificación de que todos los descriptores de acceso se generaron correctamente está bien ... sin embargo, hay otras cosas que puede probar en un nivel ligeramente superior, p. Ej. ¿por qué no probar que los atributos se generaron correctamente?

use Test::Deep; 
my @attrs = Neu::Series->meta->get_all_attributes; 
cmp_deeply([ map { $_->name } @attrs ], superbagof(qw(file_regex top_dir access))); 
+1

Gracias por presentarme a 'Test :: Deep'! Después de leer su respuesta, fui y miré la documentación y estoy realmente impresionado con ella. También me impresionó que 'Test :: Deep :: NoTest' te permitiera hacer todas las mismas comparaciones en una situación sin prueba. –

+1

Me gusta su idea de consultar la metaclase con fines de prueba. Me da una pausa cuando considero que esto hace que las pruebas dependan de Moose, ¿qué sucede si elijo abandonar Moose para mi proyecto (gran oportunidad de eso)? ¿Es mejor tener pruebas de recuadro negro que verifiquen que un método en particular está presente y se comporta correctamente (a un costo más complejo), o es mejor utilizar información metaclase para introspectar la clase y verificar la especificación directamente? – daotoad

+1

@daotoad: Supongo que se trata de si piensas que puedes alejarte de Moose, y de cuánto confías en cada lanzamiento de Moose para probarlo a fondo. Es bastante común que varias refactorizaciones necesiten cambiar las pruebas unitarias, y dado que el proceso de instalación de Moose es bastante sólido, en mi humilde opinión solo probaría la existencia de los atributos y luego probaré la implementación real de su clase (la lógica de la aplicación) eso no involucra a Moose). Utilizo pruebas meta-específicas en my $ work cuando pruebo la complicada composición de roles, donde es muy posible que falte un atributo. – Ether

5

No tiene sentido probar que los accesos se generaron correctamente. Si son no, lo sabrá muy rápido, porque las pruebas reales que escriba fallarán.

Moose prueba que los accesos se generan correctamente, que las clases que usan Moose obtienen un constructor, y así sucesivamente. Uno de los puntos para usar dependencias es que pueda enfocarse en escribir y probar su aplicación, no en el código auxiliar.

Estoy de acuerdo con daotoad, es probable que valga la pena probar las restricciones y las coacciones que usted mismo escribe.

+0

¡Eso es maravilloso! Gracias a ti y al resto del equipo de Moose. –

+0

Estoy de acuerdo en que no tiene sentido escribir pruebas que recapitulan el exhaustivo conjunto de pruebas de Moose, pero estoy de acuerdo con mi sugerencia de verificar accesos y mutadores. Confío en que Moose haga lo que le digo que haga: Moose siempre ha hecho exactamente lo que yo escribí. Sin embargo, no confío en mí mismo para decirle a Moose lo que quiero que haga. Es muy fácil poner 'rw' en un atributo cuando realmente quieres' ro'. Estas pruebas deben ser lo más simples posible: prueban la especificación, no la funcionalidad. – daotoad

+2

Escribí una [entrada de blog] (http://blog.urth.org/2010/02/the-purpose-of-automated-tests.html) sobre este tema. –

1

Gracias Dave, daotoad, Ether, Elliot y Brian. Al leer sus respuestas, comentarios y blogs, parece que hay dos puntos destacados:

(1) No es necesario realizar pruebas para asegurarse de que Moose haga lo que se supone que debe hacer. Creo que todos están de acuerdo en este punto.

(2) La prueba de los métodos generados por Moose es apropiada para establecer, probar y mantener su interfaz. La mayoría está de acuerdo en este punto.

Nuevamente, gracias a todos por su aporte.

EDIT:

Esto es sólo un resumen de la comunidad wiki. Por favor, lea las respuestas y comentarios individuales.

Cuestiones relacionadas