Pruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6

  1. Inicio
  2. Blog
  3. Pruebas de software

Pruebas de software

Pruebas de carga versus pruebas de estrés: Diferencias, métricas y ejemplos de k6

Uno demuestra que su sistema maneja el tráfico que espera. El otro descubre dónde se rompe y cómo se recupera. Aprenda cuándo ejecutar cada uno, en qué números confiar y cómo planificar una prueba que brinde respuestas reales.

9 min de lectura
Pruebas de carga versus pruebas de estrés: diferencias, métricas y ejemplos de k6

Puntos clave

  • Las pruebas de carga verifican que un sistema cumpla con sus objetivos bajo el tráfico esperado.
  • Las pruebas de estrés superan la capacidad para encontrar el punto de ruptura y estudiar la recuperación.
  • Las herramientas suelen ser las mismas. Lo que difiere es el objetivo y el patrón de tráfico.
  • Juzgue los resultados con percentiles como p95 y p99, ya que los promedios pueden ocultar problemas graves.

Tu aplicación funciona perfectamente con diez usuarios. ¿Qué pasa el día de la venta, con diez mil? Pruebas de carga versus pruebas de estrés describe dos formas diferentes de responder a esta pregunta, y mezclarlas conduce a pruebas que no prueban lo que usted cree que sí.

Esta guía explica qué muestra cada uno, los tipos de pruebas relacionadas y cómo leer los resultados. Ejecutamos el cálculo del percentil pequeño a continuación en Python 3.13, con números simulados. Los scripts k6 son ejemplos ilustrativos que no ejecutamos, y los recuentos de usuarios y los objetivos son inventados, así que reemplácelos por los suyos propios. Ejecute estas pruebas únicamente en sistemas de su propiedad o que tenga permiso para realizar pruebas, ya que el tráfico intenso puede parecer un ataque y provocar interrupciones reales.

La respuesta corta

Una prueba de carga pregunta: ¿podemos manejar el tráfico que esperamos y cumplir nuestros objetivos mientras lo hacemos? Una prueba de estrés pregunta: ¿cuánto podemos tomar antes de fallar, cómo fallamos y qué tan rápido nos recuperamos?

Piense en un puente. Una prueba de carga recorre el número esperado de camiones y confirma que está bien. Una prueba de estrés sigue agregando peso para conocer su límite y si avisa primero. Afortunadamente, es más barato romper un software que un puente.

Pruebas de carga frente a pruebas de estrés una al lado de la otra

Aspecto Pruebas de carga Pruebas de estrés
pregunta principal ¿Cumplimos los objetivos con la carga esperada? ¿Dónde y cómo rompemos?
Nivel de tráfico Pico normal a esperado Más allá del pico esperado
Patrón Sube, mantente firme Sigue aumentando hasta el fracaso.
fracaso Una prueba fallida El resultado esperado
Métricas clave Tiempo de respuesta, rendimiento, errores. Punto de ruptura, modo de falla, tiempo de recuperación
Momento típico Antes de cada lanzamiento o evento importante Después de que el sistema esté estable bajo carga
Resultado Aprobar o fallar contra objetivos Un límite de capacidad y una lista de puntos débiles

¿Qué son las pruebas de carga?

Las pruebas de carga simulan el tráfico realista esperado y miden cómo se comporta el sistema. Necesita un objetivo con el que realizar la prueba, por ejemplo: “con 500 usuarios simultáneos, el 95 % de las solicitudes de pago finalizan en 800 ms, con menos del 1 % de errores”.

Así es como podría verse como un script k6. Las pruebas de k6 están escritas en JavaScript y thresholds convierten sus objetivos en un resultado de aprobado o reprobado:

import http from "k6/http";
import { sleep } from "k6";

export const options = {
  stages: [
    { duration: "5m", target: 500 },   // ramp up
    { duration: "20m", target: 500 },  // hold at expected peak
    { duration: "2m", target: 0 },     // ramp down
  ],
  thresholds: {
    http_req_duration: ["p(95)<800"],
    http_req_failed: ["rate<0.01"],
  },
};

export default function () {
  http.get("https://staging.example.com/products");
  sleep(1);   // think time, as real users pause
}

El sleep importa. Sin tiempo para pensar, cada usuario virtual golpea el servidor continuamente, produciendo mucho más tráfico que el mismo número de personas reales.

¿Qué son las pruebas de estrés?

Las pruebas de estrés van deliberadamente más allá de los niveles esperados. No estás intentando pasar. Quiere respuestas a preguntas como:

  • ¿A qué nivel el rendimiento empieza a desmoronarse?
  • ¿Qué componente falla primero: la base de datos, los servidores de aplicaciones o una llamada de un tercero?
  • ¿Falla elegantemente con errores claros o falla y pierde datos?
  • ¿Se recupera por sí solo cuando cae el tráfico?
export const options = {
  stages: [
    { duration: "5m", target: 500 },    // expected peak
    { duration: "5m", target: 1000 },   // beyond it
    { duration: "5m", target: 2000 },   // further
    { duration: "5m", target: 4000 },   // likely to break
    { duration: "10m", target: 0 },     // recovery: does it come back?
  ],
};

Esa etapa final de recuperación con frecuencia se olvida y puede ser la más valiosa. Un sistema que maneja bien las fallas pero que nunca se recupera sin un reinicio manual aún significa una interrupción que alguien debe arreglar en medio de la noche. Idealmente, bajo una carga extrema, un sistema debería deshacerse del trabajo de forma controlada, devolviendo 503 respuestas claras en lugar de agotarse el tiempo.

Spike, remojo y otros tipos

Las pruebas de carga y estrés pertenecen a una familia más amplia de pruebas de rendimiento:

Tipo Patrón lo que encuentra
Humo (actuación) Algunos usuarios, brevemente Si el script y el sistema funcionan
Cargar Pico esperado, mantenido Si se cumplen los objetivos
Estrés Aumento de la capacidad Límites y modos de falla.
pico Un salto repentino, luego una caída. Escalado automático y comportamiento de cola
Remojo (resistencia) Carga normal durante horas Pérdidas de memoria, conexiones que se agotan
Capacidad Aumento gradual La carga máxima dentro de tus objetivos.

Las pruebas de inmersión detectan problemas que las pruebas cortas nunca detectan. Una pequeña pérdida de memoria puede parecer inofensiva durante veinte minutos y sólo provocar que el servicio se caiga después de dos días. Las pruebas de picos se adaptan a eventos como las ventas flash, donde el tráfico no aumenta gradualmente.

Métricas que importan

Métrica Significado Esté atento a
Tiempo de respuesta (percentiles) ¿Cuánto tardan las solicitudes? p95 y p99 subiendo
Rendimiento Solicitudes manejadas por segundo Aplanamiento a medida que aumentan los usuarios
Tasa de error Porcentaje de solicitudes fallidas Cualquier aumento repentino
procesador y memoria Uso de recursos del servidor Saturación o crecimiento constante
Base de datos Consultas lentas, uso del grupo de conexiones. Agotamiento de la piscina, esperas de bloqueo
Profundidad de la cola Trabajo pendiente de ser procesado. Crecimiento que nunca se agota

¿Por qué los promedios engañan?

Los promedios ocultan las solicitudes lentas de las que se queja la gente real. Para mostrar esto, generamos 100 tiempos de respuesta simulados, donde 95 fueron rápidos (80 a 200 ms) y 5 fueron muy lentos (2,5 a 4 segundos), luego calculamos las estadísticas comunes:

import math, random, statistics

random.seed(3)
times = [random.randint(80, 200) for _ in range(95)] \
      + [random.randint(2500, 4000) for _ in range(5)]

def pct(values, p):
    values = sorted(values)
    return values[math.ceil(p / 100 * len(values)) - 1]

print("avg", round(statistics.mean(times)), "p50", pct(times, 50),
      "p95", pct(times, 95), "p99", pct(times, 99), "max", max(times))

# avg 302 p50 150 p95 199 p99 3740 max 3896

Mire de cerca esos números. La media de 302 ms no describe a nadie. Las solicitudes típicas tardaron unos 150 ms, mientras que las lentas tardaron más de 3 segundos. Incluso p95 parece saludable a 199 ms, y sólo p99 revela el problema. Una cifra como p95 significa que el 95% de las solicitudes fueron así de rápidas o más rápidas.

Y el uno por ciento de las solicitudes no es un hecho raro. Si una página realiza 50 solicitudes, un p99 lento afecta a una gran proporción de visitas a la página. Establezca objetivos en los percentiles que le interesen y analicen varios juntos.

Consejo: Busque la “rodilla” en sus gráficos. A medida que aumenta la carga, los tiempos de respuesta permanecen estables por un tiempo y luego aumentan repentinamente, mientras que el rendimiento deja de crecer. Ese punto es su capacidad práctica y, a menudo, llega mucho antes de que algo realmente falle.

Herramientas

Herramienta secuencias de comandos conocido por
k6 javascript Los umbrales son fáciles de usar para los desarrolladores y se adaptan a la CI
JMetro GUI y XML Maduro, soporta muchos protocolos
gatito Scala, Java, Kotlin y otros Basado en código, eficiente
langosta pitón Comportamiento de usuario simple basado en Python

Cualquiera de estos puede ejecutar pruebas de carga y de estrés. Elija el que se ajuste a las habilidades de su equipo, en lugar de buscar una lista de funciones. Para usar uno en su canalización, consulte qué es CI/CD.

Cómo planificar una prueba

  1. Establezca objetivos. Utilice análisis reales para encontrar su tráfico pico y defina objetivos.
  2. Elija recorridos. Modele comportamientos de usuario realistas, como navegación, búsqueda y pago, en proporciones realistas. Acceder sólo a la página de inicio resulta poco.
  3. Utilice un entorno realista. Un servidor de prueba pequeño no puede predecir la producción. Tenga en cuenta cualquier diferencia.
  4. Prepare los datos. Utilice volúmenes realistas, porque una consulta que es rápida en 100 filas puede rastrear 10 millones.
  5. Advertir a la gente. Informe a su equipo de operaciones y a terceros, y no realice pruebas de carga a un proveedor de pagos por accidente. Simular servicios externos cuando corresponda.
  6. Empiece poco a poco. Primero ejecute una pequeña prueba de humo para confirmar que su script funciona.
  7. Supervise todo. Sin métricas del servidor, verá que se ralentizó, pero no por qué.
  8. Repetir. Ejecútelo nuevamente después de cada corrección y mantenga una línea de base para comparar.

leyendo los resultados

Síntoma Posible causa
Respuestas lentas, pero poca CPU Esperando en una base de datos, bloqueo o servicio externo
La CPU de la base de datos es alta Índices faltantes o consultas ineficientes
Errores de conexión repentinos Se alcanzó el límite de archivos o grupo de conexiones
La memoria sube constantemente Una fuga o un caché ilimitado
La CPU del generador de carga es alta La herramienta de prueba es el cuello de botella, no su sistema

Las bases de datos son un cuello de botella común, por lo que si el problema son las consultas, lea nuestra guía para optimización de consultas SQL. Esa última fila de la tabla es una trampa importante: verifique siempre también el estado de la máquina que genera la carga.

Errores comunes

  • Confundir a los usuarios con las solicitudes. Deje claro si un objetivo significa usuarios simultáneos o solicitudes por segundo.
  • Dejar de lado el tiempo para pensar. Esto aumenta el tráfico y genera resultados engañosos.
  • Pruebas demasiado tarde. Una semana antes del lanzamiento no deja tiempo para solucionar problemas de arquitectura.
  • Utilizando un único punto final. El tráfico real combina lecturas, escrituras y búsquedas.
  • El almacenamiento en caché lo oculta todo. Es posible que las solicitudes repetidas idénticas solo prueben su caché, así que varíe los datos.
  • Prueba una vez. El rendimiento cambia con cada versión, así que ejecute pruebas con regularidad.

Conclusión

Ejecute pruebas de carga para confirmar que puede manejar el tráfico que espera y pruebas de estrés para saber qué sucede cuando no puede. Empiece poco a poco: elija el recorrido del usuario más importante, establezca un objetivo claro y ejecute una prueba breve en comparación con la puesta en escena con la supervisión activada. Esa primera ejecución normalmente te enseña algo y puedes construir a partir de ahí.

Preguntas frecuentes

¿Cuál es la principal diferencia entre las pruebas de carga y de estrés?

Las pruebas de carga verifican el comportamiento bajo el tráfico esperado frente a los objetivos establecidos. Las pruebas de estrés van más allá de la capacidad de encontrar el punto de ruptura y cómo se recupera el sistema.

¿Debo ejecutar primero pruebas de carga o pruebas de estrés?

Prueba de carga primero. Una vez que el sistema alcance sus objetivos con el tráfico esperado, ejecute pruebas de estrés para explorar sus límites. Los resultados del estrés significan poco en un sistema inestable.

¿Cuál es la diferencia entre una prueba de estrés y una prueba de pico?

Una prueba de estrés normalmente aumenta la carga paso a paso hasta que falla. Una prueba de pico salta repentinamente a un nivel alto para ver cómo el sistema afronta un cambio abrupto.

¿Cuál es el tiempo de respuesta de p95?

Significa que el 95% de las solicitudes finalizaron en ese momento o menos. Describe la experiencia de la mayoría de los usuarios mejor que el promedio.

¿Puedo ejecutar pruebas de carga en producción?

Puedes hacerlo, pero con cuidado, con permiso, seguimiento y una manera de detenerte rápidamente. La mayoría de los equipos comienzan con un entorno de prueba similar a una producción para reducir el riesgo para los usuarios reales.

sigue aprendiendo

Trabajar con Stack Quora

¿Necesitas ayuda con pruebas, WordPress o SEO?

Ayudamos a los equipos a enviar mejor software y hacer crecer sus sitios. Cuéntenos en qué está trabajando y le sugeriremos un siguiente paso claro.

Sigue leyendo

Más guías sobre testing, IA y desarrollo moderno

¿Te gustó este artículo? Elige un tema y salta directo a nuestros tutoriales más recientes.

Inteligencia artificial

Explicación de las alucinaciones de la IA: por qué los modelos de lenguaje inventan cosas y cómo reducirlas

Se explicaron las alucinaciones de la IA: qué son, por qué los modelos de lenguaje las producen, tipos comunes, cómo reducirlas con conexión a tierr…

Leer artículo →
DevOps

Explicación de las variables de entorno: archivos .env, secretos y configuración bien hechos

Variables de entorno explicadas con ejemplos de Python que ejecutamos: leerlas y configurarlas, por qué cada valor es una cadena, archivos .env, her…

Leer artículo →
Desarrollo de software

Explicación de la limitación de velocidad de API: algoritmos, encabezados y manejo de errores 429

La limitación de la tasa de API se explica con una simulación que ejecutamos: depósito de tokens, ventana fija, ventana deslizante, 429 respuestas, …

Leer artículo →
Automatización de pruebas

Burlarse en Python: unittest.mock, patch y los errores que hacen que las pruebas mientan

Burlarse en Python con unittest.mock, probado: Mock y return_value, side_effect, parches donde se usa un nombre, especificación y autospec, fechas d…

Leer artículo →
Pruebas de software

Explicación de la cobertura del código: cobertura de línea versus sucursal y lo que realmente significa 100%

Cobertura del código explicada con una ejecución real de cobertura.py: cobertura de línea, rama y condición, lectura de un informe, por qué una cobe…

Leer artículo →
Bases de datos y SQL

DELETE vs TRUNCATE vs DROP en SQL: diferencias, reversión y cuándo usar cada uno

DELETE vs TRUNCATE vs DROP explicado con SQL probado: qué elimina cada uno, reversión, activadores, restablecimiento de identidad, velocidad y en qu…

Leer artículo →
Bases de datos y SQL

Vistas SQL explicadas: cree, use y evite los errores, con ejemplos

Vistas SQL explicadas con consultas que ejecutamos: creación de una vista, resultados en vivo, ocultación de columnas, rendimiento, vistas actualiza…

Leer artículo →
Desarrollo de software

Interfaz TypeScript versus tipo: diferencias reales, probadas con el compilador

Interfaz TypeScript versus tipo, verificado con el compilador real: qué pueden hacer ambos, qué puede hacer solo uno, fusión de declaraciones, exten…

Leer artículo →
Desarrollo de software

Python *args y **kwargs explicados: funciones flexibles con ejemplos claros

Python *args y **kwargs explicados con el código que ejecutamos: empaquetado y desempaquetado, orden de parámetros, argumentos solo de palabras clav…

Leer artículo →
Desarrollo de software

Funciones Lambda de Python: sintaxis, usos reales y cuándo no utilizarlas

Funciones lambda de Python explicadas con el código que ejecutamos: sintaxis, clasificación con clave, mapa y filtro, cierres, trampa de enlace tard…

Leer artículo →
Inteligencia artificial

¿Qué son los agentes de IA? Cómo funcionan, con un bucle de agente simple que puedes ejecutar

¿Qué son los agentes de IA? Una guía sencilla sobre el bucle del agente, las herramientas, la memoria y las barreras de seguridad, con un pequeño bu…

Leer artículo →
DevOps

Monitoreo versus observabilidad: la verdadera diferencia, con registros, métricas y seguimientos

Explicación del monitoreo versus observabilidad: fallas conocidas y desconocidas, registros, métricas y seguimientos, un recorrido por incidentes de…

Leer artículo →
DevOps

Docker Volumes versus Bind Mounts: persistir los datos del contenedor de la manera correcta

Se explican los volúmenes de Docker frente a los montajes de enlace: por qué desaparecen los datos del contenedor, volúmenes con nombre, montajes de…

Leer artículo →
Automatización de pruebas

TDD vs BDD: diferencias clave, una función creada en ambos sentidos y cuándo usar cada una

TDD vs BDD explicado con una característica de descuento construida en ambos sentidos: refactor rojo-verde con el código que ejecutamos, escenarios …

Leer artículo →
Pruebas de software

Pruebas de Aceptación de Usuario (UAT): Proceso, Lista de Verificación y Ejemplos Reales

Explicación de las pruebas de aceptación del usuario: quién las ejecuta, en qué se diferencia del control de calidad, un proceso de siete pasos, una…

Leer artículo →
Bases de datos y SQL

Valores NULL de SQL explicados: IS NULL, COALESCE, NULLIF y las trampas que se deben evitar

Los valores NULL de SQL se explican con las consultas que ejecutamos: lógica de tres valores, IS NULL, COALESCE, NULLIF, cómo los agregados, las uni…

Leer artículo →
Bases de datos y SQL

Declaración SQL CASE WHEN: sintaxis, ejemplos reales y errores comunes

CASO SQL CUANDO se explicó con las consultas que ejecutamos: formularios simples y buscados, orden de condiciones, pivotes con SUMA, trucos COUNT, c…

Leer artículo →
Desarrollo de software

¿Qué es JWT? Tokens web JSON explicados con un ejemplo práctico

¿Qué es JWT? JSON Web Tokens explicó: las tres partes, un token creado y manipulado en el código que ejecutamos, JWT vs sesiones, almacenamiento, to…

Leer artículo →
Desarrollo de software

Explicación del bucle de eventos de JavaScript: pila de llamadas, microtareas y temporizadores con ejemplos

El bucle de eventos de JavaScript explicado con el código que ejecutamos: pila de llamadas, colas de tareas y microtareas, por qué setTimeout 0 no e…

Leer artículo →
Desarrollo de software

Explicación de los generadores y el rendimiento de Python: ahorre memoria con ejemplos reales

Los generadores de Python y el rendimiento se explican con el código que ejecutamos: cómo se pausan y reanudan, midieron el ahorro de memoria, canal…

Leer artículo →
Inteligencia artificial

¿Qué son las incrustaciones? Los vectores y la similitud del coseno se explican de forma sencilla

¿Qué son las incrustaciones? Una guía en lenguaje sencillo sobre vectores, similitud de cosenos y búsqueda semántica, con un pequeño ejemplo que eje…

Leer artículo →
DevOps

Implementación azul-verde versus implementación canaria: diferencias, compensaciones y cómo elegir

Explicación de la implementación azul-verde versus canaria: cómo funciona cada uno, costo, riesgo y reversión, agrupación estable de usuarios que pr…

Leer artículo →
Automatización de pruebas

Pruebas inestables: qué las causa y cómo solucionarlas para siempre

Pruebas inestables explicadas con demostraciones que realizamos: las causas principales, cómo confirmar y diagnosticar una, correcciones adecuadas p…

Leer artículo →
Pruebas de software

Pruebas de carga frente a pruebas de estrés: diferencias, métricas y ejemplos de k6

Explicación de las pruebas de carga frente a las pruebas de estrés: qué prueba cada una, pruebas de picos y de absorción, las métricas que importan,…

Leer artículo →
Pruebas de software

Caso de prueba frente a escenario de prueba: diferencias clave, ejemplos y cuándo utilizar cada uno

Caso de prueba versus escenario de prueba explicado: definiciones claras, una tabla en paralelo, una función de restablecimiento de contraseña tomad…

Leer artículo →
Bases de datos y SQL

Optimización de consultas SQL: lea planes de ejecución y corrija consultas lentas, con tiempos

Optimización de consultas SQL probada en un millón de filas: lea planes de ejecución, agregue los índices correctos, corrija filtros no sargables, u…

Leer artículo →
Bases de datos y SQL

SQL UNION vs UNION ALL: diferencias, ejemplos y rendimiento probado

SQL UNION vs UNION ALL explicado con consultas que ejecutamos: duplicados, las reglas que siguen ambos, un error de datos real, rendimiento medido, …

Leer artículo →
Desarrollo de software

Tutorial de JavaScript Fetch API: GET, POST, manejo de errores y tiempos de espera

Un tutorial de JavaScript Fetch API probado en un servidor local: GET y POST, por qué 404 no arroja, un asistente reutilizable, cadenas de consulta,…

Leer artículo →
Desarrollo de software

Manejo de archivos Python: lectura, escritura, CSV, JSON y pathlib con ejemplos

El manejo de archivos Python se explica con el código que ejecutamos: modos abiertos, lectura de archivos grandes, CSV, JSON, pathlib, archivos bina…

Leer artículo →
Desarrollo de software

Clases y objetos de Python: tutorial de programación orientada a objetos con ejemplos reales

Clases y objetos de Python explicados con el código que ejecutamos: __init__, métodos, atributos de clase versus instancia, herencia, propiedades, m…

Leer artículo →
Inteligencia artificial

¿Qué es un modelo de lenguaje grande? Cómo funcionan los LLM, explicados sin exageraciones

¿Qué es un modelo de lenguaje grande? Los LLM explicados en lenguaje sencillo: tokens, incrustaciones, atención, entrenamiento, ventanas de temperat…

Leer artículo →
DevOps

Comandos de Linux para principiantes: la guía esencial de terminal con ejemplos

Comandos de Linux para principiantes, agrupados por tarea: navegación, archivos, visualización de registros, grep, canalizaciones, permisos, proceso…

Leer artículo →
Automatización de pruebas

Selenium vs Playwright: diferencias clave, comparación de códigos y cuál elegir

Comparación de Selenium vs Playwright: arquitectura, espera, soporte de navegador e idioma, depuración, la misma prueba en ambas herramientas, conse…

Leer artículo →
Pruebas de software

Partición de equivalencia: técnica de diseño de pruebas explicada con ejemplos resueltos

Explicación de la partición de equivalencia: cómo encontrar particiones válidas e inválidas, ejemplos prácticos para edades, contraseñas y cupones, …

Leer artículo →
Pruebas de software

Severidad vs Prioridad en Pruebas de Software: Diferencias, Matriz y Ejemplos Reales

Explicación de gravedad versus prioridad en las pruebas de software: definiciones claras, una matriz de cuatro vías con ejemplos, escalas de niveles…

Leer artículo →
Bases de datos y SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas y EXISTENCIAS con ejemplos

Un tutorial de subconsultas SQL con consultas que ejecutamos: subconsultas escalares, IN, FROM y SELECT, subconsultas correlacionadas, EXISTS, la tr…

Leer artículo →
Bases de datos y SQL

Transacciones SQL y ACID explicados: COMMIT, ROLLBACK y niveles de aislamiento

Transacciones SQL y ACID explicadas con una transferencia bancaria que ejecutamos: COMMIT, ROLLBACK, puntos de guardado, bloqueos, niveles de aislam…

Leer artículo →
Desarrollo de software

Git merge vs rebase: diferencias, ejemplos y cuándo usar cada uno

Git merge vs rebase explicado con salida real del log, una tabla comparativa, la regla de oro del rebase y un flujo de trabajo seguro para equipos.

Leer artículo →
Desarrollo de software

List comprehension en Python: sintaxis, ejemplos y cuándo evitarla

List comprehension en Python explicada: sintaxis, filtros, if-else, bucles anidados, tiempos medidos y cuándo es mejor un bucle for normal.

Leer artículo →