Perl/Test

De Astillas.net

Enlaces y referencias

Métodos habituales de test

Test::More

  • ok( $expresion, $nombre_del_test );
  • is_deeply( $hash_recibido, $hash_esperado, $nombre_del_test );
  • like( $expresion, qr/encontrar/, $nombre_del_test );
  • unlike( $expresion, qr/no encontrar/, $nombre_del_test);

Test::Exception

Las funciones del módulo Test::Exception hacen un uso intensivo de prototipos por lo que se las llama de forma ligeramente distinta, como por ejemplo sin comas entre los parámetros ya definidos. Si se desea no emplear dicho mecanismo basta con envolver entre paréntesis la llamada a la función y proseguir normalmente.

  • throws_ok { BLOCK } qr/$buscar_en_el_diagnostico/, $nombre_del_test;
  • throws_ok { BLOCK } $nombre_de_clase, $nombre_del_test;
  • dies_ok { BLOCK } $nombre_del_test ;
  • lives_ok { BLOCK } $nombre_de_test ;

Recetario

Módulos OOP

Lo habitual cuando el objeto de la prueba está diseñado orientado a objetos es verificar que pueda cargar y que sea capaz de crear un objeto de su clase e informar de lo obtenido de forma inequívoca:

#!/usr/bin/perl

use strict;
use Test::More;

my $class  = 'MyClass';
my %params = ( );

use_ok( $class );
my $newobject = new_ok( $class => [ %params ], q(My object factory) );

La función new_ok() sólo funciona con módulos cuyo método new() acepte una lista de parámetros y devuelva una referencia a una instancia de la clase.

En caso de no disponer de esta función se puede emplear lo siguiente:

#!/usr/bin/perl

use strict;
use Test::More;

my $class  = 'MyClass';
my %params = ( );

use_ok( $class );
my $newobject = $class->new( %params );
isa_ok( $newobject, $class);

Plan de testeo desconocido

En caso de no saber con exactitud el número de test que vamos a realizar, o si éste puede ser variable según se den ciertas condiciones podemos emplear el siguiente esquema:

#!/usr/bin/perl

use Test::More;

# 
# ... efectuamos todos los test ...
#

# terminamos 
done_testing();

Se le puede pasar como parámetro el número de test que deberían haberse realizado en caso de saberlo.

Emitiendo diagnósticos

Si los test efectuados son muy complicados de reducir a una expresión verdadero/falso siempre se puede utilizar este par de funciones que emiten veredictos y contabilizan éxitos o fracasos.

pass( $test_name )
Indica que el test nombrado ha sido pasado con éxito
fail( $test_name )
Al contrario que el anterior marca el test indicado como fallido.

Nota: Los autores recomiendan emplear este método con muchísima moderación ya que desvirtúa bastante el propósito de crear test unitarios como los aquí descritos.

Saltarse un test

Si por alguna razón tenemos que saltar un test de manera que no invalide los resultados finales podemos emplear el mecanismo de salto de test con la ayuda de un bloque de código etiquetado:

#!/usr/bin/perl

use Test::More;

SKIP: {
   eval { require Modulo::Opcional };

   skip "Mensaje explicando que nos saltamos el test", 2 if $@;

   ok( "Test número 1" );

   ok( "Test número 2" );
}

El número de test a saltarse es el segundo parámetro de skip. Los bloques pueden anidarse siempre que estén todos etiquetados con SKIP:.

Saltarse todos los test

En este caso podremos emplear el método de clase plan con el parámetro skip_all que proporciona una explicación al respecto de por qué nos saltamos todos los test.

Para el caso anterior podemos usar mejor:

#!/usr/bin/perl

use Test::More;

eval { require Modulo::Indispensable };

if ($@) {
   Test::More::plan skip_all => "No podemos hacer nada sin el módulo indispensable";
}

Modulo::Indispensable::todos_los_test();

Excepciones

Para testear la generación de excepciones y muertes súbitas en programas el módulo Test::Exception proporciona un grupo de funciones muy fáciles de usar.

use Test::More;
use Test::Exception;

dies_ok { 5 / 0; } "Divide by zero";

Existen otras funciones también muy útiles:

  • throws_ok( sub { }, qr/expected_exception/, $test_name );

Valores no definidos

Si tenemos que comprobar con valores nulos o no definidos podemos usar la función is() de la siguiente forma:

is(buscar($valor_que_no_existe),undef,'El valor no existe');
is($b,undef,'La variable b no está definida');