Upload
phamtruc
View
218
Download
0
Embed Size (px)
Citation preview
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]