Manteniendo la casa limpia: Probando y depurando aplicativos en PHP
1. 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
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
2. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
3. Programar es una mezcla
de ciencia, ingeniería y arte.
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
4. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
5. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
6. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
7. Problema: Hemos implementado
un algoritmo complejo y no da los
resultados esperados.
?
¿ “Pero ésta es la versión simplificada
para el público en general...”
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
8. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
9. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
10. Soluciones
que no son
soluciones.
Causan más
dolor y
problemas
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
11. ¿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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
12. ¿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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
13. ¿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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
14. Solución: Usar la herramienta
correcta para el trabajo.
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
15. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
16. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
17. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
18. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
19. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
20. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
21. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
22. Xdebug (www.xdebug.org)
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
23. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
24. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
25. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
26. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
27. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
28. PHPUnit (www.phpunit.de)
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
29. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
30. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
31. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
32. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
33. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
34. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
35. Selenium
(selenium.openqa.org)
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
36. ¿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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
37. Selenium
Múltiples
herramientas
con un mismo
objetivo: facilitar
la prueba de los
aplicativos web.
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
38. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
39. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
40. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
41. The Grinder (grinder.sf.net)
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
42. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
43. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
44. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
45. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
46. Arquitectura (The Grinder)
● Contextos:
Multi-hilos,
multi-procesos
● Sistema
distribuido
● Escalable
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
47. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
48. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
49. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
50. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
51. 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, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia
52. ¡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. Castagnetto
jmcastagnetto@php.net
jesus@upch.edu.pe
Jesús M. Castagnetto M., Ph.D. - Facultad de Ciencias y Filosofía, y
Dirección Universitaria de Información, Universidad Peruana Cayetano Heredia