Volver a Learning
🦗
Skill 20 min lectura Claude Code

Performance Testing Skills
locust-best-practices

Un skill de Claude Code que se activa automáticamente cuando describes una tarea de load testing con Locust en Python. Sin comandos slash. Sin configuración manual. Solo describes lo que necesitas y el skill estructura el locustfile correcto, completo y ejecutable.

LocustPythonClaude CodeLoad TestingHTTP/RESTPerformance
Por Rodrigo Campos · 2026-03-15
Tabla de contenidos

rcampos09/performance-testing-skills

Repositorio público · MIT License · Compatible con Claude Code, Cursor y Windsurf

¿Qué es un Claude Code Skill?

Los skills de Claude Code son instrucciones especializadas que se instalan localmente y se activan cuando el contexto de la conversación lo requiere. No son plugins ni extensiones; Claude los aplica sin que tengas que pedirlo.

Una vez instalado performance-testing-skills, si describes algo como "necesito un test de carga para esta API en Python con Locust" o "convierte este JMeter script a Locust", Claude detecta la intención y aplica el skill: genera un locustfile completo y ejecutable, no fragmentos que tengas que completar tú.

🎯

Activación automática

Detecta la intención sin slash commands ni configuración por tarea

🐍

Python nativo

Locustfiles completos con HttpUser, tasks y load shapes

📄

Archivos completos

Nunca fragmentos parciales — siempre listo para ejecutar

Instalación

Un solo comando. Compatible con Claude Code, Cursor y Windsurf.

Instalar todos los skills del repositorio

Terminal ~ $ npx skills add rcampos09/performance-testing-skills Installed: locust-best-practices Skills active in Claude Code, Cursor, Windsurf

Instalar solo el skill de Locust

Terminal ~ $ npx skills add rcampos09/performance-testing-skills --skill locust-best-practices Skill locust-best-practices installed successfully

Requisitos del entorno

Runtime Versión mínima Uso
Python 3.8+ Runtime principal para ejecutar los locustfiles
locust latest pip install locust

Skills disponibles

El repositorio incluye actualmente cuatro skills. Se agregan nuevos con cada actualización.

LB

locust-best-practices

Genera, valida y corrige locustfiles en Python. Aplica el patrón de 4 bloques, detecta los 7 errores más frecuentes y selecciona el wait_time correcto según el modelo de carga.

Se activa cuando mencionas:

locustlocustfileload testingHttpUserwait_timePythonperformance testingstress testingvirtual usersLoadTestShapecatch_responsebenchmark API
Python 3.8+HTTP/RESTLoadTestShapeCustom Shapes

Cómo funciona en la práctica

El skill entrega siempre tres cosas. Nunca menos.

1

Locustfile completo y ejecutable

Un archivo Python completo con los 4 bloques — nunca un fragmento que requiera que tú completes el resto.

2

El comando exacto para ejecutarlo

Con todos los flags necesarios — host, users, spawn-rate, run-time. Listo para copiar y pegar en tu terminal.

3

Justificación del wait_time elegido

Una línea que explica por qué se eligió ese wait_time y cómo impacta en el modelo de carga, para que puedas justificarlo en tu equipo.

Ejemplo de conversación con el skill activo

Claude Code You: Necesito un test de carga en Python para GET /api/products con 50 usuarios concurrentes Claude: → Skill locust-best-practices activado Generando products_load_test.py con HttpUser, catch_response=True + assertions... wait_time: between(1, 3) — simula pacing humano realista (modelo cerrado) locust -f products_load_test.py --headless -u 50 -r 5 --run-time 60s --host https://api.example.com

El skill detecta automáticamente la intención aunque no uses explícitamente la palabra "Locust".

El patrón de 4 bloques

Todo locustfile generado por el skill sigue esta estructura en orden. Si algún bloque falta o está mal ubicado, el test puede correr pero producir resultados incorrectos o inútiles.

01

Imports + Configuration

Importaciones de Locust, librerías estándar y constantes de entorno. La BASE_URL siempre viene de os.environ.get() — nunca hardcodeada. Aquí se definen también los encabezados globales y cualquier dato de configuración compartido.

02

User Class (HttpUser)

La clase que hereda de HttpUser con host, wait_time, on_start (auth por usuario) y los métodos decorados con @task. Cada VU ejecuta el ciclo: on_start → @task → wait_time → repetir.

03

Custom Load Shape (opcional)

Clase que hereda de LoadTestShape para escenarios de multi-etapa: ramp-up, carga sostenida, spike y bajada. Sin este bloque, la carga es lineal y fija. Con él, puedes simular el tráfico real de tu aplicación.

04

Run Command

El comando CLI exacto con todos los flags necesarios, documentado como comentario al final del archivo. Incluye --headless, -u (users), -r (spawn-rate), --run-time y --host con variables de entorno.

Los 7 errores críticos que el skill detecta

El skill valida automáticamente estos patrones antes de entregar código. Si los detecta en código existente que le muestras, los corrige y explica por qué.

1

Missing catch_response=True

Sin catch_response=True, los errores HTTP (400, 500) se reportan como éxito si el servidor responde. El cuerpo de la respuesta nunca se valida. Tu test puede pasar aunque la API esté rota.

❌ Incorrecto

with self.client.get("/api/users") as r:
  # 500 se reporta como éxito

✅ Correcto

with self.client.get("/api/users",
  catch_response=True) as r:
  if r.status_code != 200:
    r.failure(f"Got {r.status_code}")
2

URLs dinámicas sin name=

Sin name= en rutas con IDs dinámicos, Locust crea una entrada en la tabla de stats por cada URL única — con 1000 usuarios y 1000 IDs distintos, la tabla explota y los datos son inútiles.

❌ Explosión de stats

self.client.get(f"/user/{user_id}")

✅ Stats agrupadas

self.client.get(
  f"/user/{user_id}",
  name="/user/[id]"
)
3

wait_time = constant(0)

Sin think time, cada VU dispara requests a velocidad máxima generando 10–100× más carga de la que un usuario real produciría. Los resultados son inútiles para planificación de capacidad.

❌ Carga irreal

wait_time = constant(0)

✅ Pacing realista

# usuario navegando:
wait_time = between(1, 5)
# RPS fija:
wait_time = constant_throughput(2)
4

Estado mutable compartido

Variables de clase compartidas entre VUs causan race conditions en Locust (greenlets). Siempre usar atributos de instancia (self.token) en lugar de variables de clase.

5

CSV incompleto

Cargar solo un campo del CSV cuando se necesitan varios. Siempre mapear todas las columnas necesarias al parsear: {"user": row[0], "pass": row[1]}.

6

Credenciales hardcodeadas

URLs, tokens o passwords en el código. Siempre usar os.environ.get("BASE_URL", "http://localhost") para que el mismo locustfile funcione en todos los entornos.

7

Validación solo de status code

Un 200 con body {"error": "token expired"} es un fallo real. Siempre validar el cuerpo de la respuesta con r.failure() si el contenido no es el esperado.

Guía de wait_time

La elección del wait_time determina el modelo de carga. El skill siempre justifica la elección con una línea de razonamiento.

wait_time Modelo Cuándo usarlo
between(1, 5) Cerrado Simular usuarios navegando con think time humano
constant_throughput(N) Abierto Mantener N tareas/segundo por VU (RPS fija)
constant(N) Cerrado Intervalo exacto entre requests (timing preciso)
constant(0) ⚠️ Evitar Genera carga irreal — 10-100× más de lo esperado

Comandos de ejecución

El skill incluye el comando exacto con todos los flags necesarios según el escenario.

Ejecución headless (CI/CD)

$ locust -f locustfile.py --headless -u 100 -r 10 --run-time 60s --host https://api.example.com

Con variables de entorno

$ BASE_URL=https://api.example.com locust -f locustfile.py --headless -u 50 -r 5 --run-time 120s

Web UI (desarrollo y análisis)

$ locust -f locustfile.py --host https://api.example.com # abre http://localhost:8089

Otros skills disponibles

Si llegaste aquí buscando best practices de performance testing, estos otros skills del mismo repositorio pueden complementar tu flujo de trabajo.

🦗

Empieza ahora

El repositorio es público y libre de usar. MIT License. Si encuentras un bug o quieres proponer un nuevo skill, abre un issue en GitHub.