Manteniendo la casa limpia: Probando y depurando aplicativos en PHP
-
Upload
jesus-castagnetto -
Category
Technology
-
view
2.214 -
download
0
description
Transcript of Manteniendo la casa limpia: Probando y depurando aplicativos 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
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 cómo disminuirlo
● Depuración de 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 ésta 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 dónde 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, aun sin justificación, con la esperanza de que alguna de éstas dé 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 asá, 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 qué 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 éstas.
● Las pruebas deben ser independientes 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 cuáles 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 los 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: cuánto del código se usa en realidad y qué 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 bien 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 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 cualquiera 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 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 distribuida.
● Puede hacer pruebas usando múltiples protocolos: HTTP, Servicios Web (SOAP, REST), JDBC, etc.
● Usa Jython para la escritura y 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 una carga/uso
determinado, con un tiempo de respuesta especificado.
● Útil para la comparación de sistemas, algoritmos y/o librerías (benchmarking).
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, pero
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 (The Grinder)
● 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 (The Grinder)
● 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(The Grinder)● 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
Charlas relacionadas
● “Pog nunca mais! - ténicas e macetes para o desenvolvimento em php” Paulino Michelazzo
● “Integração continua com cruisecontrol e phpundercontrol” Diego Tremper
● “Qualidade no desenvolvimento de software com PHPUnit” Diego Tremper
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 depurador, 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 “bla, bla, bla...”, sin dormirse.
Jesús M. CastagnettoJesús M. [email protected]