Upload
itverx-ca
View
12.343
Download
4
Embed Size (px)
DESCRIPTION
Una presentación que demuestra la aplicación de nuestra experiencia en arneses de prueba, para el desarrollo de mecanismos de validación de sitios web incluyendo aplicaciones complejas.
Citation preview
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 <[email protected]>
Inmobiliarios.com.ve
agosto, 2007 / Perl Mongers, Caracas
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
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.vePruebas con Perl
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.vePruebas con Perl
Introducción Código Documentación Web
¿Qué son pruebas automáticas?
Programas que revisan a otros programasLas tareas aburridas las deben hacer las computadoras, no losprogramadores. . .Ejecutar las pruebas no debe requerir presencia humana – Laejecución manual de pruebas es un desperdicio de tiempoLas pruebas deben ser tan instantáneas como sea posiblePodemos revisar más que nuestros programas. . . Pruebas decalidad y del servicio
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
¿Qué ganamos con las pruebas?
Promovemos la automatizaciónCódigo desacopladoCódigo usable en otros programas
No perdemos funcionalidadNo ganamos funcionalidad accidentalCuando las pruebas pasan . . . ¡terminamos!Reportes de error más informativos
Mejor la salida del error que un “no funciona”Generado fácilmente por usuarios finalesAyuda cuando se porta hacia otra arquitectura
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Correctitud general de los módulos
# $Id : 00− l o a d . t , v . . . $
use Test : : More ;
my @modules = qw/ICV : : LogsICV : : HelpICV : : Help : : Node. . ./ ;
p l an t e s t s => s c a l a r @modules ;
my @ok = grep { use_ok ($_) }@modules ;
BAIL_OUT( " Load f a i l u r e " )un l e s s @ok == @modules ;
Basado en Test::More
Ejercita un use Módulo; ydetecta erroresPlan de prueba dinámicoEspecialmente efectivo paraidentificar errores de sintaxis yproblemas que previenen lacarga del móduloNo tiene sentido continuar conpruebas más profundas si nopodemos cargar los módulos:BAIL_OUT
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Pruebas con objetos. . .
ok ( $nc−>i n s e r t ," I n s e r t c a t e g o r y c1 " ) ;
i sa_ok ( $s−>add ( $nc , $_ ) ,’ Magic : : Word ’ ) ;
can_ok ( $penguin , ’ swim ’ ) ;
isa_ok() permite verificar queun objeto pertenece a una clasecan_ok() permite verificar queun objeto tiene definido unmétodo
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
¿Se parece. . . ?
i s ( $c [0]−>name , ’ c2 ’ ,’ C o r r e c t c l a s s matched ’ ) ;
i s n t ( $penguin , ’mammal ’ ) ;l i k e ( $foo , qr / bar / ) ;u n l i k e ( $baz , qr / bar / ) ;
is() Comparación sencillaisnt() Negación de la
comparación sencillalike() ¿Coincide con una
expresión regular?unlike() Negación de like()
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Correctitud general de la documentación POD
# $Id : 00−pod . t , v . . . $
use Test : : More ;e va l " use Test : : Pod" ;p l an s k i p _ a l l =>
" Test : : Pod r e q u i r e d "i f $@ ;
a l l _ p o d _ f i l e s _ o k ( ) ;
Basado en Test::Pod
plan skip_all ... permitesaltar las pruebas si Test::Podno está disponible;Verifica la estructura del PODRevisa automáticamente todoslos módulos en la distribución
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
¿Está documentado todo el código?
# $Id : 00−pod−cove rage . t , v . . . $
use Test : : More ;e va l " use Test : : Pod : : Coverage " ;p l an s k i p _ a l l =>
" Test : : Pod : : Coverage r e q u i r e d "i f $@ ;
p l an qw/ no_plan / ;
pod_coverage_ok ( ’ ICV : : C h a r l o t t e ’ ) ;
Basado enTest::Pod::CoverageVerifica que todas las funcionesvisibles externamente esténdocumentadas
. . . cuando comienzan por “_”se asumen como internas
Una clase heredada no tiene quedocumentar los métodosheredadosEn este ejemplo, no hay un plande pruebas fijo
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
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 conel web – LWP::UserAgent, WWW::Mechanize
. . . cuenta con librerías para analizar formatos comunesHTML::Parser, XML::Simple, . . .La infraestructura simplifica la escritura de las pruebasprove permite ejecutar conjuntos de pruebas arbitrarios
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Una sesión de prueba típicaPerl como arnés de prueba para aplicaciones web
$ prove −r −−t i m e r t e s t s /t e s t s / dns . . . . . . . . . . . . . . ok 13926 mst e s t s /web/ b0rk3d . . . . . . . ok 39879 mst e s t s /web/ b a s i c . . . . . . . . ok 11291 ms. . .t e s t s /web/ images . . . . . . . ok 6557 mst e s t s /web/ i n v / captcha . . ok 6456 mst e s t s /web/ i n v / submit . . . ok 52183 mst e s t s /web/ s e a r c h . . . . . . . ok 17936 msA l l t e s t s s u c c e s s f u l .F i l e s =13, Tes t s =794 , 196 w a l l s e c s
794 pruebas sobre loscomponentes mayores delsitio web
Poco más de 3 minutosTotalmente desatendidasRepetibles y consistentes
Se valida más que elsoftware: Servicios externos,configuración . . .
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
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 luse Net : : DNS;use NetAddr : : IP ;use Test : : More t e s t s => 99 ;
my $ r e s = new Net : : DNS : : R e s o l v e r ;my $dom_a = $res−>query
( ’ i n m o b i l i a r i o s . com . ve ’ ,’A ’ , ’ IN ’ ) ;
i s ($dom_a−>header−>tc , 0 ," $ns : not t r u n c a t e d " ) ;
i s ($dom_a−>header−>rcode ,’NOERROR ’ ," $ns : r e s p o n s e code " ) ;
my @dom_a = map { $_−>a d d r e s s }grep { $_−>type eq ’A ’
and $_−>c l a s s eq ’ IN ’ }$dom_a−>answer ;
i s ( s c a l a r @dom_a , 2 ," $ns : number o f s e r v e r s " ) ;
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 " ) ;
Uso de Net::DNS,NetAddr::IP y Test::Morepara simplificar el trabajo¿Se puede determinar ladirección IP del servidor web?
Respuesta completaRespuesta sin erroresLa respuesta contiene 2registros IN A
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
¿Mis páginas están disponibles?Perl como arnés de prueba para aplicaciones web
use Test : : More ;use Test : :WWW: : Mechanize ;
my @ u r l s = . . . ;p l an t e s t s => @ u r l s ∗ 2 + 7 ;my $m = new Test : :WWW: : Mechanize ;
f o r my $ u r l ( @ u r l s ){
$m−>get_ok ( $ u r l ," $ u r l i s OK" ) ;
$m−>c o n t e n t _ l a c k s ( qr / e r r o r / i ," Content − no ’ e r r o r ’ " ) ;
}
Test::WWW::Mechanizefacilita las pruebas webPlan de prueba dinámico
get_ok() ¿Se puede acceder auna página web vía elmétodo GET?
content_lacks() Evalúa si elcontenido no coincidecon una expresiónregular
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Pruebas de autorización webPerl como arnés de prueba para aplicaciones web
$m−>get ( $pag_sec ) ;
i s ($m−>s t a t u s , 401 ," acce so $pag_sec " ) ;
Verificar que la configuración delservidor requiere autorizaciónpara un determinado URLRevisamos el resultado de laoperación con status(),heredado de WWW::Mechanize
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Verificando si mis imágenes son correctasPerl como arnés de prueba para aplicaciones web
my % img =(
i c v =>{
u r l => ’ / images / i c v . png ’ ,md5 => ’ 32 de64d . . . ’ ,t ype => ’ image /png ’ ,. . .
} ,. . .) ;
f o r my $ i ( s o r t keys %img ){
my $ u r l = $base . $img{ $ i}−>{ u r l } ;$m−>get_ok ( $ u r l , " Fetch image $ i " ) ;i s ( md5_hex ($m−>con ten t ) ,
$img{ $ i}−>{md5} ," C o r r e c t image s i g n a t u r e " ) ;
i s ($m−>res−>header ( ’ Content−Type ’ ) ,$img{ $ i}−>{type } ," C o r r e c t image type " ) ;
ok ($m−>res−>header ( ’ Cache−C o n t r o l ’ ) ," Cache−C o n t r o l p r e s e n t " ) ;
}
Digest::MD5 permitecomparar fácilmente elcontenido de la imágenTambién podrían usarsemódulos como GD oImageMagick (sigaatento...)Los métodos de LWP danacceso a los encabezadosHTTP comoContent-Type yCache-Control
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Otra forma de verificar las imágenesPerl como arnés de prueba para aplicaciones web
$m−>get_ok ( $ u r l , " captcha " ) ;my $im = GD : : Image−>new
($m−>con ten t ) ;i sa_ok ( $im , ’GD : : Image ’ ,
" Captcha i s an image " ) ;ok ( ( $im−>getBounds ) [ 0 ] > 0 ,
" Captcha has non−z e r o width " ) ;ok ( ( $im−>getBounds ) [ 1 ] > 0 ,
" Captcha has non−z e r o h e i g h t " ) ;
ok ( $im−>c o l o r s T o t a l > 8 ," $s : Count o f c o l o r s " ) ;
No podemos saber de antemanoqué imagen generará uncaptcha, pero con GD evaluamosalgunas propiedades. . .
Dimensiones, víagetBounds()Número de colores, víacolorsTotal()
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl
Introducción Código Documentación Web
Prueba de formulariosPerl como arnés de prueba para aplicaciones web
$m−>form_number ( 5 ) ;$m−>f i e l d ( name => "Nombre" ) ;$m−>f i e l d ( e m a i l => ’ foo@bar . com ’ ) ;$m−>f i e l d ( rm => $o ) ;$m−>c l i c k ( ’ Cont i nua r ’ ) ;
i s ($m−>s t a t u s , 200 ," Submit got 200 " ) ;
$m−>c o n t e n t _ u n l i k e( qr / e r r o r / ,
" Content w/o ’ e r r o r ’ " ) ;
WWW::Mechanize facilita elllenado de formularios en laspáginas que probamosTest::WWW::Mechanize hacefácil determinar si el formulariose pudo procesar correctamente
Luis E. Muñoz Inmobiliarios.com.vePruebas con Perl