manteniendo la casa limpia: probando y depurando ... · dirección universitaria de información,...

51
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia Manteniendo la casa limpia: Probando y depurando aplicativos en PHP Jesús M. Castagnetto, Ph.D. Latinoware 2008 30 de Octubre – 1 de Noviembre, 2008 Parque Tecnológico Itaipu (PTI) Foz do Iguaçu PR/Brasil

Upload: phamtruc

Post on 20-Dec-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Manteniendo la casa limpia: Probando y depurando

aplicativos en PHP

Jesús M. Castagnetto, Ph.D.

Latinoware 200830 de Octubre – 1 de Noviembre, 2008

Parque Tecnológico Itaipu (PTI)Foz do Iguaçu PR/Brasil

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Agenda

● El sufrimiento del programador y como disminuirlo

● Depuración del código, y perfiles de rendimiento del aplicativo.

● Pruebas unitarias.● Pruebas de carga y estrés.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Programar es una mezcla de ciencia, ingeniería y arte.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

No es suficiente el conocer la teoría, técnicas y conceptos.

Necesitamos aprender de la experiencia de otros.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Las buenas prácticas surgen del conocimiento comunitario, y nos ayudan a evitar los problemas comunes, para así concentrarnos en los que son importantes.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Problema: Estamos por finalizar un proyecto, y el nuevo código no se integra como se planeó.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

“Pero esta es la versión simplificadapara el público en general...”

Problema: Hemos implementadoun algoritmo complejo, y no da losresultados esperados.

?¿

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Problema: Error aleatorio pero crítico. Proyecto con decenas de miles de líneas de código. Tienes poco tiempo y no lo escribiste tú.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Problema: El aplicativo funciona muy lento y no sabemos donde comenzar a optimizar.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Soluciones que no son soluciones.

Causan más dolor y problemas

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

¿Soluciones o Problemas?

● El expresivo: Usa echo, print(), print_r(), var_dump(), etc., hasta encontrar el problema.

● El silencioso: Silencia código comentándolo hasta que funciona. Luego activarlo de a pocos y reza mucho para que funcione.

● El rectificador: Escribe código que “arregle” el problema causado.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

¿Soluciones o Problemas?

● El inconstante: Prueba varias librerías o rutinas, aún sin justificación, con la esperanza que alguna de estas de el resultado esperado.

● El copista: Usa algo como Google Code Search para encontrar código que puede que funcione, sin entender lo que hace.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

¿Soluciones o Problemas?

● El maestro de vudú: “Tengo que poner esta constante acá, luego haré las operaciones así y asa, y en este orden, pues la otra vez funcionó”.

● El marquetero: “Redefine” el problema para que sea una “característica” positiva o nueva, y no algo que necesita arreglo.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Solución: Usar la herramienta correcta para el trabajo.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Soluciones● Usar depuradores de

código.● Hacer un perfil de

uso del aplicativo.● Emplear técnicas de

prueba de código.

● Probar al aplicativo como un todo para ver su “resistencia”.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Depurador de código● Herramienta

para probar y encontrar errores en la ejecución de software.

● Rastrea cambios en variables, puede detener la ejecución, etc.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Analizador del rendimiento

● Captura el perfil de comportamiento de una pieza de software.

● Permite conocer exactamente que partes son los cuellos de botella.

● Muestra el comportamiento real de las diversas partes, lo que a veces no corresponde a lo que habíamos diseñado o modelado.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Pruebas unitarias

● Probar en forma independiente los componentes de un aplicativo.

● Se prueba a varios niveles de detalle, desde una función o método, hasta toda una clase o colección de estas.

● Cada prueba debe ser independiente del resto, para poder ser compuestas en forma coherente.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Pruebas de carga

● Trata de descubrir el comportamiento de un aplicativo frente a diferentes niveles de demanda.

● Nos da una idea de cuan escalable es el software, y cuales son sus límites prácticos.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Pruebas de estrés● Busca encontrar los

límites de respuesta de un aplicativo.

● Se trata de llegar más allá del uso normal.

● Observa: recuperación de errores, degradación de la respuesta, etc.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Pruebas...muchas pruebas● Funcionalidad,● Seguridad,● Cobertura/uso del

código.● Regresión,● Usabilidad y

accesibilidad,● Compatibilidad, etc.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Xdebug (www.xdebug.org)

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Xdebug - Características

Una herramienta multifacética:● Depurador de código (Debugger).● Analizador de perfil de rendimiento

(Profiler).● Analizador de cobertura de uso del

código (Code Coverage)● Sesiones interactivas de análisis.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Xdebug: Depuración

● Rastreo completo de las cambios de valores de variables y sus contextos.

● Listado completo de las llamadas a funciones, incluyendo parámetros, uso de memoria, etc.

● Protección contra recursión infinita.● Puede guardar los resultados a un

archivo para un análisis detallado.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Xdebug: Rendimiento

● Permite el análisis del rendimiento de cada componente del aplicativo.

● Acumula los tiempos de ejecución de cada función y método, así como cuantas veces que fueron llamados.

● Los datos son almacenados en un formato que puede visualizarse con KCacheGrind, WinCacheGrind o MacCallGrind.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Xdebug: Uso del código

● Se puede analizar la cobertura del código: cuanto del código se usa en realidad, y que partes nunca se emplean.

● El análisis es dependiente del tipo de ejecución y proceso que se esté probando.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Xdebug: Juega con otros

● Podemos iniciar una sesión de depuración en forma remota.

● Soporta los protocolos GDB y DBGp para depuración.

● Esto le permite acceder a una gran variedad de herramientas de depuración remota, en múltiples plataformas, con interfaz gráfica o de línea de comandos.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

PHPUnit (www.phpunit.de)

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Pruebas, no print()'s

“Cada vez que estén tentados a escribir un comando print o una expresión de depuración, escriban una prueba unitaria”

Martin Fowler

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Pasos básicos

● Escribe una prueba antes o inmediatamente después de escribir tu código. class Foo {

...}

class FooTest extends PHPUnit_Framework_TestCase { ...}

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Pasos básicos

● Cada prueba es un método público llamado testXYZ.

class Foo { function boing() {}}

class FooTest extends PHPUnit_Framework_TestCase { public function testBoing(){}}

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Mentiras “blancas”

● Cuando las pruebas requieren interacción con otros componentes o sistemas, se pueden usar objetos que simulen estos (Mock Objects).

● PHPUnit provee ayuda en la creación de objetos de este tipo, hasta el punto de generar uno con sólo métodos específicos simulados.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Automatizando el proceso

● PHPUnit tiene la opción de integrarse con Selenium, para pruebas instrumentadas de aplicativos web.

● Existen también herramientas que lo integran dentro un sistema de integración continua:

phpUnderControl (www.phpundercontrol.org)

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Recomendaciones

● Las pruebas deben de usar las funciones de aserciones que provee PHPUnit:assertEquals(), assertTrue(), etc.

● Organizar las pruebas en un conjunto relacionado.

● Probar lo importante, lo que puede rendir dividendos en información.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Selenium (selenium.openqa.org)

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

¿Qué es Selenium?

● Un sistema de pruebas de aplicativos web, simple, portable y extensible.

● Las pruebas pueden ser escritas como tablas en HTML, o en varios lenguajes de programación, y ejecutados en un navegador web.

● Puede automatizarse usando una herramienta de pruebas (ej. PHPUnit)

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Selenium

Múltiplesherramientascon un mismoobjetivo: facilitarla prueba de losaplicativos web.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Selenium IDE

● Es una extensión para Firefox que permite el: grabar, editar y depurar pruebas.

● Puede seleccionar elementos de la página en forma selectiva.

● Puede completar automáticamente código o selecciones.

● Guarda pruebas en HTML o Ruby.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Selenium RC

● Un servidor escrito en Java, que acepta comandos para el navegador a través HTTP.

● Se usa para realizar pruebas automáticas empleando uno de los lenguajes de programación populares (PHP, Java, Python, etc.)

● Puede iniciar selectivamente un navegador y ejecutar las pruebas.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Selenium Grid

● Un sistema para ejecutar pruebas en paralelo, en múltiples máquinas y en ambientes heterogéneos.

● Permite el ejecutar múltiples copias de Selenium RC, en la misma o múltiples plataformas.

● Integra y controla estas múltiples instancias, haciéndolas parecer como una sola, simplificando el manejo.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

The Grinder (grinder.sf.net)

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Características

● Permite ejecutar pruebas de carga y estrés en forma distribuída.

● Puede hacer pruebas usando múltiples protocolos: HTTP, Servicios Web (SOAP, REST), JDBC, etc.

● Usa Jython para la automatización de las pruebas.

● Los resultados se ven gráficamente.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Tipos de pruebas

Pruebas de carga● Si puede soportar un carga/uso

determinado, con un tiempo de respuesta especificado.

● Útil para la comparación de sistemas, algoritmos y/o librerías.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Tipos de pruebas

Pruebas de capacidad● La carga máxima que puede soportar

el sistema antes de una falla total.

Pruebas funcionales● Probar si el aplicativo tiene el

comportamiento esperado.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Tipos de pruebas

Pruebas de estrés● Es una prueba de carga, ejecutada

por un periodo extendido.● Permite la evaluación de estabilidad

y confiabilidad de un aplicativo, bajo un carga dada por un tiempo determinado.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Arquitectura

● Contextos: Multi-hilos, multi-procesos

● Sistema distribuido

● Escalable

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Manejo y control

● Coordinación y vigilancia de los procesos.

● Consolidación de resultados entre múltiples instancias.

● Puede acumular estadísticas de lo que se le pida, y reportarlas.

● Registros son almacenados para posterior análisis.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Creación de pruebas

● Puede grabar las interacciones de usuarios reales, y usarlas como base para ejecutar pruebas.

● Usa Python (Jython), lo que le permite ser flexible y expresivo.

● La pruebas se pueden parametrizar y contener rutas de decisión o lazos de ejecución.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Otros recursos

● OWASP (www.owasp.org)Comunidad enfocada en el problema de asegurar la seguridad de aplicativos web.

● PHP Security Consortium (phpsec.org)Todo acerca de seguridad de aplicativos escritos en PHP.

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

Otros recursos

● SimpleTest (simpletest.org)Otra opción para hacer pruebas unitarias en PHP.

● Zend Studio (www.zend.com)Un IDE comercial que incluye depudaror, gestor de proyectos, etc.

● Open source software testing tools (www.opensourcetesting.org)Lista de aplicativos para pruebas

Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, yDirección Universitaria de Información, Universidad Peruana Cayetano Heredia

¡Gracias/Obrigado!

A los organizadores del evento por la invitación y el entusiasmo.

A todos ustedes por “soportar” mi cháchara interminable, sin dormirse.

Jesús M. [email protected]

[email protected]