Saltar al contenido principal

Prueba tus APIs REST con K6

· 5 min de lectura
katarem
Backend Developer

Cuando creamos APIs REST, solemos probar que devuelvan los datos correctos y que el código de respuesta sea el esperado. Pero muchas veces dejamos pasar algo fundamental: ¿qué pasa cuando no es un solo usuario haciendo peticiones, sino decenas, cientos o miles? ¿Nuestro sistema será capaz de aguantar esa carga sin caerse?

No hace falta esperar a que el servidor se desplome en producción para darse cuenta de que no soporta la demanda. Por eso es vital hacer pruebas de carga desde temprano, para saber hasta dónde podemos llegar y planificar un escalado eficiente.

En este artículo te presento K6, una herramienta sencilla y poderosa para simular múltiples usuarios y medir el rendimiento real de tu API de forma automatizada.

¿Qué es K6?

K6 es una librería de testing de javascript para poder hacer pruebas de performance en nuestras APIs de forma automatizada. Podremos simular cargas masivas, requestest en cadena, todo lo que se te pueda ocurrir que conlleve muchas request, se puede hacer con K6.

Debemos instalar K6 desde su página oficial. Una vez instalado el CLI de K6, podemos comprobar que está funcionando con:

[rem@arch ~]$ k6 --version
k6 v1.0.0 (commit/41b4984b75, go1.24.2, linux/amd64)

Podemos hacer una prueba inicial con 1 usuario, primero escribiremos un script:

import http from 'k6/http';

export default function(){
const url = 'https://httpbin.test.k6.io/post';
const response = http.post(url,'hola mundo');
}

Ahora arrancamos K6 con lo siguiente:

k6 run script.js

Y saldrá algo como esto:

[rem@arch k6-test]$ k6 run script.js

/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/

execution: local
script: script.js
output: -

scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
* default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)



█ TOTAL RESULTS

HTTP
http_req_duration......................: avg=33.4ms min=33.4ms med=33.4ms max=33.4ms p(90)=33.4ms p(95)=33.4ms
http_req_failed........................: 100.00% 1 out of 1
http_reqs..............................: 1 0.765221/s

EXECUTION
iteration_duration.....................: avg=1.3s min=1.3s med=1.3s max=1.3s p(90)=1.3s p(95)=1.3s
iterations.............................: 1 0.765221/s
vus....................................: 1 min=1 max=1
vus_max................................: 1 min=1 max=1

NETWORK
data_received..........................: 5.9 kB 4.5 kB/s
data_sent..............................: 576 B 441 B/s




running (00m01.3s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m01.3s/10m0s 1/1 iters, 1 per VU

Estas pruebas como podemos ver dan estadísticas enfocadas al rendimiento bruto de nuestra aplicación, tendremos muchísimos datos para poder tener una estimación realista de como se comportará nuestra API en un entorno real.

Si queremos que 5 usuarios arranquen la request:

[rem@arch k6-test]$ k6 run script.js --vus 5 --duration 30s

/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/

execution: local
script: script.js
output: -

scenarios: (100.00%) 1 scenario, 5 max VUs, 1m0s max duration (incl. graceful stop):
* default: 5 looping VUs for 30s (gracefulStop: 30s)



█ TOTAL RESULTS

HTTP
http_req_duration......................: avg=32.26ms min=25.53ms med=28.37ms max=252.96ms p(90)=30.02ms p(95)=35.18ms
http_req_failed........................: 100.00% 4605 out of 4605
http_reqs..............................: 4605 153.412632/s

EXECUTION
iteration_duration.....................: avg=32.55ms min=25.61ms med=28.51ms max=253.09ms p(90)=30.18ms p(95)=35.65ms
iterations.............................: 4605 153.412632/s
vus....................................: 5 min=5 max=5
vus_max................................: 5 min=5 max=5

NETWORK
data_received..........................: 6.1 MB 202 kB/s
data_sent..............................: 402 kB 13 kB/s




running (0m30.0s), 0/5 VUs, 4605 complete and 0 interrupted iterations
default ✓ [======================================] 5 VUs 30s

Vemos que la media sigue sin cambiar, eso es porque esta API REST que estamos probando es bastante robusta, hemos probado 5 usuarios concurrentes haciendo requests durante 30 segundos y se completaron 4605 requests sin error.

Al no pasarle iteraciones, han intentado todas las request que han podido durante ese tiempo.

Poniendo 50 iteraciones, será que se harán 50 requests entre 10 usuarios:

[rem@arch k6-test]$  k6 run script.js --vus 10 -i 50

/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/

execution: local
script: script.js
output: -

scenarios: (100.00%) 1 scenario, 10 max VUs, 10m30s max duration (incl. graceful stop):
* default: 50 iterations shared among 10 VUs (maxDuration: 10m0s, gracefulStop: 30s)



█ TOTAL RESULTS

HTTP
http_req_duration......................: avg=31.97ms min=27.22ms med=29.51ms max=41.86ms p(90)=41.64ms p(95)=41.76ms
http_req_failed........................: 100.00% 50 out of 50
http_reqs..............................: 50 113.112869/s

EXECUTION
iteration_duration.....................: avg=87.67ms min=27.41ms med=29.59ms max=320ms p(90)=319.58ms p(95)=319.68ms
iterations.............................: 50 113.112869/s

NETWORK
data_received..........................: 111 kB 252 kB/s
data_sent..............................: 9.2 kB 21 kB/s




running (00m00.4s), 00/10 VUs, 50 complete and 0 interrupted iterations
default ✓ [======================================] 10 VUs 00m00.4s/10m0s 50/50 shared iters

Si necesitas tests más precisos te recomiendo ejecutar k6 run --help para obtener toda la información de los muchos parámetros que podemos utilizar para testing.

Conclusión

No basta con que tu API funcione para un usuario: hay que saber cómo se comporta bajo carga. K6 es una herramienta sencilla y efectiva para hacer esas pruebas y obtener datos reales sobre el rendimiento.

Si aún no haces tests de carga, este es un gran momento para empezar. Y si ya los haces, K6 te facilitará mucho el trabajo.