jueves, 20 de diciembre de 2018

PRUEBAS DE RENDIMIENTO



Las pruebas de rendimiento son un conjunto de pruebas que nos permiten medir la velocidad de ejecución de una serie de tareas en un sistema, bajo unas condiciones determinadas.
De esta forma, podremos:
  • Demostrar si el sistema cumple con los criterios establecidos
  • Comparar sistemas para evaluar cuál de ellos se ejecuta más rápido
  • Detectar cuellos de botella (qué partes del sistema se ejecutan de una manera menos óptima afectando de esta manera a la ejecución global).

  2.1 Tipos de pruebas

Existen diferentes tipos de pruebas de rendimiento, siendo las más destacadas:

·         2.1.1 Pruebas de carga: 

Una prueba de carga se ejecuta para comprender el comportamiento de un sistema ante una carga determinada. Esta carga puede ser el número de usuarios esperado en producción o un número de transacciones durante un tiempo determinado.
El objetivo de este tipo de pruebas es determinar cuáles son las transacciones más críticas para una posible optimización de las mismas, detectando posibles cuellos de botella y corrigiendo los mismos para mejorar el rendimiento. 

·         2.1.2 Pruebas de stress: 

Estas pruebas son utilizadas normalmente para someter a la aplicación al límite de su funcionamiento mediante la ejecución de un número de usuarios muy superior al esperado, o bien, mediante la substracción de recursos (también conocidas como pruebas negativas donde se simula por ejemplo el fallo de un servidor en clúster).
La finalidad de este tipo de prueba es la de determinar la robustez de una aplicación cuando la carga es extrema facilitando la configuración de las alarmas del sistema cuando se alcancen ciertos límites. 

·         2.1.3 Pruebas de resistencia: 

Se realizan con el fin de determinar si la aplicación puede mantener la carga esperada de manera continuada y durante un largo periodo de tiempo. El objetivo principal de este tipo de pruebas es verificar que no existen fugas de memoria o procesos que pierdan rendimiento transcurrido un cierto periodo de tiempo. 

  2.2 ¿Cuándo debemos ejecutar este tipo de pruebas?

Para alcanzar en un sistema un nivel de rendimiento acorde con los criterios establecidos, es fundamental que los esfuerzos en estas pruebas comiencen desde el inicio del desarrollo y se amplíen durante su construcción. 
Cuanto más se tarde en detectar un defecto de rendimiento, mayor es el coste de la solución. Esto es cierto en el caso de las pruebas funcionales, pero mucho más en las pruebas de rendimiento. 

  2.3 ¿Cómo debemos ejecutarlas?

En las pruebas de rendimiento es imprescindible que las condiciones de prueba sean similares a las esperadas en el uso real. De no ser así, las conclusiones a las que lleguemos serán difícilmente extrapolables al entorno productivo.
Tenemos contras con un plan de pruebas detallado en que debemos tener identificados los casos de uso más representativos que serán el objeto de nuestro estudio.
La ejecución de estas pruebas lleva un trabajo de preparación, recolección y análisis, por lo que es importante planificarlas dentro de nuestro roadmap de proyecto.

 2.4 ¿Qué etapas debemos seguir?

En la siguiente imagen se muestra un ejemplo del conjunto de pasos/etapas que debemos tener en cuenta a la hora de realizar nuestras pruebas de rendimiento:



  • En la etapa de planificación definiremos nuestra estrategia de pruebas, fijando unos objetivos que sean medibles, concretos y evaluables, y así, obtendremos la información necesaria relativa a los entornos que vamos a necesitar, herramientas, personas implicadas, etc. Y analizaremos los casos de prueba que van a ser incluidos en nuestras pruebas de rendimiento.

  • Durante la fase de preparación realizaremos el aprovisionamiento necesario, configuraremos monitores que nos permitan obtener los datos de la ejecución de pruebas, y realizaremos unas pequeñas pruebas de humo que nos permitan determinar que todo está correctamente configurado y listo para la siguiente fase.

  • Estableceremos una línea fase gracias a la preparación realizada y comenzaremos con la ejecución de los diferentes tipos de prueba que queramos realizar.

  • Finalmente, en la fase de resultados, tendremos que recopilar los datos de los monitores, evaluar la información y realizar un informe con las conclusiones que hayamos sacado tras el estudio realizado. En dicho informe debemos reflejar aquellos aspectos que influyen de forma negativa en el sistema, de forma que puedan ser adaptados y/o mitigados.

  • Tras los cambios introducidos debemos volver a realizar todo el ciclo definido con el objetivo de poder comparar el sistema antes de los cambios y tras los mismos, determinando si las mejoras aplicadas han sido efectivas o es necesario seguir adaptando elementos del sistema.

HERRAMIENTA JMETER


Dentro del ciclo de desarrollo de software, uno de los puntos no menos importantes por nosotros los desarrolladores son las pruebas de rendimiento. Resulta bastante el crear pruebas unitarias como para que encima de todo dediquemos tiempo para someter a nuestra aplicación a una carga de estrés y tener idea sobre su comportamiento bajo varias peticiones concurrentes.
JMeter es una herramientas que nos permite someter a nuestra aplicación a pruebas de carga, es decir, podemos simular en nuestros entornos de desarrollo la carga de peticiones concurrentes que nuestra aplicación podría tener en determinado momento en el entorno productivo.

3.1 Introducción a JMETER

La aplicación Apache JMeter ™ es un software de código abierto, una aplicación Java 100% pura diseñada para cargar el comportamiento funcional de la prueba y medir el rendimiento. Originalmente fue diseñado para probar aplicaciones web, pero desde entonces se ha expandido a otras funciones de prueba.

3.2 ¿Qué puedo hacer con eso?

Apache JMeter se puede utilizar para probar el rendimiento tanto en recursos estáticos como dinámicos, aplicaciones dinámicas web.
Se puede usar para simular una carga pesada en un servidor, grupo de servidores, red u objeto para probar su resistencia o para analizar el rendimiento general bajo diferentes tipos de carga.
Las características de Apache JMeter incluyen:
La capacidad de carga y el rendimiento prueban muchas aplicaciones / servidores / tipos de protocolo diferentes:
Web: HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, ...)
Servicios Web de SOAP / REST
FTP
Base de datos a través de JDBC
LDAP
Middleware orientado a mensajes (MOM) a través de JMS
Correo: SMTP (S), POP3 (S) e IMAP (S)
Comandos nativos o scripts de shell
TCP
Objetos Java
IDE de prueba con todas las funciones que permite la grabación rápida del plan de prueba (desde navegadores o aplicaciones nativas), compilación y depuración.
Modo de línea de comandos (modo no GUI / sin cabeza) para cargar la prueba desde cualquier SO compatible con Java (Linux, Windows, Mac OSX, ...)
Un informe HTML completo y listo para presentar.
Correlación sencilla mediante la capacidad de extraer datos de los formatos de respuesta más populares, HTML, JSON, XML o cualquier formato de texto
Portabilidad completa y pureza 100% Java.
El marco completo de subprocesos múltiples permite el muestreo simultáneo por muchos subprocesos y el muestreo simultáneo de diferentes funciones por grupos de subprocesos separados.
Caché y análisis / reproducción fuera de línea de los resultados de las pruebas.
Núcleo altamente extensible:
Los muestreadores enchufables permiten capacidades de prueba ilimitadas.
Muestreadores de secuencias de comandos (lenguajes compatibles con JSR223 como Groovy y BeanShell)
Se pueden elegir varias estadísticas de carga con temporizadores conectables.
Los complementos de análisis y visualización de datos permiten una gran extensibilidad y personalización.
Las funciones se pueden utilizar para proporcionar una entrada dinámica a una prueba o para proporcionar manipulación de datos.
Fácil integración continua a través de bibliotecas de código abierto de terceros para Maven, Gradle y Jenkins.

3.3 ¿Cómo lo hago?

Usando JMeter para entender cómo usarlo
Referencia del componente para tener información detallada para cada elemento de prueba
Funciones de referencia para tener información detallada y ejemplos para cada función.
Referencia de propiedades para todas las propiedades que le permiten personalizar JMeter
Documentación API Javadoc
Preguntas frecuentes de JMeter (Wiki)

3.4 JMeter Wiki

Creación de JMeter y complementos para uso avanzado
JMeter no es un navegador
JMeter no es un navegador, funciona a nivel de protocolo. En lo que respecta a servicios web y servicios remotos, JMeter se parece a un navegador (o más bien, a múltiples navegadores); sin embargo, JMeter no realiza todas las acciones admitidas por los navegadores. En particular, JMeter no ejecuta el Javascript que se encuentra en las páginas HTML. Tampoco representa las páginas HTML como lo hace un navegador (es posible ver la respuesta como HTML, etc., pero los tiempos no se incluyen en ninguna muestra, y solo una muestra en un hilo se muestra a la vez).

3.5      Ejecución de JMETER en Windows 7/8/10

3.5.1 Requisitos:

Java 8 o superior
Librerías JDK/SDK 1.4 de sun o superior
Librería JDK 5.0 de sun o superior.


3.5.2  Instalación:

1.- Verificamos que versión de java está instalado en nuestro equipo.
         Entramos al cmd y ejecutamos el comando java –version



2.- Descargamos Apache JMETER desde:
 







Descargar el archivo apache-jmeter-5.0.zip
3.- Extraemos o descomprimimos el Apache JMeter
4.- Una vez extraído o descomprimido el archivo, nos dirigimos a la Carpeta Bin y ejecutamos el archivo jmeter.bat como administrador




5.- Se abrirá dos ventanas:
            Una de la consola de ejecución de JMeter


            Y el otro el programa en sí.





3.6 PRUEBAS DE CARGA CON JMETER

Se va a ingresar datos en el JMeter a 2 páginas web con los siguientes parámetros:
Usuario
Segundos
Repeticiones
30
5
1
60
10
1

Las páginas web de prueba son las siguientes:

CONCLUSIONES


El entorno dinámico de las organizaciones consumidoras de software, el aumento de oferta de productos de calidad y el incremento de proveedores de servicios informáticos, han llevado a los usuarios de los productos de software a convertirse en agentes activos del proceso de desarrollo de software sacando máximo provecho de la aplicaciones, realizando críticas sobre el desempeño, y sobre todo forzando a los productores a desarrollar aplicativos más eficientes, con mayor funcionalidad y sobre todo, productos de mejor calidad.

El objetivo de las pruebas de rendimiento no es encontrar errores, sino eliminar los cuellos de botella del rendimiento, analizando los tiempos de respuesta (velocidad), el uso de recursos (estabilidad), así como determinar la carga máxima de usuarios que puede soportar la aplicación (escalabilidad).