La mayoría de los errores de API no son exóticos: un campo faltante, un código de estado incorrecto, un timeout bajo carga o un cambio incompatible que llegó a producción porque nadie verificó el contrato. Las pruebas ad hoc detectan algunos por suerte. Una estrategia los detecta a propósito.
Una estrategia de pruebas de API define qué probar, en qué capa y en qué momento del ciclo de entrega. Decide qué verificaciones corren en cada commit, cuáles se ejecutan por la noche y cuáles bloquean un lanzamiento. El objetivo es maximizar cobertura útil con el menor mantenimiento posible.
Qué significa realmente una estrategia de pruebas de API
Antes de escribir aserciones, responde estas cuatro preguntas.
1. ¿Qué pruebas?
Prioriza endpoints y flujos por riesgo y tráfico.
Ejemplos:
- API de pagos: alta prioridad.
- Login y autorización: alta prioridad.
- Creación de pedidos: alta prioridad.
- Endpoint de health check: baja prioridad.
- Endpoint interno con poco tráfico: prioridad media o baja.
No empieces por lo más fácil de probar. Empieza por lo que más daño causa si falla.
2. ¿En qué capa?
No todo debe probarse con un flujo end-to-end.
- Una validación de campo pertenece a una prueba de una sola solicitud.
- Una interacción entre servicios pertenece a integración.
- Un flujo completo de usuario pertenece a end-to-end.
Si pones todas las verificaciones en la capa superior, tu suite será lenta, frágil y difícil de depurar.
3. ¿Cuándo se ejecuta?
Separa pruebas rápidas y lentas.
- En cada push: pruebas funcionales, contrato y regresión rápida.
- Diariamente: integración, seguridad básica y suites más amplias.
- Antes del lanzamiento: carga, rendimiento, seguridad y flujos críticos.
Mezclar todo en cada commit hace que la retroalimentación sea lenta. Ejecutar poco reduce cobertura.
4. ¿Qué cuenta como éxito?
Una prueba que solo verifica 200 OK casi no valida nada.
Define al menos:
- Código de estado esperado.
- Esquema de respuesta.
- Campos obligatorios.
- Valores clave.
- Mensaje de error esperado.
- Tiempo máximo de respuesta si aplica.
Ejemplo de aserciones mínimas para GET /users/42:
status == 200
body.id == 42
body.email matches email format
body.name is string
response_time < 500ms
Por qué una estrategia supera a las pruebas ad hoc
Las pruebas ad hoc funcionan para una demo, pero fallan en servicios reales.
No se repiten
Si una persona prueba manualmente una solicitud, otra no puede reproducir exactamente la misma verificación. Una prueba automatizada guardada se ejecuta igual cada vez.
Se concentran en el camino feliz
Cuando pruebas a mano, normalmente envías datos válidos. Pero muchos errores aparecen con:
- Payloads malformados.
- Tokens vencidos.
- Campos faltantes.
- IDs inexistentes.
- Listas enormes.
- Valores límite.
No escalan
Un servicio con 40 endpoints y 5 entornos implica 200 verificaciones manuales por lanzamiento. Nadie mantiene eso a mano.
Una estrategia convierte esas verificaciones en una suite repetible que corre con cada cambio.
La pirámide de pruebas de API
La pirámide ayuda a decidir cuántas pruebas escribir en cada capa.
/\
/ \ End-to-end / flujos completos
/----\ Pocas, lentas, alto valor
/ \
/--------\ Integración / contrato
/ \ Algunas, velocidad media
/____________\ Unitarias / una sola solicitud
Muchas, rápidas, baratas
Capa inferior: pruebas de una sola solicitud
Cada prueba llama a un endpoint y valida la respuesta.
Úsalas para:
- Códigos de estado.
- Validación de campos.
- Esquemas.
- Mensajes de error.
- Reglas simples de negocio.
Son rápidas, baratas y fáciles de depurar. La mayoría de tu suite debe vivir aquí.
Capa intermedia: integración y contrato
Estas pruebas verifican que varios componentes coinciden en datos y comportamiento.
Úsalas para:
- APIs que consumen otros equipos.
- Cambios de esquema.
- Comunicación con base de datos.
- Comunicación con servicios externos.
- Flujos que atraviesan dos o tres servicios.
Capa superior: end-to-end
Ejecutan un flujo completo.
Ejemplo:
- Crear pedido.
- Pagar pedido.
- Consultar estado.
- Verificar confirmación.
Son valiosas, pero costosas. Mantén pocas y enfocadas en rutas críticas.
El error común es invertir la pirámide: muchas pruebas end-to-end lentas y pocas pruebas rápidas. Si una capa inferior puede detectar el mismo fallo, pon la prueba ahí.
Tipos de pruebas y cuándo usar cada una
Una estrategia completa combina varios tipos de pruebas. Cada una detecta una clase distinta de fallo.
Pruebas funcionales
Las pruebas funcionales verifican que un endpoint hace lo que especifica su contrato.
Automatízalas primero para cada endpoint importante.
Ejemplo:
GET /api/users/42 HTTP/1.1
Host: api.example.com
Authorization: Bearer <token>
Aserciones:
- El estado es
200. - El cuerpo coincide con el esquema
Usuario. -
ides42. -
emailtiene formato válido. - No aparecen campos internos o sensibles.
Para profundizar: pruebas funcionales de API.
Pruebas de integración
Las pruebas de integración verifican que endpoints, servicios y dependencias funcionan juntos.
Ejemplos:
- Crear un pedido y confirmar que se guardó en la base de datos.
- Procesar un pago con un proveedor externo o sandbox.
- Enviar un evento y verificar que otro servicio lo consume.
Una prueba funcional puede pasar con una dependencia simulada y fallar con la real. Las pruebas de integración cierran esa brecha.
Guía completa: pruebas de integración de API.
Pruebas de regresión
Las pruebas de regresión vuelven a ejecutar tu suite existente para confirmar que un cambio no rompió comportamiento anterior.
No necesitas “escribir pruebas de regresión” como una categoría separada. Tu suite funcional, de contrato e integración se convierte en regresión cuando la ejecutas continuamente.
Ejecuta regresión:
- En cada commit para pruebas rápidas.
- Antes del lanzamiento para suites completas.
- Después de corregir bugs críticos.
Más detalles: pruebas de regresión.
Pruebas de contrato
Las pruebas de contrato verifican que proveedor y consumidor coinciden en la forma exacta de solicitudes y respuestas.
Detectan cambios incompatibles como:
- Renombrar un campo.
- Cambiar un tipo.
- Eliminar un endpoint.
- Cambiar una estructura anidada.
- Hacer obligatorio un campo antes opcional.
Si otros equipos o clientes consumen tu API, estas pruebas son necesarias.
Referencia: pruebas de contrato de API.
Pruebas de carga y rendimiento
Las pruebas de carga miden cómo responde tu API bajo tráfico concurrente.
Métricas útiles:
- Latencia p95.
- Latencia p99.
- Tasa de error.
- Throughput.
- Punto de degradación.
- Uso de CPU, memoria y conexiones.
Ejecútalas:
- Antes de lanzamientos importantes.
- Antes de picos de tráfico conocidos.
- De forma programada para detectar degradación gradual.
Consulta opciones en herramientas de pruebas de carga.
Pruebas de seguridad
Las pruebas de seguridad validan que la API rechaza solicitudes peligrosas o no autorizadas.
Casos mínimos:
- Sin token:
401. - Token vencido:
401. - Token válido sin permisos:
403. - Acceso a datos de otro usuario:
403o404. - Payload con intento de inyección: error controlado.
- Campos sensibles: nunca deben aparecer en la respuesta.
Más técnicas: pruebas de seguridad de API.
Cuándo ejecutar cada tipo de prueba
| Tipo de prueba | Detecta | Cuándo se ejecuta |
|---|---|---|
| Funcional | Estado, esquema o valores incorrectos | Cada commit |
| Integración | Flujos rotos entre servicios | Cada commit o por la noche |
| Regresión | Comportamiento existente recién roto | Cada commit y antes del lanzamiento |
| Contrato | Cambios incompatibles en la interfaz | Cada commit en el proveedor |
| Carga | Lentitud y fallos bajo tráfico | Pre-lanzamiento y programado |
| Seguridad | Fallos de autenticación, autorización o exposición de datos | Pre-lanzamiento y programado |
Casos positivos, negativos y de borde
Para cada endpoint, cubre tres tipos de entrada.
Casos positivos
Envían entrada válida y esperan éxito.
Ejemplo:
POST /api/users HTTP/1.1
Content-Type: application/json
{
"name": "Ana",
"email": "ana@example.com"
}
Esperado:
status == 201
body.id exists
body.email == "ana@example.com"
Casos negativos
Envían entrada inválida y esperan un fallo controlado.
Ejemplos:
- Campo obligatorio faltante:
400. - Token ausente:
401. - Permiso insuficiente:
403. - Recurso inexistente:
404. - Payload inválido:
400.
Ejemplo:
POST /api/orders HTTP/1.1
Content-Type: application/json
{
"customerId": "c_123",
"quantity": -5
}
Esperado:
status == 400
body.error contains "quantity"
Si esto devuelve 201 o 500, encontraste un bug que el camino feliz no detectaría.
Casos de borde
Prueban límites válidos o casi válidos:
- Lista vacía.
- Lista con el máximo permitido.
- Cadena con longitud máxima.
-
0. - Número negativo.
- Unicode.
- Fechas en cambio de horario.
- IDs con formato válido pero inexistentes.
Regla práctica: por cada prueba positiva, escribe al menos una negativa.
Datos de prueba y entornos
Tus pruebas son tan confiables como los datos y entornos donde corren.
Usa datos dedicados
No dependas de registros de producción ni de filas que “deberían existir”.
Mejor:
- Crear los datos al inicio de la prueba.
- Usar fixtures conocidos.
- Generar datos realistas.
- Limpiar lo creado al finalizar.
Para datos realistas: cómo crear datos de prueba de API realistas.
Haz las pruebas independientes
Cada prueba debe configurar su propio estado.
Evita esto:
test_02 depende de que test_01 creó userId=42
Prefiere esto:
test_02 crea su propio usuario
test_02 usa ese id
test_02 elimina ese usuario
Si necesitas pasar valores entre solicitudes dentro de un escenario, hazlo explícito: captura id, token o orderId y úsalo en el siguiente paso.
Aísla entornos
Mantén configuraciones separadas para:
- Local.
- CI.
- Staging.
- Producción.
Parametriza:
- Base URL.
- Tokens.
- IDs de tenant.
- Credenciales.
- Feature flags.
Ejemplo:
{{baseUrl}}/api/users/{{userId}}
Authorization: Bearer {{token}}
Diferencia útil: sandbox vs entorno de prueba.
Shift left: prueba antes, no solo más
Shift left significa mover las pruebas hacia etapas más tempranas del ciclo de desarrollo.
Un error de esquema detectado durante diseño puede corregirse en minutos. El mismo error en producción puede convertirse en incidente.
Diseña el contrato primero
Define solicitudes y respuestas antes de implementar.
Ejemplo de contrato simplificado:
{
"User": {
"type": "object",
"required": ["id", "email"],
"properties": {
"id": { "type": "integer" },
"email": { "type": "string", "format": "email" }
}
}
}
Con un contrato definido puedes:
- Generar mocks.
- Escribir pruebas antes del backend.
- Validar consumidores.
- Detectar cambios incompatibles.
Prueba contra mocks
Frontend e integraciones no tienen que esperar al backend completo. Un mock basado en el esquema permite avanzar en paralelo.
Úsalo para:
- Validar manejo de respuestas.
- Probar estados de error.
- Simular latencia.
- Desarrollar clientes antes de que exista la implementación.
Ejecuta verificaciones rápidas en cada commit
Las pruebas funcionales y de contrato que corren en segundos pertenecen al ciclo interno del desarrollador.
Más contexto: pruebas de desplazamiento a la izquierda en el desarrollo de API.
Automatización de pruebas en CI
Una estrategia solo es real si se ejecuta sin intervención manual.
Una pipeline mínima debe:
- Ejecutar pruebas rápidas en cada push.
- Fallar si alguna aserción falla.
- Publicar un informe legible.
- Ejecutar suites lentas en horarios separados.
Ejemplo con GitHub Actions:
name: api-tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Install dependencies
run: npm ci
- name: Run API tests
run: npm test
El comando exacto depende de tus herramientas. El patrón es el mismo:
- Checkout del código.
- Configuración del runtime.
- Instalación de dependencias.
- Ejecución de la suite.
- Código de salida distinto de cero para fallar la build.
- Publicación de reportes.
Para una configuración más completa: cómo automatizar pruebas de API en CI/CD.
Cómo encaja Apidog en la estrategia
La estrategia anterior es agnóstica a herramientas. Puedes construirla con herramientas separadas para diseño, pruebas, mocks y documentación.
El costo es la deriva:
- La especificación cambia.
- Las pruebas quedan desactualizadas.
- El mock ya no representa el contrato.
- La documentación no coincide con la implementación.
Apidog centraliza esas piezas en una fuente de verdad:
- Diseño del contrato de API.
- Escenarios de prueba.
- Mock generado desde el esquema.
- Documentación.
- Ejecución de suites guardadas.
Para CI, la CLI de Apidog permite ejecutar escenarios y suites sin interfaz gráfica.
Instalación:
npm install -g apidog-cli
Ejecución básica:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioOrSuiteId> \
-e <environmentId> \
-r cli,html,junit
Opciones principales:
-
--access-token: token de acceso. Guárdalo como secreto de CI. -
-t: ID del escenario, carpeta o suite. -
-e: ID del entorno. -
-r: reporteros. Puede incluircli,html,jsonyjunit.
Ejemplo con datos externos:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t <scenarioId> \
-e <environmentId> \
-d ./data/users.csv \
-r cli,junit
Opciones útiles:
-
--upload-report: sube el informe a la nube. -
--branch: ejecuta contra una rama específica.
La CLI ejecuta escenarios y suites guardados de Apidog. No reemplaza una herramienta dedicada de carga, así que úsala para la parte funcional, contrato, regresión e integración de tu estrategia, y combina otra herramienta para rendimiento.
Lista de verificación para empezar
Si estás creando una estrategia desde cero, sigue este orden:
- [ ] Clasifica endpoints por riesgo y tráfico.
- [ ] Cubre primero endpoints críticos.
- [ ] Escribe una prueba funcional positiva por endpoint prioritario.
- [ ] Agrega al menos una prueba negativa por endpoint.
- [ ] Agrega casos de borde para listas, números, fechas y texto libre.
- [ ] Agrega pruebas de contrato para APIs consumidas por otros equipos o clientes.
- [ ] Agrega pruebas de integración para flujos entre servicios.
- [ ] Define variables por entorno.
- [ ] Guarda secretos fuera del código.
- [ ] Usa datos de prueba generados o fixtures.
- [ ] Haz que cada prueba sea independiente.
- [ ] Ejecuta pruebas rápidas en cada push.
- [ ] Falla la build cuando falle una aserción.
- [ ] Programa suites lentas diariamente o antes del lanzamiento.
- [ ] Publica reportes JUnit para CI.
- [ ] Revisa y elimina pruebas obsoletas cuando cambie la API.
No necesitas todo el primer día. Empieza con pruebas funcionales y negativas en endpoints de alto riesgo, ejecútalas en CI y expande desde ahí.
Preguntas frecuentes
¿Cuál es la diferencia entre una estrategia de pruebas de API y un plan de pruebas?
Una estrategia define el enfoque general: tipos de pruebas, capas y frecuencia de ejecución.
Un plan de pruebas es específico para una versión o funcionalidad: endpoints, casos, datos y criterios de aprobación.
La estrategia cambia poco. El plan cambia con cada lanzamiento.
¿Cuántas pruebas debería tener en cada capa?
No hay una proporción fija, pero la forma importa:
- Muchas pruebas rápidas de una sola solicitud.
- Algunas pruebas de integración y contrato.
- Pocas pruebas end-to-end.
Si tus pruebas lentas superan a tus pruebas rápidas, reequilibra la suite.
¿Necesito pruebas de contrato si ya tengo pruebas funcionales?
Sí, si otros equipos o clientes consumen tu API.
Las pruebas funcionales validan comportamiento. Las pruebas de contrato validan que la interfaz no cambió de forma incompatible.
Un endpoint puede seguir funcionando y aun así romper a sus consumidores.
¿Con qué frecuencia debo ejecutar pruebas de carga?
Ejecuta pruebas de carga:
- Antes de lanzamientos importantes.
- Antes de picos de tráfico conocidos.
- Semanal o mensualmente para detectar degradación.
No las ejecutes en cada commit. Son lentas, costosas y requieren infraestructura adecuada.
¿Puedo automatizar toda la estrategia en CI?
Puedes automatizar las partes repetibles:
- Funcionales.
- Contrato.
- Integración.
- Regresión.
Las pruebas de carga y seguridad suelen ejecutarse en pipelines o calendarios separados por su costo e infraestructura. Un ejecutor sin interfaz gráfica, como la CLI de Apidog, cubre la ejecución continua de escenarios guardados en CI.
Top comments (0)