Profile Testing

Publicado en

Uno de los requisitos no funcionales más importantes en la actualidad es aquel que se relaciona con el desempeño (performance) de la aplicación en desarrollo. Este tópico ha cobrado aún más relevancia con la creciente tendencia hacia las soluciones web, las aplicaciones distribuidas y el procesamiento en la nube (cloud computing). Sistemas que antes operaban frente a escenarios de algunas decenas de usuarios esporádicos, ahora están expuestos a un uso mucho más intensivo, de varios cientos o miles de usuarios concurrentes.

Monitoreo del desempeño en diferentes entornos

Mucho se habla de los parámetros que se pueden o deben medir cuando se desea caracterizar el desempeño de una aplicación, ante una carga específica (load testing) o extrema (stress testing); algunos de los más comunes son[1]:

  • Cantidad de usuarios concurrentes que soporta la aplicación.
  • Tiempo promedio de respuesta del servidor.
  • Tiempo promedio de dibujado de una página web (render).
  • Tasa de ejecución de transacciones.

Sin embargo, la mayoría de las veces es insuficiente identificar los escenarios bajo los cuales la aplicación no se comporta dentro de los umbrales deseados; es necesario además aislar el problema para resolverlo de manera apropiada. Ahora bien, realizar esta tarea de manera manual puede llevar días, quizá semanas, y el nivel de certeza sobre dónde corregir es por lo regular muy bajo. Peor aún, imaginemos que nuestra aplicación no está siendo probada en un entorno controlado sino que el desempeño se degrada principalmente en las horas pico en un ambiente de producción que opera 24/7 y el problema requiere solución inmediata.

Pruebas de perfilado – Profile testing

Las pruebas de perfilado (profile testing) se centran precisamente en analizar mediante una herramienta apropiada conocida
como profiler, el comportamiento de una aplicación en tiempo de ejecución. La información que se rastrea durante una prueba de perfilado es muy variada, pero suele incluir lo siguiente[2]:

  • Secuencia, duración y frecuencia de las llamadas a uno o varios métodos dentro del sistema.
  • Utilización del CPU en un intervalo de medición.
  • Utilización de memoria:
    • Cantidad de objetos creados/sección del código don de nacieron.
    • Instancias vivas, destruidas, y su tiempo promedio de vida.
  • Utilización de recursos adicionales:
    • Accesos a disco duro.
    • Accesos a bases de datos (consultas, procedimientos almacenados, duración de la ejecución).

Las herramientas que se utilizan en este tipo de pruebas facilitan la identificación semiautomática de defectos que sería muy complicado encontrar mediante una depuración manual del código fuente o pruebas de caja blanca pues rastrean en todo el código, incluso donde los humanos no revisaríamos en primera instancia.

En contraparte, la principal desventaja de las pruebas de perfilado es la sobrecarga que puede llegar a producir, principalmente cuando se aplica a un sistema que se está ejecutando en un ambiente de producción, en el cual el desempeño se verá aún más afectado, al menos mientras se realiza el conjunto de pruebas diseñadas.

Tecnologías apropiadas

Por lo regular este tipo de prueba se aplica a sistemas desarrollados en plataformas de código administrado (aquel que no se ejecuta directamente sobre el sistema operativo, sino que lo hace a través de un ambiente de ejecución, como el bytecode de Java)[3], lo que facilita que el profiler identifique con precisión cuáles secciones del código son potencialmente grandes consumidoras de recursos y, en consecuencia, deben representar un foco de alerta para el equipo de desarrollo.

Existe en el mercado una considerable cantidad de herramientas enfocadas al profiling, desde las de código abierto (Netbeans Profiler, JBoss Profiler o SQL Server 2005/2008 Express Profiler), hasta las comerciales de las casas más reconocidas (IBM Rational PurifyPlus, dynaTrace de dynaTrace Software, y HP Diagnostics Software entre otros). Ante la gran variedad de tecnologías disponibles (servidores de aplicaciones, bases de datos, sistemas operativos, arquitecturas de hardware, etc.) la elección de una de estas opciones dependerá en buena medida de las particularidades del sistema que se esté probando y el éxito de la prueba estará regido por la pericia en la interpretación de los resultados obtenidos.

El ingeniero de pruebas de perfilado

Aunque hasta ahora nos hemos enfocado principalmente en las herramientas, la intervención humana respecto a la administración y ejecución de las pruebas de perfilado es determinante. Quien se encuentre a cargo de la prueba deberá ser capaz de realizar las siguientes actividades como parte del proyecto:

  • Elaborar y dar seguimiento a planes de prueba.
  • Diseñar y preparar escenarios de prueba.
  • Identificar las herramientas adecuadas de acuerdo a las necesidades del interesado y del proyecto.
  • Implementar scripts que ejerciten el sistema simulando cargas de cientos o miles de usuarios.
  • Listar las zonas susceptibles de ser optimizadas, considerando los recursos disponibles y las prioridades del proyecto.

Para ello, el ingeniero de pruebas involucrado en este proyecto deberá estar capacitado en las siguientes áreas:

  • Administración de proyectos.
  • Metodologías de prueba.
  • Herramientas: simulación de carga y/o stress, sistemas operativos, servidores de aplicaciones, servidores de bases de datos.
  • Desarrollo de software.

Todo lo anterior, para cubrir de manera adecuada las expectativas de la prueba de perfilado y entregar resultados apropiados de acuerdo a la complejidad de la misma.

Conclusiones

En esta ocasión hemos hablado sobre un tipo de prueba que, aunque no es del todo nueva, ha sido poco difundida en el mercado mexicano: el profiling o prueba de perfilado, que permite identificar debilidades que serían muy difíciles de encontrar eficientemente con otros métodos, a través del análisis de porciones del código fuente que eventualmente representan cuellos de botella en la aplicación.

Asimismo, el profiling es susceptible de ser aplicado tanto a sistemas en producción como a sistemas en fase de desarrollo, lo cual incrementa su utilidad, especialmente cuando el desempeño del sistema es un requerimiento crítico. En la actualidad, es viable considerar este tipo de prueba, para ser aplicada en desarrollos sobre plataformas recientes, se cuenta con herramientas de costos variados y dentro de ellas se cubre la mayoría de las tecnologías más usadas.

Referencias

[1] “Software Performance Testing”. Wikipedia. http://bit.ly/Y0CNT

[2] V. Popescu. “Java Application Profiling using TPTP”. Eclipse Organization. http://bit.ly/V1KOS

[3] O. Esqueda. “Código Administrado y No Administrado. Una Visión General”. Software Guru, Año 3, No. 6. http://bit.ly/9sx60Z

[4] S.Gupta. “Need for speed. Eliminating performance bottlenecks”. IBM Developerworks. http://bit.ly/9SMgUV

[5] Eclipse Profiler Plugin. http://bit.ly/awE6fd

 

Bio

Orlando Ezequiel Rincón es ingeniero de pruebas de caja blanca en e-Quallity. Ha participado como tester senior y líder de proyectos
de prueba en proyectos nacionales e internacionales. Orlando tiene Maestría en Ciencias por el CINVESTAV Guadalajara y es profesor de asignatura en el ITESO.