Este documento presenta cómo usar Perl para automatizar planes de prueba. Explica las ventajas de las pruebas automatizadas, como evitar tareas manuales aburridas y poder ejecutar pruebas de forma más rápida y frecuente. Luego detalla cómo Perl provee bibliotecas para crear pruebas de carga de módulos, objetos, documentación POD y aplicaciones web, incluyendo ejemplos de código para probar sitios web, autorizaciones, y contenido de imágenes.
¿Cómo usar Perl para automatizar planes de prueba?
1. Introducción Código Documentación Web
Perl Productivo para Probar Programas
¿Cómo usar Perl para automatizar planes de prueba?
Luis E. Muñoz <lem@inmobiliarios.com.ve>
Inmobiliarios.com.ve
agosto, 2007 / Perl Mongers, Caracas
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
2. Introducción Código Documentación Web
Agenda
1 Introducción
2 Código
3 Documentación
4 Web
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
3. Introducción Código Documentación Web
¿Pruebas? ¿Qué son pruebas?
Lo que todos sabemos que debemos hacer, pero no hacemos . . .
Revisa que el código hace lo que se supone que debe hacer . . .
. . . con granularidad variable
. . . en varios entornos
. . . en múltiples momentos de su desarrollo
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
4. Introducción Código Documentación Web
¿Qué son pruebas automáticas?
Programas que revisan a otros programas
Las tareas aburridas las deben hacer las computadoras, no los
programadores. . .
Ejecutar las pruebas no debe requerir presencia humana – La
ejecución manual de pruebas es un desperdicio de tiempo
Las pruebas deben ser tan instantáneas como sea posible
Podemos revisar más que nuestros programas. . . Pruebas de
calidad y del servicio
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
5. Introducción Código Documentación Web
¿Qué ganamos con las pruebas?
Promovemos la automatización
Código desacoplado
Código usable en otros programas
No perdemos funcionalidad
No ganamos funcionalidad accidental
Cuando las pruebas pasan . . . ¡terminamos!
Reportes de error más informativos
Mejor la salida del error que un “no funciona”
Generado fácilmente por usuarios finales
Ayuda cuando se porta hacia otra arquitectura
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
6. Introducción Código Documentación Web
Correctitud general de los módulos
Basado en Test::More
# $ I d : 00− l o a d . t , v . . . $
Ejercita un use Módulo; y
u s e T e s t : : More ;
detecta errores
my @modules = qw/ Plan de prueba dinámico
ICV : : L o gs
ICV : : H e l p Especialmente efectivo para
ICV : : H e l p : : Node
... identificar errores de sintaxis y
/;
problemas que previenen la
p l a n t e s t s => s c a l a r @modules ;
carga del módulo
my @ok = g r e p { use_ok ( $_ ) }
@modules ;
BAIL_OUT( " Load f a i l u r e " )
No tiene sentido continuar con
u n l e s s @ok == @modules ; pruebas más profundas si no
podemos cargar los módulos:
BAIL_OUT
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
7. Introducción Código Documentación Web
Pruebas con objetos. . .
isa_ok() permite verificar que
ok ( $nc− n s e r t ,
>i
" I n s e r t c a t e g o r y c1 " ) ;
un objeto pertenece a una clase
i s a _ o k ( $s− >add ( $nc , $_ ) ,
’ Magic : : Word ’ ) ; can_ok() permite verificar que
can_ok ( $ p e n g u i n , ’ swim ’ ) ;
un objeto tiene definido un
método
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
8. Introducción Código Documentación Web
¿Se parece. . . ?
is() Comparación sencilla
i s ( $c [0]−>name , ’ c2 ’ ,
isnt() Negación de la
’ C o r r e c t c l a s s matched ’ ) ;
i s n t ( $ p e n g u i n , ’ mammal ’ ) ;
comparación sencilla
l i k e ( $foo , qr / bar / ) ;
u n l i k e ( $baz , q r / b a r / ) ; like() ¿Coincide con una
expresión regular?
unlike() Negación de like()
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
9. Introducción Código Documentación Web
Correctitud general de la documentación POD
Basado en Test::Pod
# $ I d : 00−pod . t , v . . . $ plan skip_all ... permite
u s e T e s t : : More ; saltar las pruebas si Test::Pod
e v a l " u s e T e s t : : Pod " ;
p l a n s k i p _ a l l => no está disponible;
" T e s t : : Pod r e q u i r e d "
i f $@ ;
all_pod_files_ok ();
Verifica la estructura del POD
Revisa automáticamente todos
los módulos en la distribución
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
10. Introducción Código Documentación Web
¿Está documentado todo el código?
Basado en
Test::Pod::Coverage
Verifica que todas las funciones
# $ I d : 00−pod−c o v e r a g e . t , v . . . $ visibles externamente estén
u s e T e s t : : More ; documentadas
e v a l " u s e T e s t : : Pod : : C o v e r a g e " ;
p l a n s k i p _ a l l => . . . cuando comienzan por “_”
" T e s t : : Pod : : C o v e r a g e r e q u i r e d "
i f $@ ;
se asumen como internas
p l a n qw/ n o _ p l a n / ;
Una clase heredada no tiene que
p o d _ c o v e r a g e _ o k ( ’ ICV : : C h a r l o t t e ’ ) ;
documentar los métodos
heredados
En este ejemplo, no hay un plan
de pruebas fijo
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
11. Introducción Código Documentación Web
Perl como arnés de pruebas para aplicaciones web
Perl cuenta con librerías muy poderosas para interactuar con
el web – LWP::UserAgent, WWW::Mechanize
. . . cuenta con librerías para analizar formatos comunes
HTML::Parser, XML::Simple, . . .
La infraestructura simplifica la escritura de las pruebas
prove permite ejecutar conjuntos de pruebas arbitrarios
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
12. Introducción Código Documentación Web
Una sesión de prueba típica
Perl como arnés de prueba para aplicaciones web
794 pruebas sobre los
$ p r o v e −r − i m e r t e s t s /
−t componentes mayores del
t e s t s / d n s . . . . . . . . . . . . . . ok 13926 ms
t e s t s /web/ b 0 r k 3 d . . . . . . . ok 39879 ms
sitio web
t e s t s /web/ b a s i c . . . . . . . . ok 11291 ms
...
Poco más de 3 minutos
t e s t s /web/ i m a g e s . . . . . . . ok 6557 ms Totalmente desatendidas
t e s t s /web/ i n v / c a p t c h a . . ok 6456 ms
t e s t s /web/ i n v / s u b m i t . . . ok 52183 ms Repetibles y consistentes
t e s t s /web/ s e a r c h . . . . . . . ok 17936 ms
All tests successful .
F i l e s =13 , T e s t s =794 , 196 w a l l s e c s
Se valida más que el
software: Servicios externos,
configuración . . .
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
13. Introducción Código Documentación Web
¿Pueden encontrar mi página?
Perl como arnés de prueba para aplicaciones web
#! / u s r / b i n / p e r l
u s e Net : : DNS ;
u s e NetAddr : : I P ;
u s e T e s t : : More t e s t s => 9 9 ;
Uso de Net::DNS,
my $ r e s = new Net : : DNS : : R e s o l v e r ;
my $dom_a = $ r e s − u e r y >q NetAddr::IP y Test::More
( ’ i n m o b i l i a r i o s . com . v e ’ ,
’A ’ , ’ IN ’ ) ;
para simplificar el trabajo
i s ( $dom_a− e a d e r− c , 0 ,
>h >t
" $ns : not t r u n c a t e d " ) ; ¿Se puede determinar la
i s ( $dom_a− e a d e r− c o d e ,
’NOERROR ’ ,
>h >r dirección IP del servidor web?
" $ns : r e s p o n s e code " ) ; Respuesta completa
my @dom_a = map { $_− d d r e s s } >a
g r e p { $_− y p e eq ’A ’
>t Respuesta sin errores
and $_− l a s s eq ’ IN ’ }
>c
$dom_a− n s w e r ;
>a La respuesta contiene 2
i s ( s c a l a r @dom_a , 2 ,
" $ n s : number o f s e r v e r s " ) ;
registros IN A
ok ( $dom_a [ 0 ] ne $dom_a [ 1 ] ,
" $ns : d i f f e r e n t s e r v e r s " ) ;
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
14. Introducción Código Documentación Web
¿Mis páginas están disponibles?
Perl como arnés de prueba para aplicaciones web
Test::WWW::Mechanize
u s e T e s t : : More ;
facilita las pruebas web
u s e T e s t : :W W: : M e c h a n i z e ;
W
Plan de prueba dinámico
my @ u r l s = . . . ;
p l a n t e s t s => @ u r l s ∗ 2 + 7 ;
my $m = new T e s t : :W W: : M e c h a n i z e ;
W
get_ok() ¿Se puede acceder a
f o r my $ u r l ( @ u r l s )
una página web vía el
{
$m−>get_ok ( $ u r l ,
método GET?
" $ u r l i s OK" ) ;
$m− o n t e n t _ l a c k s ( q r / e r r o r / i ,
>c content_lacks() Evalúa si el
" C o n t e n t − no ’ e r r o r ’ " ) ;
} contenido no coincide
con una expresión
regular
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
15. Introducción Código Documentación Web
Pruebas de autorización web
Perl como arnés de prueba para aplicaciones web
Verificar que la configuración del
$m−>g e t ( $ p a g _ s e c ) ;
servidor requiere autorización
para un determinado URL
i s ($m−>s t a t u s , 4 0 1 ,
" a c c e s o $pag_sec " ) ; Revisamos el resultado de la
operación con status(),
heredado de WWW::Mechanize
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
16. Introducción Código Documentación Web
Verificando si mis imágenes son correctas
Perl como arnés de prueba para aplicaciones web
my % img =
(
i c v =>
Digest::MD5 permite
{
u r l => ’ / i m a g e s / i c v . png ’ ,
comparar fácilmente el
md5 => ’ 32 de64d . . . ’ ,
t y p e => ’ image / png ’ ,
contenido de la imágen
...
}, También podrían usarse
...
); módulos como GD o
f o r my $ i ( s o r t k e y s % img ) ImageMagick (siga
{
my $ u r l = $ b a s e . $img { $ i }−>{ u r l } ;
atento...)
$m− >get_ok ( $ u r l , " F e t c h image $ i " ) ;
i s ( md5_hex ($m− o n t e n t ) ,
>c Los métodos de LWP dan
$img { $ i }−>{md5 } ,
" C o r r e c t image s i g n a t u r e " ) ; acceso a los encabezados
i s ($m− e s − e a d e r ( ’ C o n t e n t−Type ’ ) ,
>r >h
$img { $ i }−>{t y p e } , HTTP como
" C o r r e c t image t y p e " ) ;
ok ($m− e s − e a d e r ( ’ Cache−C o n t r o l ’ ) ,
>r >h Content-Type y
" Cache−C o n t r o l p r e s e n t " ) ;
} Cache-Control
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
17. Introducción Código Documentación Web
Otra forma de verificar las imágenes
Perl como arnés de prueba para aplicaciones web
$m− >get_ok ( $ u r l , " c a p t c h a " ) ; No podemos saber de antemano
my $im = GD : : Image− >new
($m− o n t e n t ) ;
>c qué imagen generará un
i s a _ o k ( $im , ’GD : : Image ’ ,
" C a p t c h a i s an image " ) ;
captcha, pero con GD evaluamos
ok ( ( $im− e t B o u n d s ) [ 0 ] > 0 ,
>g algunas propiedades. . .
" C a p t c h a h a s non−z e r o w i d t h " ) ;
ok ( ( $im− e t B o u n d s ) [ 1 ] > 0 ,
>g Dimensiones, vía
" C a p t c h a h a s non−z e r o h e i g h t " ) ;
getBounds()
ok ( $im− o l o r s T o t a l > 8 ,
>c
" $ s : Count o f c o l o r s " ) ;
Número de colores, vía
colorsTotal()
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl
18. Introducción Código Documentación Web
Prueba de formularios
Perl como arnés de prueba para aplicaciones web
$m−>form_number ( 5 ) ;
$m− i e l d ( name => " Nombre " ) ;
>f
WWW::Mechanize facilita el
$m− i e l d ( e m a i l => ’ f o o @ b a r . com ’ ) ;
>f
$m− i e l d ( rm => $o ) ;
>f
llenado de formularios en las
$m− l i c k ( ’ C o n t i n u a r ’ ) ;
>c
páginas que probamos
i s ($m− t a t u s , 2 0 0 ,
>s
" Submit g o t 200 " ) ; Test::WWW::Mechanize hace
$m− o n t e n t _ u n l i k e
>c
( qr / e r r o r / , fácil determinar si el formulario
" C o n t e n t w/ o ’ e r r o r ’ " ) ;
se pudo procesar correctamente
Luis E. Muñoz Inmobiliarios.com.ve
Pruebas con Perl