Envías un pequeño cambio a un endpoint. El código compila, la nueva función funciona y lo despliegas. Dos días después, un cliente móvil empieza a fallar porque un campo que renombraste solía ser una cadena y ahora es un objeto. Nadie tuvo la intención de romperlo. El cambio parecía local. No lo era.
Las pruebas de regresión de API existen para detectar ese tipo de fallos antes de que lleguen a nadie. Guardas un conjunto de pruebas que describen cómo se comporta tu API hoy, y luego vuelves a ejecutar ese conjunto en cada cambio. Cuando la forma de una respuesta, el código de estado o el valor de una clave se desvían de lo que registraste, el conjunto falla y te dice exactamente dónde. Esta guía cubre qué establecer como línea base, cómo construir un conjunto reutilizable y cómo ejecutarlo automáticamente en CI para que un cambio de nombre nunca se convierta en un incidente.
¿Qué son las pruebas de regresión de API (y por qué las API regresan)?
Las pruebas de regresión significan volver a ejecutar pruebas que ya pasaron para confirmar que el comportamiento existente se mantiene después de un cambio. Para las API, el "comportamiento existente" es el contrato del que dependen tus consumidores: las rutas, los códigos de estado, el esquema de respuesta y los valores en los campos clave.
Las API regresan por razones ordinarias. Alguien renombra un campo JSON. Una refactorización cambia un 200 por un 204. Una nueva regla de validación rechaza una entrada que antes era aceptada. Una actualización de ORM cambia silenciosamente el formato de la fecha. Una actualización de dependencia altera un mensaje de error que un cliente analiza. Ninguno de estos aparece como errores de compilación. Se manifiestan como integraciones rotas, y a menudo solo para un subconjunto de llamadores.
La distinción importante aquí: las pruebas de regresión de API son más específicas que las pruebas de regresión de software generales. No estás volviendo a verificar la lógica de negocio en toda la aplicación. Estás comprobando que la superficie HTTP, la parte a la que se acoplan otros sistemas, no se ha movido. Ese enfoque es lo que hace que sea económico ejecutarlo en cada commit.
Qué establecer como línea base
Un conjunto de regresión es tan bueno como lo que afirma. Afirmar muy poco y los fallos reales se cuelan. Afirmar demasiado y cada cambio intencional pondrá el conjunto en rojo. Apunta a los campos que un consumidor realmente notaría.
Establece como línea base estas cuatro capas:
- Códigos de estado. Cada endpoint debe devolver un estado conocido para entradas conocidas. Un
200que se convierte en un500, o un201que se convierte en un200, es una regresión incluso si el cuerpo parece correcto. - Esquema de respuesta. La estructura y los tipos de la respuesta. Nombres de campo, anidamiento y si un valor es una cadena, número, array u objeto. La desviación del esquema es la ruptura silenciosa más común.
- Valores de campos clave. No todos los valores, sino aquellos con significado contractual: un
idque debe estar presente, un enumeradorstatusque debe permanecer dentro de un conjunto conocido, untotalque debe ser un número. - Contratos. La relación entre tu especificación OpenAPI y la respuesta en vivo. Si la especificación dice que
emailes requerido y la API deja de devolverlo, eso es una violación de contrato. Consulta pruebas de contrato de API para saber cómo hacer de la especificación la fuente de la verdad.
Una regla útil: afirma sobre lo que un cliente fallaría, no sobre lo que casualmente está en la carga útil hoy. Una marca de tiempo createdAt cambia en cada solicitud, así que fija su tipo y formato, no su valor.
Aquí hay un conjunto mínimo de afirmaciones para un solo endpoint, escritas como comprobaciones simples que ejecutarías contra una respuesta:
GET /v1/users/42 -> 200
body.id is present, type number
body.email is present, type string, matches email format
body.status is one of ["active", "pending", "suspended"]
body.roles type array
response time < 800 ms
Esas cinco líneas describen el contrato. Si alguna de ellas falla después de un cambio, tienes una regresión. Para un tratamiento más profundo sobre cómo escribir comprobaciones contra los cuerpos de respuesta, consulta afirmaciones de API.
Pruebas de regresión manuales vs. automatizadas
Puedes realizar pruebas de regresión a mano. Después de un cambio, abres tu cliente API, reproduces un puñado de solicitudes guardadas y examinas las respuestas. Esto funciona para un endpoint y se desmorona a partir de diez. Los humanos se saltan los casos aburridos, y los casos aburridos son donde se esconden las regresiones. Las comprobaciones manuales tampoco pueden ejecutarse a las 2 a.m. cuando un trabajo programado fusiona una actualización de dependencia.
Las pruebas de regresión automatizadas eliminan al humano del bucle. Grabas el conjunto una vez, luego una máquina lo vuelve a ejecutar en cada push, cada pull request y cada despliegue. El valor no es la velocidad en una sola ejecución. Es que el conjunto se ejecuta cada vez, sin que nadie decida que vale la pena el esfuerzo.
La contrapartida es el trabajo inicial. Tienes que construir el conjunto y mantenerlo actualizado. Ese costo de mantenimiento es real, pero es menor que el costo de un incidente de producción que una prueba de cinco segundos habría detectado.
| Manual | Automatizado | |
|---|---|---|
| Se ejecuta en cada cambio | No, depende de la disciplina | Sí, por defecto |
| Cobertura | Pocos endpoints | Todo el conjunto |
| Costo por ejecución | Minutos de tiempo humano | Segundos de cómputo |
| Detecta fallos a las 2 a.m. | No | Sí |
| Esfuerzo inicial | Bajo | Moderado |
Para cualquier cosa más allá de un proyecto de juguete, automatízalo.
Construyendo un conjunto de regresión reutilizable
Un conjunto de regresión es un grupo de solicitudes guardadas, cada una con afirmaciones, agrupadas para que puedas ejecutarlas juntas. El objetivo es la reutilización: construirlo una vez, ejecutarlo para siempre, extenderlo cuando añades endpoints.
Estructura el conjunto para que sobreviva a los cambios:
Agrupa por recurso, no por característica. Pon todas las pruebas de /users juntas, todas las pruebas de /orders juntas. Cuando toques el servicio de usuarios, sabrás qué grupo observar.
Usa variables de entorno para todo lo que se mueve. La URL base, los tokens de autenticación y los IDs de inquilino pertenecen a un entorno, no codificados directamente en cada solicitud. Esto permite que el mismo conjunto se ejecute contra entornos locales, de staging y de producción intercambiando una sola configuración.
Encadena solicitudes que dependen una de la otra. Un flujo realista crea un recurso, lo lee, lo actualiza y lo elimina. Extrae el id de la respuesta de creación y pásalo a la siguiente solicitud. Esto detecta regresiones que solo aparecen en una secuencia, no de forma aislada. Aquí es donde las pruebas de regresión se superponen con las pruebas de integración de API.
Maneja los casos extremos con datos. En lugar de diez solicitudes casi idénticas, escribe una solicitud y aliméntala con una tabla de entradas: valores válidos, valores vacíos, valores límite y valores conocidos como incorrectos. Cada fila se convierte en un caso de prueba. Las pruebas impulsadas por datos mantienen el conjunto pequeño al tiempo que amplían la cobertura.
Así podría verse una tabla de datos para una sola prueba de validación en formato CSV:
email,expectedStatus
alice@example.com,201
bob@test.co,201
not-an-email,422
,422
a@b,422
Una solicitud, cinco casos, cinco afirmaciones sobre el código de estado. Añade una fila cuando encuentres un nuevo caso extremo, y el conjunto crece sin nuevo código.
Mantén el conjunto rápido. Un conjunto de regresión que tarda veinte minutos será omitido. Simula las dependencias de terceros lentas, ejecuta solicitudes independientes en paralelo donde tu herramienta lo permita, y reserva los flujos completos de extremo a extremo para una ejecución nocturna más pequeña y lenta.
Ejecutando el conjunto en cada cambio en CI
Un conjunto de regresión que reside en tu portátil solo protege tu portátil. El objetivo es ejecutarlo en integración continua, en los mismos eventos que pueden introducir una regresión: pull requests y fusiones en tu rama principal.
El patrón es el mismo en todos los sistemas de CI. Instala un runner sin interfaz gráfica, apúntalo a tu conjunto guardado y haz que la compilación falle si alguna afirmación falla. Apidog incluye un runner de línea de comandos exactamente para esto. Instálalo con Node:
npm install -g apidog-cli
Luego ejecuta un escenario de prueba o conjunto guardado por su ID, contra un entorno elegido, y emite informes:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t 123456 \
-e 789012 \
-r cli,html,junit
Desglosémoslo:
--access-tokenautentica la ejecución. Guarda el token como un secreto de CI, nunca en el repositorio.-tes el ID del escenario, carpeta o conjunto a ejecutar.-ees el ID del entorno, para que el mismo conjunto pueda apuntar a staging o producción cambiando un valor.-renumera los formatos de informe.cliimprime en la consola,htmlproduce un informe legible yjunitemite XML que tu CI puede analizar para mostrar si cada prueba pasó o falló.
El runner no tiene interfaz gráfica. Se adapta a cualquier paso de CI que pueda ejecutar Node, por lo que el mismo comando funciona en GitHub Actions, GitLab CI, Jenkins o CircleCI. Aquí hay un trabajo de GitHub Actions que ejecuta el conjunto en cada pull request:
name: API Regression
on: [pull_request]
jobs:
regression:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: '22'
- run: npm install -g apidog-cli
- run: |
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t 123456 \
-e 789012 \
-r cli,junit
env:
APIDOG_ACCESS_TOKEN: ${{ secrets.APIDOG_ACCESS_TOKEN }}
Cuando un escenario falla, el runner sale con un código distinto de cero y el trabajo se pone en rojo. El pull request queda bloqueado hasta que alguien lo revise. Para una pipeline completa de copiar y pegar y más patrones de CI, consulta Apidog CLI para CI/CD y cómo automatizar pruebas de API en GitHub Actions.
Si alimentas el conjunto con un archivo de datos, pásalo con -d:
apidog run \
--access-token "$APIDOG_ACCESS_TOKEN" \
-t 123456 \
-e 789012 \
-d ./test-data/emails.csv \
-r cli,junit
¿Probando una rama de características que tiene su propia versión de API? Añade --branch para ejecutar contra el conjunto guardado de esa rama en lugar del predeterminado. Para mantener un historial de ejecuciones en la nube, añade la bandera --upload-report sin valor.
Diferencias de esquema y contrato (Schema and contract diffing)
Las afirmaciones detectan regresiones en el comportamiento. La comparación de esquemas las detecta en la definición, a menudo antes de que despliegues.
La idea: tu especificación OpenAPI es un archivo versionado en tu repositorio. Cuando alguien lo edita, comparas la nueva especificación con la anterior y clasificas el cambio. Añadir un campo opcional es seguro. Eliminar un campo, renombrarlo, restringir un tipo o hacer que un campo opcional sea obligatorio es un cambio disruptivo. Una herramienta de comparación puede marcar los cambios disruptivos en el pull request, para que el revisor vea "esto elimina user.phone" en lugar de una pared de YAML.
Combínalo con pruebas de contrato contra la API en vivo. En cada ejecución, valida las respuestas reales contra el esquema actual. Si la especificación promete un campo que la API ya no devuelve, o la API devuelve un tipo que la especificación prohíbe, la verificación falla. Esta es la guardia de dos lados: la diferencia de especificación detecta ediciones intencionales al contrato, y la prueba de contrato detecta que el código se desvía del contrato.
Los cambios disruptivos no siempre son errores. A veces, tienes la intención de eliminar un campo. El objetivo de la comparación es hacer explícita esa decisión y enrutarla a través de tu proceso de versionado y deprecación en lugar de sorprender a un cliente. Consulta cómo versionar y deprecación APIs a escala para gestionar los cambios que haces a propósito.
Cómo Apidog ejecuta conjuntos de regresión
Apidog cubre las piezas descritas anteriormente en un solo lugar, lo que mantiene el conjunto y la especificación uno al lado del otro.
Construyes escenarios de prueba visualmente: encadenas solicitudes, extraes valores de una respuesta a la siguiente y adjuntas afirmaciones sobre el estado, el esquema y los valores de los campos. Debido a que el diseño de la API y las pruebas viven en el mismo proyecto, puedes validar las respuestas contra el esquema guardado del endpoint sin escribir el esquema dos veces. Cuando el diseño cambia, el esquema contra el que se verifican las pruebas cambia con él.
Para casos basados en datos, adjunta un conjunto de datos CSV o JSON a un escenario y Apidog ejecuta un caso por fila. Guarda escenarios relacionados en un conjunto de pruebas para que una sola ejecución ejercite un recurso o flujo completo.
El runner apidog-cli lleva esos conjuntos guardados sin interfaz gráfica a CI, como se muestra arriba. Ejecuta escenarios y conjuntos guardados. No es un remitente de solicitudes interactivo ni un generador de carga. Hace un solo trabajo: reproducir tu conjunto de regresión e informar lo que pasó. Ese alcance limitado es lo que le permite encajar en cualquier paso de CI compatible con Node. Para el CLI más un flujo de trabajo scriptado, consulta la guía de pipeline de CI/CD de Apidog CLI.
Un flujo de trabajo inicial
Aquí hay una secuencia que puedes adoptar esta semana sin reconstruir tu estrategia de pruebas:
- Elige tus cinco endpoints más llamados. El riesgo de regresión se concentra donde hay tráfico. Empieza por ahí.
- Guarda una solicitud por endpoint con afirmaciones. Código de estado, esquema de respuesta y dos o tres campos clave cada uno. Esta es tu línea base.
- Añade un flujo encadenado. Crear, leer, actualizar, eliminar en tu recurso principal. Esto detecta regresiones entre solicitudes que las pruebas aisladas pasan por alto.
- Añade una tabla de datos a un endpoint con mucha validación. Un puñado de entradas válidas, vacías y erróneas.
- Intégralo en CI en los pull requests. Instala
apidog-cli, ejecuta el conjunto con-r junity bloquea las fusiones si falla. - Haz crecer el conjunto cuando se escape un error. Cada regresión en producción que se cuela se convierte en un nuevo caso de prueba. El conjunto se fortalece a partir de sus propios fallos.
Los pasos del uno al cuatro son una tarde. El paso cinco es un único archivo de CI. Después de eso, el conjunto se ejecuta solo y lo extiendes solo cuando la realidad te enseña un nuevo modo de fallo. Ese bucle de retroalimentación es el objetivo principal: un cambio de nombre que habría sido un incidente se convierte en una verificación roja en un pull request.
Preguntas frecuentes
- ¿En qué se diferencia las pruebas de regresión de API de las pruebas de regresión generales? Las pruebas de regresión generales verifican el comportamiento de la aplicación en todo el sistema, incluyendo la interfaz de usuario y la lógica de negocio. Las pruebas de regresión de API se limitan a la superficie HTTP: rutas, códigos de estado, esquema de respuesta y valores de campos clave. El enfoque limitado lo mantiene lo suficientemente rápido como para ejecutarse en cada commit, y se dirige exactamente a lo que otros sistemas se acoplan.
- ¿Con qué frecuencia debo ejecutar el conjunto de regresión? En cada cambio que pueda afectar la API. En la práctica, esto significa cada pull request y cada fusión a tu rama principal, ejecutándose automáticamente en CI. Mantén un conjunto central rápido para los pull requests y una ejecución más grande de extremo a extremo para las compilaciones nocturnas, para que la verificación por commit se mantenga rápida.
- ¿Qué debo afirmar para evitar un conjunto frágil? Afirma sobre lo que un consumidor fallaría. Fija los códigos de estado, la estructura y los tipos de respuesta, y los valores de los campos con significado contractual como los IDs y los enumeradores de estado. Para valores que cambian en cada solicitud, como las marcas de tiempo, afirma sobre el tipo y el formato, no sobre el valor literal. Afirmar en exceso sobre datos volátiles es la causa principal de fallos falsos.
- ¿Puedo ejecutar pruebas de regresión de API sin escribir código? Sí. Herramientas como Apidog te permiten construir escenarios y afirmaciones visualmente, y luego ejecutarlos sin interfaz gráfica en CI con
apidog-cli. Guardas el conjunto una vez a través de la interfaz y el ejecutor de línea de comandos lo reproduce en tu pipeline, de modo que las pruebas se ejecutan automáticamente sin un arnés de prueba escrito a mano. - ¿Cómo manejo los cambios disruptivos intencionales? Canalízalos a través de tu proceso de versionado y deprecación en lugar de permitir que aparezcan como fallos sorpresa en las pruebas. Utiliza la comparación de esquemas para marcar el cambio en la revisión, versiona el endpoint o añade el campo como opcional primero, y actualiza la línea base de regresión deliberadamente una vez que el cambio sea intencional y se haya comunicado a los consumidores.
