Pruebas de performance, carga y de estrés

Una ayuda-memoria breve, para tener claros tres conceptos que a veces se confuden:

  • Una prueba de performance tiene como objetivo eliminar “cuellos de botella” en la ejecución de una aplicación y poder determinar una medida aceptable para su funcionamiento, por ejemplo, cuál es un tiempo de respuesta aceptable y la carga esperada en relación al número de usuarios concurrentes. Con estas metas definidas, comienza un proceso de poder detectar y optimizar los procesos donde se entrampa la ejecución del software.
  • En un test de carga, el proceso consiste en aumentar progresivamente la carga en el sistema, a través de herramientas automatizadas; en una aplicación web esto significa examinar cómo se comporta la aplicación con distintos niveles de usuarios concurrentes. El objetivo principal es asegurar que la aplicación alcanza los objetivos de performance establecidos en las pruebas de performance.
  • Las pruebas de estrés buscan forzar una falla del sistema a través del consumo excesivo de sus recursos; con el objetivo de examinar cómo falla y vuelve a su funcionamiento normal.

A partir de esto, podemos entender que estos tres tipos de pruebas apuntan a dominios y objetivos distintos: el primero, a la optimización (que la aplicación funcione rápido), el segundo a la resistencia (que la aplicación funcione rápido aun con muchos usuarios), y el tercero, a la recuperabilidad (que la aplicación continúe funcionando incluso después de que el servidor se haya reiniciado o se haya agotado su espacio en disco).

En el proceso de optimización, además de las mejoras propias al funcionamiento de la aplicación, debemos considerar una serie de mecanismos alternativos para poder asegurar su buen funcionamiento, tales como:

  • Optimización del servidor de base de datos (por ejemplo, caché de consultas, contemplar un/os servidor/es dedicado/s para bases de datos, etc).
  • Caché de objetos para evitar lecturas desde base de datos (memcached, APC, etc).
  • Utilización de sistemas de caché estático (nginx como proxy inverso, Varnish, etc).
  • Escalar vertical u horizontalmente los servidores web (a través de un balanceador de carga).

… aunque como leí por ahí, hay que tener en cuenta que optimizar para performance (solamente para performance) no es lo mismo que optimizar para carga (es decir, pueden existir algunas alternativas que permitan servir una mayor cantidad de usuarios simultáneos, pero no necesariamente de forma más rápida para cada uno de ellos).

Más información en: Agile Testing: Performance vs. load vs. stress testing

Foto: Shell Games por Lazlo Ilyes