DEV Community

Cover image for Estrategias de Pruebas de API: Guía Práctica para APIs Confiables
Roobia
Roobia

Posted on • Originally published at apidog.com

Estrategias de Pruebas de API: Guía Práctica para APIs Confiables

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.

Prueba Apidog hoy

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. Crear pedido.
  2. Pagar pedido.
  3. Consultar estado.
  4. 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>
Enter fullscreen mode Exit fullscreen mode

Aserciones:

  • El estado es 200.
  • El cuerpo coincide con el esquema Usuario.
  • id es 42.
  • email tiene 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: 403 o 404.
  • 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"
}
Enter fullscreen mode Exit fullscreen mode

Esperado:

status == 201
body.id exists
body.email == "ana@example.com"
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

Esperado:

status == 400
body.error contains "quantity"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Prefiere esto:

test_02 crea su propio usuario
test_02 usa ese id
test_02 elimina ese usuario
Enter fullscreen mode Exit fullscreen mode

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}}
Enter fullscreen mode Exit fullscreen mode

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" }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Ejecutar pruebas rápidas en cada push.
  2. Fallar si alguna aserción falla.
  3. Publicar un informe legible.
  4. 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
Enter fullscreen mode Exit fullscreen mode

El comando exacto depende de tus herramientas. El patrón es el mismo:

  1. Checkout del código.
  2. Configuración del runtime.
  3. Instalación de dependencias.
  4. Ejecución de la suite.
  5. Código de salida distinto de cero para fallar la build.
  6. 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
Enter fullscreen mode Exit fullscreen mode

Ejecución básica:

apidog run \
  --access-token "$APIDOG_ACCESS_TOKEN" \
  -t <scenarioOrSuiteId> \
  -e <environmentId> \
  -r cli,html,junit
Enter fullscreen mode Exit fullscreen mode

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 incluir cli, html, json y junit.

Ejemplo con datos externos:

apidog run \
  --access-token "$APIDOG_ACCESS_TOKEN" \
  -t <scenarioId> \
  -e <environmentId> \
  -d ./data/users.csv \
  -r cli,junit
Enter fullscreen mode Exit fullscreen mode

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)