{"id":49243066,"url":"https://github.com/anyulled/performance-tests-jmeter_vs_k6","last_synced_at":"2026-04-24T20:12:36.943Z","repository":{"id":318396343,"uuid":"1071118764","full_name":"anyulled/performance-tests-jmeter_vs_k6","owner":"anyulled","description":null,"archived":false,"fork":false,"pushed_at":"2025-10-06T23:50:16.000Z","size":22,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-07T00:21:43.592Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anyulled.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-06T22:27:39.000Z","updated_at":"2025-10-06T23:50:20.000Z","dependencies_parsed_at":"2025-10-07T00:21:45.701Z","dependency_job_id":"a79a7f73-c447-4ba9-9f7c-77acc65cfe82","html_url":"https://github.com/anyulled/performance-tests-jmeter_vs_k6","commit_stats":null,"previous_names":["anyulled/performance-tests-jmeter_vs_k6"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/anyulled/performance-tests-jmeter_vs_k6","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyulled%2Fperformance-tests-jmeter_vs_k6","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyulled%2Fperformance-tests-jmeter_vs_k6/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyulled%2Fperformance-tests-jmeter_vs_k6/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyulled%2Fperformance-tests-jmeter_vs_k6/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anyulled","download_url":"https://codeload.github.com/anyulled/performance-tests-jmeter_vs_k6/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anyulled%2Fperformance-tests-jmeter_vs_k6/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32238913,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-24T20:12:36.347Z","updated_at":"2026-04-24T20:12:36.935Z","avatar_url":"https://github.com/anyulled.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Aplicación de Pruebas de Rendimiento\n\nAplicación mínima de Spring Boot junto con un plan de pruebas de carga en\nJMeter.\n\n¿Qué incluye?\n\n- Aplicación Spring Boot con dos endpoints:\n    - POST /auth/login → devuelve `{\"access_token\": \"...\"}`\n    - GET /api/products/{id} → requiere `Authorization: Bearer \u003caccess_token\u003e`\n- Plan de pruebas JMeter `jmeter/test_plan.jmx`:\n    - Thread Group: 60 usuarios, Ramp-Up 60 s, Loop infinito con duración 300\n      s (5 minutos)\n    - Uniform Random Timer: 200–800 ms (pausa entre acciones)\n    - Login (Sampler) con JSON Extractor para guardar `access_token`\n    - Petición de negocio (Sampler) con cabecera Authorization: Bearer $\n      {access_token}\n    - CSV Data Set Config apuntando a `jmeter/data/products.csv` con nombre de\n      variable `productId` y modo de compartición \"All threads\" (valores\n      distintos por hilo)\n\n## Construcción y ejecución\n\n1. Compilar la aplicación:\n\n```shell\n   mvn -DskipTests package\n```\n\n2. Ejecutarla:\n\n```shell\n   mvn spring-boot:run\n```\n\nLa aplicación escucha en http://localhost:8080.\n\n## Endpoints\n\n- Login:\n    - POST http://localhost:8080/auth/login\n    - Cuerpo (JSON): `{\"username\":\"user\",\"password\":\"pass\"}`\n    - Respuesta (JSON): `{\"access_token\":\"\u003cuuid\u003e\", \"token_type\":\"bearer\"}`\n\n- Petición de negocio:\n    - GET http://localhost:8080/api/products/{id}\n    - Cabeceras: `Authorization: Bearer \u003caccess_token\u003e`\n\n## Ejecutar el plan de JMeter\n\n- Abrir `jmeter/test_plan.jmx` en Apache JMeter (recomendado 5.6.x) y ejecutar.\n- O ejecutar en modo no-GUI (ejemplo):\n\n```shell\njmeter -n -t jmeter/test_plan.jmx -l jmeter/results.jtl -e -o jmeter/report\n```\n\nAsegúrate de que la aplicación Spring Boot esté ejecutándose antes de lanzar la\nprueba.\n\n\n## Ejecutar la prueba con K6\n\nRequisitos: instalar K6 (https://k6.io/)\n\nEl script `k6/test.js` implementa un escenario diferente:\n- Executor constant-arrival-rate con 300 req/s, `duration` 5m, `preAllocatedVUs` 60 y `maxVUs` 200\n- Umbrales: p(95) \u003c 200 ms y tasa de fallos \u003c 0.5%\n- Realiza login en `setup()` contra `/auth/login` y usa el `access_token` en cada petición `GET /api/products/{id}`\n- Pausa aleatoria 200–800 ms entre solicitudes\n\nEjemplo de ejecución:\n\n```bash\nexport BASE_URL=http://localhost:8080\n# Opcional: credenciales\nexport USERNAME=user\nexport PASSWORD=pass\n\nk6 run k6/test.js\n```\n\n### ¿Qué es constant-arrival-rate en K6?\n\n- Es un ejecutor que programa el inicio de iteraciones a una tasa fija (por ejemplo, 300 solicitudes por segundo), independiente del número de usuarios virtuales (VUs) disponibles en ese instante.\n- K6 intentará mantener esa tasa adaptando dinámicamente la cantidad de VUs activos entre `preAllocatedVUs` (reservados al inicio) y `maxVUs` (límite superior) para cumplir el ritmo objetivo.\n- Cada iteración ejecuta la función `default` una vez. Si la lógica interna incluye esperas (por ejemplo, `sleep(0.2–0.8)` segundos para simular think time) o la API responde lento, K6 puede necesitar más VUs para seguir alcanzando la tasa objetivo.\n- Si el sistema bajo prueba se degrada y ni siquiera aumentando VUs hasta `maxVUs` se alcanza la tasa configurada, K6 reportará que la tasa real fue inferior a la objetivo (útil para detectar saturación de capacidad).\n\n### Similitudes con el plan de JMeter\n\n- Duración: ambos ejercicios están pensados para 5 minutos de ejecución.\n- Flujo de negocio: primero se hace `login` para obtener `access_token` y luego se invoca el endpoint de negocio `GET /api/products/{id}` con la cabecera `Authorization: Bearer …`.\n- Think time: en ambos se introduce una pausa aleatoria de 200–800 ms entre solicitudes para simular comportamiento humano y evitar ráfagas sincronizadas.\n- Variación de productos: se consultan distintos IDs de producto durante la prueba.\n\n### Diferencias clave entre K6 y JMeter en este proyecto\n\n- Modelo de carga:\n  - K6 (constant-arrival-rate) fija una tasa de llegadas (RPS). El foco está en el throughput objetivo y K6 ajusta VUs para mantenerlo.\n  - JMeter usa un Thread Group con 60 usuarios, ramp-up de 60 s y \"loop infinito\" con duración controlada a 5 min. El foco está en la concurrencia (usuarios) y la tasa resultante es consecuencia de tiempos de respuesta y pausas.\n- Control del ritmo:\n  - K6 garantiza el intento de mantener 300 req/s constantes.\n  - JMeter no garantiza RPS constante; para algo similar se necesitarían componentes como Throughput Shaping Timer + Concurrency Thread Group.\n- Gestión de datos:\n  - JMeter usa `CSV Data Set Config` para asegurar productos distintos por hilo.\n  - K6 selecciona IDs aleatorios dentro de un rango (p. ej., 1001–1100). Puede replicarse un dataset fijo si se desea (p. ej., cargando un CSV en `setup()` y asignando por VU).\n- Métricas y umbrales:\n  - K6 define umbrales (`thresholds`) como p95 \u003c 200 ms y tasa de fallos \u003c 0.5% que hacen fallar la ejecución si no se cumplen.\n  - JMeter se apoya en listeners/reportes (p. ej., HTML report) y aserciones; por defecto no \"falla\" la ejecución según percentiles a menos que se configuren Assertions o el plugin de PerfMon/Backends.\n- Arranque y escalado:\n  - K6 parte con `preAllocatedVUs=60` y puede escalar hasta `maxVUs=200` automáticamente según necesidad para sostener la tasa.\n  - JMeter fija 60 hilos y mantiene ese nivel de concurrencia tras el ramp-up.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanyulled%2Fperformance-tests-jmeter_vs_k6","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanyulled%2Fperformance-tests-jmeter_vs_k6","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanyulled%2Fperformance-tests-jmeter_vs_k6/lists"}