En el aseguramiento de la calidad del software , las pruebas de rendimiento son, en general, una práctica de prueba que se realiza para determinar cómo se desempeña un sistema en términos de capacidad de respuesta y estabilidad bajo una carga de trabajo específica. [ 1 ] También pueden servir para investigar, medir, validar o verificar otros atributos de calidad del sistema, como la escalabilidad, la confiabilidad y el uso de recursos.
Las pruebas de rendimiento, un subconjunto de la ingeniería de rendimiento, son una práctica de la informática que busca incorporar estándares de rendimiento en la implementación, el diseño y la arquitectura de un sistema.
Tipos de pruebas
Las pruebas que examinan el comportamiento bajo carga se clasifican en seis tipos básicos: prueba de referencia, prueba de carga, prueba de estrés, prueba de inmersión, prueba de humo o prueba de aislamiento [ 2 ] : 38–39 . Además de estos tipos básicos, se pueden realizar pruebas de configuración y pruebas de Internet.
Pruebas de referencia
Las pruebas de referencia se utilizan para establecer un punto de comparación para otros tipos de pruebas, como por ejemplo, una prueba de estrés. Al medir cómo reacciona el sistema en el "mejor de los casos", por ejemplo, con solo 5 usuarios simultáneos, se pueden utilizar otros tipos de pruebas para comparar cómo se degrada el rendimiento en el peor de los casos.
Pruebas de carga
Las pruebas de carga son la forma más sencilla de realizar pruebas de rendimiento. Generalmente, se llevan a cabo para comprender el comportamiento del sistema bajo una carga específica prevista. Esta carga puede ser el número esperado de usuarios concurrentes en la aplicación que realizan un número determinado de transacciones en un período de tiempo establecido. Esta prueba proporcionará los tiempos de respuesta de todas las transacciones críticas para el negocio. Durante la prueba, también se supervisan la base de datos , el servidor de aplicaciones , etc., lo que ayudará a identificar cuellos de botella en el software de la aplicación y en el hardware donde está instalado.
Pruebas de estrés
Las pruebas de estrés se utilizan normalmente para comprender los límites superiores de capacidad del sistema. Este tipo de prueba se realiza para determinar la robustez del sistema ante cargas extremas y ayuda a los administradores de aplicaciones a determinar si el sistema funcionará correctamente si la carga actual supera con creces el máximo previsto.
Las pruebas de picos de carga son una forma especial de prueba de estrés que consiste en aumentar o disminuir repentinamente la carga generada por un gran número de usuarios y observar el comportamiento del sistema. El objetivo es determinar si el rendimiento se verá afectado, si el sistema fallará o si podrá gestionar cambios drásticos en la carga.
Las pruebas de punto de ruptura también son una forma de prueba de estrés. Se aplica una carga incremental a lo largo del tiempo mientras se monitoriza el sistema para detectar condiciones de fallo predeterminadas. A veces, las pruebas de punto de ruptura se denominan pruebas de capacidad, ya que permiten determinar la capacidad máxima por debajo de la cual el sistema funcionará según las especificaciones requeridas o los acuerdos de nivel de servicio (SLA). Los resultados del análisis de punto de ruptura aplicado a un entorno fijo pueden utilizarse para determinar la estrategia de escalado óptima en términos del hardware necesario o las condiciones que deberían desencadenar eventos de escalado horizontal en un entorno de nube.
Prueba de inmersión
Las pruebas de resistencia , también conocidas como pruebas de estabilidad o de carga continua, se realizan para determinar si el sistema puede soportar la carga prevista. Durante estas pruebas, se monitoriza la utilización de la memoria para detectar posibles fugas. Otro aspecto importante, aunque a menudo pasado por alto, es la degradación del rendimiento, es decir, garantizar que el rendimiento y/o los tiempos de respuesta tras un periodo prolongado de actividad continua sean iguales o mejores que al inicio de la prueba. Consisten básicamente en aplicar una carga significativa al sistema durante un periodo prolongado. El objetivo es descubrir cómo se comporta el sistema bajo un uso continuo.
Pruebas de aislamiento
Las pruebas de aislamiento no son exclusivas de las pruebas de rendimiento, sino que implican repetir la ejecución de una prueba que generó un problema en el sistema. Este tipo de pruebas a menudo permite aislar y confirmar el origen del fallo.
Pruebas de configuración
En lugar de evaluar el rendimiento desde la perspectiva de la carga, se crean pruebas para determinar los efectos de los cambios de configuración de los componentes del sistema sobre su rendimiento y comportamiento. Un ejemplo común sería experimentar con diferentes métodos de equilibrio de carga .
Pruebas de Internet
Esta es una forma relativamente nueva de pruebas de rendimiento en la que aplicaciones globales como Facebook, Google y Wikipedia se someten a pruebas de rendimiento mediante generadores de carga ubicados en el continente objetivo, ya sean máquinas físicas o máquinas virtuales en la nube. Estas pruebas suelen requerir una gran cantidad de preparación y supervisión para su correcta ejecución.
Establecer objetivos de rendimiento
Las pruebas de rendimiento pueden tener diferentes propósitos:
- Puede demostrar que el sistema cumple con los criterios de rendimiento.
- Puede comparar dos sistemas para determinar cuál funciona mejor.
- Puede medir qué partes del sistema o de la carga de trabajo provocan que el sistema funcione mal.
Muchas pruebas de rendimiento se realizan sin establecer objetivos de rendimiento suficientemente realistas y orientados a resultados. Desde una perspectiva empresarial, la primera pregunta siempre debería ser: "¿Por qué realizamos pruebas de rendimiento?". Estas consideraciones forman parte del análisis de viabilidad de las pruebas. Los objetivos de rendimiento variarán según la tecnología y el propósito del sistema, pero siempre deberían incluir algunos de los siguientes:
Concurrencia y rendimiento
Si un sistema identifica a los usuarios finales mediante algún procedimiento de inicio de sesión, entonces un objetivo de concurrencia es altamente deseable. Por definición, este es el número máximo de usuarios concurrentes que se espera que el sistema admita en un momento dado. El flujo de trabajo de una transacción programada puede afectar la concurrencia real , especialmente si la parte iterativa incluye la actividad de inicio y cierre de sesión.
Si el sistema no tiene en cuenta el concepto de usuarios finales, es probable que el objetivo de rendimiento se base en un rendimiento máximo o una tasa de transacciones máxima.
Tiempo de respuesta del servidor
Esto se refiere al tiempo que tarda un nodo del sistema en responder a la solicitud de otro. Un ejemplo sencillo sería una solicitud HTTP 'GET' desde un navegador a un servidor web. En términos de tiempo de respuesta, esto es lo que miden todas las herramientas de pruebas de carga . Puede ser útil establecer objetivos de tiempo de respuesta del servidor para todos los nodos del sistema.
Tiempo de respuesta de renderizado
Las herramientas de pruebas de carga tienen dificultades para medir el tiempo de respuesta de renderizado, ya que generalmente no comprenden lo que sucede dentro de un nodo , más allá de reconocer un período de tiempo sin actividad en la red. Para medir el tiempo de respuesta de renderizado, suele ser necesario incluir scripts de pruebas funcionales como parte del escenario de prueba de rendimiento. Muchas herramientas de pruebas de carga no ofrecen esta función.
Especificaciones de rendimiento
Es fundamental detallar las especificaciones de rendimiento (requisitos) y documentarlas en cualquier plan de pruebas de rendimiento. Idealmente, esto se realiza durante la fase de desarrollo de requisitos de cualquier proyecto de desarrollo de sistemas, antes de cualquier esfuerzo de diseño. Consulte Ingeniería de rendimiento para obtener más detalles.
La especificación de rendimiento en términos de tiempo de respuesta, concurrencia, etc., generalmente se recoge en un Acuerdo de Nivel de Servicio (SLA). [ 2 ] : 24 Alternativamente, el rendimiento de un caso de prueba se puede comparar con su ejecución anterior para identificar regresiones. Dado que las mediciones de rendimiento no son deterministas, la detección de regresiones de rendimiento requiere la repetición adecuada de la carga de trabajo de las pruebas de rendimiento y pruebas estadísticas apropiadas . [ 3 ]
Además, las pruebas de rendimiento se utilizan con frecuencia como parte del proceso de optimización del perfil de rendimiento. La idea es identificar el cuello de botella : la parte del sistema que, si se optimiza su respuesta, permitirá que el sistema en general funcione más rápido. A veces resulta difícil identificar qué parte del sistema representa esta ruta crítica, y algunas herramientas de prueba incluyen (o pueden tener complementos que proporcionan) instrumentación que se ejecuta en el servidor (agentes) e informa sobre los tiempos de transacción, los tiempos de acceso a la base de datos, la sobrecarga de la red y otros parámetros del servidor, que pueden analizarse junto con las estadísticas de rendimiento sin procesar. Sin dicha instrumentación, es posible que sea necesario recurrir a la monitorización del sistema .
Las pruebas de rendimiento pueden realizarse en toda la web, e incluso en diferentes partes del país, dado que se sabe que los tiempos de respuesta de internet varían regionalmente. También pueden realizarse internamente, aunque en ese caso sería necesario configurar los routers para introducir la latencia típica de las redes públicas. La carga debe introducirse en el sistema desde puntos realistas. Por ejemplo, si el 50 % de los usuarios acceden al sistema mediante una conexión de módem de 56K y la otra mitad mediante una T1 , los inyectores de carga (ordenadores que simulan usuarios reales) deberían inyectar carga en la misma combinación de conexiones (lo ideal) o simular la latencia de red de dichas conexiones, siguiendo el mismo perfil de usuario.
Siempre es útil contar con una estimación del número máximo de usuarios que podrían utilizar el sistema en las horas pico. Si además se puede especificar el tiempo de respuesta máximo permitido (percentil 95), se podría utilizar una configuración de inyector para comprobar si el sistema propuesto cumple con dicha especificación.
Preguntas para hacer
Las especificaciones de rendimiento deberían plantear, como mínimo, las siguientes preguntas:
- En detalle, ¿cuál es el alcance de la prueba de rendimiento? ¿Qué subsistemas, interfaces, componentes, etc., están incluidos y excluidos de esta prueba?
- Para las interfaces de usuario (UI) involucradas, ¿cuántos usuarios simultáneos se esperan para cada una (especifique el valor máximo frente al valor nominal)?
- ¿Cómo es el sistema de destino (hardware) (especifique todas las configuraciones de servidores y dispositivos de red)?
- ¿Cuál es la distribución de la carga de trabajo de cada componente del sistema? (por ejemplo: 20 % inicio de sesión, 40 % búsqueda, 30 % selección de artículos, 10 % pago).
Requisitos previos
Una versión estable del sistema que debe asemejarse lo más posible al entorno de producción.
Para garantizar resultados consistentes, el entorno de pruebas de rendimiento debe estar aislado de otros entornos, como las pruebas de aceptación del usuario (UAT) o el desarrollo. Como buena práctica, siempre es recomendable contar con un entorno de pruebas de rendimiento independiente que se asemeje lo máximo posible al entorno de producción.
Condiciones de prueba
En las pruebas de rendimiento, suele ser crucial que las condiciones de prueba sean similares al uso real previsto. Sin embargo, en la práctica esto es difícil de lograr y no del todo posible, ya que los sistemas de producción están sometidos a cargas de trabajo impredecibles. Las cargas de trabajo de prueba pueden imitar las del entorno de producción en la medida de lo posible, pero solo en los sistemas más sencillos se puede replicar con exactitud esta variabilidad de la carga de trabajo.
Las implementaciones arquitectónicas poco acopladas (por ejemplo, SOA ) han generado complejidades adicionales en las pruebas de rendimiento. Para replicar fielmente los estados de producción, los servicios o activos empresariales que comparten una infraestructura o plataforma común requieren pruebas de rendimiento coordinadas, donde todos los consumidores generan volúmenes de transacciones y carga similares a los de producción en infraestructuras o plataformas compartidas. Debido a la complejidad y el alto costo que implica esta actividad, algunas organizaciones ahora utilizan herramientas para monitorear y simular condiciones similares a las de producción (también conocidas como "ruido") en sus entornos de pruebas de rendimiento ( PTE ) para comprender los requisitos de capacidad y recursos, y verificar/validar los atributos de calidad.
Momento
Para optimizar la relación costo-beneficio de un nuevo sistema, es fundamental que las pruebas de rendimiento comiencen al inicio del proyecto de desarrollo y se extiendan hasta su implementación. Cuanto más tarde se detecte un defecto de rendimiento, mayor será el costo de su corrección. Esto es cierto en el caso de las pruebas funcionales, pero aún más en el de las pruebas de rendimiento, debido a su alcance integral. Es crucial que un equipo de pruebas de rendimiento participe lo antes posible, ya que adquirir y preparar el entorno de pruebas y otros requisitos clave de rendimiento requiere mucho tiempo.
Herramientas
Las pruebas de rendimiento se dividen principalmente en dos categorías principales:
Programación de scripts de rendimiento
Esta parte de las pruebas de rendimiento se centra principalmente en la creación/programación de los flujos de trabajo de los procesos de negocio clave identificados. Esto se puede realizar utilizando una amplia variedad de herramientas.
Cada una de las herramientas mencionadas en la lista anterior (que no es exhaustiva ni completa) emplea un lenguaje de scripting (C, Java, JS) o algún tipo de representación visual (arrastrar y soltar) para crear y simular flujos de trabajo del usuario final. La mayoría de las herramientas permiten la función de "Grabar y Reproducir", mediante la cual el evaluador de rendimiento ejecuta la herramienta de prueba, la conecta a un navegador o cliente de escritorio y captura todas las transacciones de red que se producen entre el cliente y el servidor. De esta forma, se desarrolla un script que puede mejorarse o modificarse para emular diversos escenarios de negocio.
Seguimiento del rendimiento
Esto constituye la otra cara de las pruebas de rendimiento. Con la monitorización del rendimiento, se observan las características de comportamiento y respuesta de la aplicación bajo prueba. Los siguientes parámetros se suelen monitorizar durante la ejecución de una prueba de rendimiento.
Parámetros de hardware del servidor
- Utilización de la CPU
- Utilización de la memoria
- utilización del disco
- utilización de la red
Como primer paso, los patrones generados por estos cuatro parámetros ofrecen una buena indicación de dónde reside el cuello de botella. Para determinar la causa raíz exacta del problema, los ingenieros de software utilizan herramientas como analizadores de rendimiento para medir qué partes de un dispositivo o software contribuyen en mayor medida al bajo rendimiento, o para establecer niveles de rendimiento (y umbrales) que permitan mantener un tiempo de respuesta aceptable.
Tecnología
La tecnología de pruebas de rendimiento emplea uno o más PC o servidores Unix que actúan como inyectores, cada uno emulando la presencia de varios usuarios y ejecutando una secuencia automatizada de interacciones (registradas como un script o una serie de scripts para emular diferentes tipos de interacción) con el host cuyo rendimiento se está probando. Normalmente, un PC independiente actúa como coordinador de la prueba, recopilando métricas de cada inyector y organizando los datos de rendimiento para generar informes. La secuencia habitual consiste en aumentar la carga: comenzar con unos pocos usuarios virtuales e incrementar su número gradualmente hasta un máximo predeterminado. El resultado de la prueba muestra cómo varía el rendimiento con la carga, expresado como número de usuarios frente a tiempo de respuesta. Existen diversas herramientas para realizar este tipo de pruebas. Las herramientas de esta categoría suelen ejecutar un conjunto de pruebas que emulan usuarios reales frente al sistema. En ocasiones, los resultados pueden revelar anomalías; por ejemplo, si bien el tiempo de respuesta promedio puede ser aceptable, existen valores atípicos de algunas transacciones clave que tardan considerablemente más en completarse, algo que podría deberse a consultas de base de datos ineficientes, imágenes, etc.
Las pruebas de rendimiento pueden combinarse con pruebas de estrés para observar qué sucede cuando se supera una carga aceptable. ¿Se bloquea el sistema? ¿Cuánto tarda en recuperarse si se reduce una carga elevada? ¿Provoca daños colaterales su fallo?
El modelado analítico del rendimiento es un método para modelar el comportamiento de un sistema en una hoja de cálculo. El modelo se alimenta con mediciones de la demanda de recursos de transacción ( CPU , E/S de disco, LAN , WAN ), ponderadas por la combinación de transacciones (transacciones comerciales por hora). Las demandas ponderadas de recursos de transacción se suman para obtener la demanda horaria de recursos y se dividen por la capacidad horaria de recursos para obtener la carga de recursos. Utilizando la fórmula del tiempo de respuesta (R=S/(1-U), donde R=tiempo de respuesta, S=tiempo de servicio, U=carga), se pueden calcular los tiempos de respuesta y calibrarlos con los resultados de las pruebas de rendimiento. El modelado analítico del rendimiento permite evaluar las opciones de diseño y el dimensionamiento del sistema en función del uso comercial real o previsto. Por lo tanto, es mucho más rápido y económico que las pruebas de rendimiento, aunque requiere un conocimiento profundo de las plataformas de hardware.
Tareas a realizar
Las tareas para realizar dicha prueba incluirían:
- Decida si utilizar recursos internos o externos para realizar las pruebas, en función de la experiencia interna (o la falta de ella).
- Recopilar u obtener los requisitos de rendimiento (especificaciones) de los usuarios y/o analistas de negocio.
- Elabore un plan de alto nivel (o acta constitutiva del proyecto) que incluya requisitos, recursos, plazos y objetivos clave.
- Desarrolle un plan detallado de pruebas de rendimiento (que incluya escenarios y casos de prueba detallados , cargas de trabajo, información del entorno, etc.).
- Seleccione la(s) herramienta (s) de prueba.
- Especifique los datos de prueba necesarios y el esfuerzo requerido (a menudo se pasa por alto, pero es vital para llevar a cabo una prueba de rendimiento válida).
- Desarrollar scripts de prueba de concepto para cada aplicación/componente bajo prueba, utilizando las herramientas y estrategias de prueba elegidas.
- Desarrollar un plan detallado para las pruebas de rendimiento del proyecto, incluyendo todas las dependencias y los plazos asociados.
- Instalar y configurar inyectores/controlador.
- Configurar el entorno de prueba (idealmente con hardware idéntico al de la plataforma de producción), la configuración del enrutador, una red silenciosa (para evitar que otros usuarios alteren los resultados), la implementación de la instrumentación del servidor, el desarrollo de conjuntos de pruebas de bases de datos, etc.
- Realizar una prueba preliminar: antes de ejecutar la prueba de carga con usuarios predefinidos, se lleva a cabo una prueba preliminar para comprobar que el script funciona correctamente.
- Realizar pruebas, probablemente de forma repetida (iterativa), para comprobar si algún factor no tenido en cuenta podría afectar a los resultados.
- Analizar los resultados: aprobado/suspenso, o bien investigar la ruta crítica y recomendar medidas correctivas.
Metodología
Pruebas de rendimiento de aplicaciones web
Según la Red de Desarrolladores de Microsoft, la metodología de pruebas de rendimiento consta de las siguientes actividades:
- Identificar el entorno de prueba. Identifique el entorno físico de prueba y el entorno de producción, así como las herramientas y los recursos disponibles para el equipo de pruebas. El entorno físico incluye el hardware, el software y las configuraciones de red. Comprender a fondo todo el entorno de prueba desde el principio permite un diseño y una planificación de pruebas más eficientes y ayuda a identificar los desafíos de las pruebas en las primeras etapas del proyecto. En algunos casos, este proceso debe revisarse periódicamente a lo largo del ciclo de vida del proyecto .
- Identifique los criterios de aceptación del rendimiento. Defina los objetivos y las limitaciones de tiempo de respuesta, rendimiento y uso de recursos. En general, el tiempo de respuesta es una preocupación del usuario, el rendimiento es una preocupación del negocio y el uso de recursos es una preocupación del sistema. Además, identifique criterios de éxito del proyecto que no estén contemplados en dichos objetivos y limitaciones; por ejemplo, el uso de pruebas de rendimiento para evaluar qué combinación de configuraciones dará como resultado las características de rendimiento más deseables.
- Planificar y diseñar pruebas. Identificar escenarios clave , determinar la variabilidad entre usuarios representativos y cómo simularla , definir los datos de prueba y establecer las métricas que se recopilarán. Consolidar esta información en uno o más modelos de uso del sistema para su implementación, ejecución y análisis.
- Configurar el entorno de prueba. Preparar el entorno de prueba, las herramientas y los recursos necesarios para ejecutar cada estrategia, a medida que las funciones y los componentes estén disponibles para su prueba. Asegurarse de que el entorno de prueba esté instrumentado para la monitorización de recursos según sea necesario.
- Implementar el diseño de pruebas. Desarrollar las pruebas de rendimiento de acuerdo con el diseño de pruebas.
- Ejecuta la prueba. Ejecuta y supervisa tus pruebas. Valida las pruebas, los datos de prueba y la recopilación de resultados . Ejecuta las pruebas validadas para su análisis mientras supervisas la prueba y el entorno de prueba.
- Analizar resultados, optimizar y volver a probar. Analizar, consolidar y compartir los datos de resultados. Realizar un ajuste y volver a probar. Comparar los resultados de ambas pruebas. Cada mejora realizada generará una mejora menor que la anterior. ¿Cuándo detenerse? Cuando se alcanza un cuello de botella de la CPU, las opciones son mejorar el código o aumentar la capacidad de la CPU.
Véase también
- Benchmark (informática) – Evaluación estandarizada del rendimiento
- Evaluación comparativa de servidores web : estimación del rendimiento de los servidores web
- Medición del tiempo de respuesta de las aplicaciones : estándar para la gestión de cuellos de botella.
Referencias
- ↑ Thakur, Nitish (2012). "Rational Performance Tester: Consejos y trucos" (PDF) . IBM . Consultado el 3 de febrero de 2024 .
- 1 2 Molyneaux, Ian (2014). El arte de las pruebas de rendimiento de aplicaciones . ISBN 978-1-491-90054-3.
- ↑ Reichelt, David Georg; Kühne, Stefan; Hasselbring, Wilhelm (2022). "Identificación automatizada de cambios de rendimiento a nivel de código". 2022 IEEE 22nd International Conference on Software Quality, Reliability and Security (QRS) . IEEE. pp. 916–925 . doi : 10.1109/QRS57517.2022.00097 .
- Pruebas de software
- Optimización de software