Tus pruebas de Playwright pasan. El botón de inicio de sesión hace clic, el panel de control se renderiza, el gráfico se pinta. Luego, un cliente informa de un error: los números del gráfico son incorrectos. Investigas y descubres que la API devolvió un estado 200 con una carga útil mal formada, y tu suite de extremo a extremo nunca lo notó porque solo verificó que los píxeles aparecieran en pantalla. Esta es la brecha que las pruebas de navegador por sí solas no pueden cerrar, y es donde las aserciones de API se vuelven no negociables. Herramientas como Apidog te ofrecen una forma de validar contratos de API, esquemas y semántica de respuesta con el mismo rigor que le das a tus flujos de UI, y luego ejecutar ambas suites juntas en CI.
TL;DR
Puedes validar APIs en pruebas de Playwright combinando la fixture request de Playwright y el interceptor page.route con escenarios de Apidog que acceden a la misma especificación OpenAPI. Comparte fixtures a través de un único archivo de especificación, aserción de esquemas de respuesta en ambas capas, y ejecuta ambas suites en un solo trabajo de CI para que un cambio de contrato falle rápidamente en cualquiera de los dos lugares.
Introducción
Playwright es el framework de automatización de navegadores predeterminado para muchos equipos en 2026, y la documentación de Playwright hace que las pruebas de API parezcan fáciles: unas pocas llamadas a request.get, un expect(response.status()).toBe(200), y listo. El problema comienza cuando lo escalas. Terminas con cientos de pruebas que verifican códigos de estado pero no la forma de la respuesta, sin una fuente de verdad compartida entre tus flujos de navegador y tus flujos de API, y sin forma de simular APIs sin conexión cuando el backend es lento o está roto.
La solución es sencilla. Trata tu especificación OpenAPI como el contrato, impulsa las llamadas request de Playwright y los interceptores page.route desde ese contrato, y ejecuta una suite de escenarios de Apidog contra la misma especificación para una validación profunda de esquemas, lógica de negocio y solicitudes encadenadas. Obtendrás retroalimentación rápida en CI, límites claros de propiedad entre las pruebas de frontend y backend, y cero fixtures duplicadas. Si deseas instalar la herramienta primero, Descarga Apidog y regresa; los pasos a continuación asumen que está disponible localmente.
Esto es lo que obtendrás de esta publicación: un modelo mental claro de dónde deben ubicarse las aserciones de API en una suite de Playwright, un patrón de request.fixture funcional, una configuración paso a paso para compartir fixtures entre Playwright y Apidog, consejos avanzados para CI y mocking, y una tabla comparativa de las principales alternativas. Para un contexto más amplio sobre las opciones de herramientas de prueba, consulta nuestra opinión sobre las herramientas de prueba de API para ingenieros de QA.
La brecha entre las pruebas de Playwright y las aserciones de API
Una prueba típica de Playwright inicia sesión, navega a una página y afirma que algún elemento de la UI es visible. Eso te dice que el flujo visible para el usuario funciona. No te dice nada sobre la API que hay detrás. Se escapan tres modos de fallo:
Primero, regresiones en la forma de la carga útil. El endpoint devuelve 200 con un campo renombrado de total_count a totalCount. La UI podría coercionar o mostrar silenciosamente cero. Tu prueba de Playwright ve un número en pantalla y pasa.
Segundo, desplazamiento de la lógica de negocio. Un endpoint de descuento aplica un 10 por ciento de rebaja en lugar del 15 por ciento contratado. La UI muestra lo que la API devuelve, por lo que la prueba pasa. Solo el equipo de finanzas lo nota, semanas después.
Tercero, cobertura de rutas de error. Las pruebas de Playwright casi siempre ejecutan el camino feliz. Tu API tiene docenas de ramas 4xx y 5xx: límites de tasa, tokens caducados, fallos parciales, conflictos de idempotencia. Ninguno de ellos se ejercita a menos que escribas una suite de pruebas de API separada.
Puedes parchear algo de esto añadiendo llamadas a request.get dentro de tus especificaciones de Playwright y aserción de cuerpos de respuesta. Eso funciona para un puñado de endpoints. Se desmorona cuando tienes 200 endpoints y quieres escenarios encadenados como "crear pedido, obtener pedido, cancelar pedido, verificar webhook de reembolso". Playwright es un framework de automatización de navegador primero; no está diseñado para flujos de trabajo de API con estado o ergonomía de aserciones a nivel de esquema. Ahí es donde una herramienta de prueba de API dedicada se gana su sueldo.
La división correcta es:
- Las pruebas de Playwright verifican los flujos de la UI, la interceptación de la red y una capa delgada de comprobaciones superficiales de la API en el límite de una acción del usuario.
- Los escenarios de Apidog verifican la conformidad del esquema, los flujos de trabajo encadenados de la API, el cumplimiento del contrato y las rutas de error en profundidad.
Ambas suites consumen la misma especificación OpenAPI para que nunca tengas dos versiones de la verdad. Para una visión más profunda del enfoque "contract-first", nuestro artículo sobre herramientas de desarrollo de API "design-first" explica por qué la especificación debe liderar.
Cómo compartir fixtures entre Playwright y Apidog
La única fuente de verdad es tu especificación OpenAPI, generalmente openapi.yaml o openapi.json en la raíz del repositorio. Playwright lo lee para obtener helpers de solicitud tipados y cargas útiles de ejemplo; Apidog lo importa directamente para poblar los pasos del escenario. Cada vez que el backend envía un cambio de contrato, ambas suites lo recogen.
Comienza con una carpeta fixtures/ que contenga datos de prueba reutilizables: usuarios, tokens, cargas útiles de ejemplo. Construye un archivo de fixture de Playwright que los cargue y los exponga a las pruebas:
// tests/fixtures/api.ts
import { test as base, APIRequestContext, expect } from '@playwright/test';
import { readFileSync } from 'fs';
import path from 'path';
type ApiFixtures = {
apiRequest: APIRequestContext;
authToken: string;
sampleOrder: Record<string, unknown>;
};
export const test = base.extend<ApiFixtures>({
apiRequest: async ({ playwright }, use) => {
const ctx = await playwright.request.newContext({
baseURL: process.env.API_BASE_URL ?? 'https://api.staging.example.com',
extraHTTPHeaders: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
});
await use(ctx);
await ctx.dispose();
},
authToken: async ({ apiRequest }, use) => {
const res = await apiRequest.post('/auth/token', {
data: { email: 'qa@example.com', password: process.env.QA_PASSWORD },
});
expect(res.status()).toBe(200);
const body = await res.json();
await use(body.access_token);
},
sampleOrder: async ({}, use) => {
const raw = readFileSync(
path.join(__dirname, '..', '..', 'fixtures', 'order.json'),
'utf8',
);
await use(JSON.parse(raw));
},
});
export { expect };
Ahora importas test de este archivo de fixture en lugar de @playwright/test en cada especificación, y tienes un apiRequest tipado, un authToken fresco y datos de sampleOrder listos para usar. El archivo order.json es la misma carga útil que Apidog usa como cuerpo de ejemplo para POST /orders en tus escenarios. Edítalo una vez, ambas suites cambian.
Para el lado de Apidog, abre el proyecto, haz clic en "Importar" y apúntalo al mismo openapi.yaml. Apidog genera endpoints, ejemplos de solicitudes y esquemas de parámetros en segundos. Luego, guarda tus payloads de fixture como "Variables de entorno" o "Conjuntos de datos" de Apidog:
// tests/orders.spec.ts
import { test, expect } from './fixtures/api';
test('POST /orders returns a valid order with 15 percent discount', async ({
apiRequest,
authToken,
sampleOrder,
}) => {
const res = await apiRequest.post('/orders', {
headers: { Authorization: `Bearer ${authToken}` },
data: { ...sampleOrder, coupon: 'SAVE15' },
});
expect(res.status()).toBe(201);
const body = await res.json();
expect(body).toMatchObject({
id: expect.any(String),
status: 'pending',
discount_pct: 15,
total_cents: expect.any(Number),
});
expect(body.total_cents).toBeLessThan(sampleOrder.subtotal_cents);
});
Dentro de Apidog, el paso de escenario correspondiente publica la misma carga útil, luego ejecuta la verificación de esquema JSON incorporada contra el componente Order en openapi.yaml. Eso te da profundidad: cada campo se verifica por tipo, se verifican los campos obligatorios, se aplican los valores enumerados. Playwright detecta la aserción semántica de alto valor (discount_pct: 15); Apidog detecta cada campo que se desvía, incluso aquellos que olvidaste asertar manualmente. Si eres nuevo en las pruebas impulsadas por especificaciones, nuestro tutorial sobre flujos de trabajo de API de diseño primero muestra el patrón circundante.
Para equipos que ya usan Postman y están considerando un cambio, alternativas autoalojadas a Postman cubre la mecánica de la migración.
Configura el flujo de trabajo de Apidog + Playwright
Aquí tienes una configuración limpia y repetible que te lleva de cero a CI con doble suite en aproximadamente una hora.
Paso 1: Una especificación para gobernarlas a todas. Coloca openapi.yaml en la raíz del repositorio. Trátalo como código: revisiones de PR obligatorias, los cambios que rompen la compatibilidad requieren un aumento de versión mayor. Si aún no tienes uno, genera un borrador a partir de tus rutas existentes usando un plugin de framework (FastAPI, NestJS y otros emiten OpenAPI de forma nativa), luego edítalo manualmente. Apidog también puede realizar ingeniería inversa de una especificación a partir del tráfico si importas un archivo HAR.
Paso 2: Conecta Playwright. Instala Playwright (npm init playwright@latest) y añade el archivo de fixture mostrado anteriormente. Añade un script npm run test:e2e y un playwright.config.ts que apunte a tu entorno de staging. Mantén las pruebas pequeñas; un escenario por especificación.
Paso 3: Añade la capa de escenarios de Apidog. Dentro de tu proyecto de Apidog, importa openapi.yaml y luego construye un escenario por cada viaje crítico del usuario: registro, pago, reembolso, entrega de webhook, etc. Cada escenario es una secuencia de llamadas a la API con aserciones encadenadas. Apidog admite variables de entorno, scripts previos a la solicitud y aserciones posteriores a la respuesta. Exporta el escenario como un JSON ejecutable por CLI a través de la CLI de Apidog (apidog-cli run scenario.json).
Paso 4: Interceptación de red en Playwright. Cuando la interfaz de usuario obtiene datos que no quieres que impacten en vivo, usa page.route para interceptar y simular. Las respuestas simuladas provienen de los mismos archivos de fixture, por lo que el contrato se mantiene consistente:
test('dashboard renders cached order list when offline', async ({
page,
sampleOrder,
}) => {
await page.route('**/api/orders', async (route) => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ orders: [sampleOrder] }),
});
});
await page.goto('/dashboard');
await expect(page.getByTestId('order-row')).toHaveCount(1);
});
Luego, en Apidog, ejecuta el mismo escenario GET /orders contra tu backend real o contra un servidor mock de Apidog. Mismo fixture, dos capas de verificación.
Paso 5: Integración con CI. Añade un flujo de trabajo de GitHub Actions que ejecute ambas suites en paralelo:
name: tests
on: [push, pull_request]
jobs:
playwright:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
apidog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm i -g apidog-cli
- run: apidog-cli run ./apidog/scenarios/checkout.json --reporters cli,junit
Si cualquiera de los trabajos falla, el merge se bloquea. Usa --reporters junit para que GitHub anote las aserciones fallidas en línea en el PR. La documentación de GitHub Actions cubre las compilaciones matriciales y el almacenamiento en caché si deseas escalar esto. Para equipos sin una función de QA dedicada, el tutorial herramienta de prueba de API para ingenieros de QA explica cómo asignar la propiedad de cada suite.
Paso 6: Detección de desviaciones. Programa un trabajo diario que compare tu openapi.yaml en vivo con la versión contra la que se ejecutaron por última vez tus pruebas. Si un campo cambió de tipo, la diferencia hará que la compilación falle antes de que se ejecute cualquier prueba. Esto detecta la clase de error "200 OK con carga útil incorrecta" con la que comenzamos.
Técnicas avanzadas y consejos profesionales
Algunos movimientos que dan sus frutos una vez que la configuración básica está funcionando.
Fija el visor de rastreo de Playwright. Establece trace: 'on-first-retry' en playwright.config.ts. Cuando una prueba inestable falla en CI, obtienes una línea de tiempo completa de llamadas de red, instantáneas del DOM y registros de la consola. Combínalo con apidog-cli --report html para el lado de la API. Juntos te muestran si la interfaz de usuario se rompió primero o si la API se desvió.
Utiliza servidores mock de Apidog para ejecuciones sin conexión. Apidog puede levantar un servidor mock a partir de tu especificación OpenAPI con un solo clic. Apunta tu entorno de desarrollo local a él cuando el equipo de backend esté en medio de un despliegue o la base de datos de staging esté siendo reiniciada. Tu suite de Playwright se ejecuta en verde contra el mock, y tus escenarios de Apidog verifican el backend real en paralelo. Para más información sobre este patrón, consulta nuestro artículo sobre la generación de pruebas de API asistida por IA, donde los mocks son centrales.
Limita el número de reintentos a dos. retries: 2 en playwright.config.ts. Si una prueba necesita tres reintentos para pasar, es inestable y tienes un problema real. No lo disimules con retries: 5. Lo mismo ocurre con los escenarios de Apidog: establece retry: 1 por solicitud, como máximo.
Falla cerrado ante la deriva del esquema. Cuando Apidog detecta una falta de coincidencia de esquema, sale con un código de error distinto de cero por defecto. No permitas que una advertencia se cuele. Si debes permitir una ventana de "soft-fail", protégela con una variable de entorno como ALLOW_SCHEMA_DRIFT=true y exige un comentario en el PR explicando el motivo.
Etiqueta las pruebas por prioridad. Usa test.describe.configure({ mode: 'serial' }) de Playwright para flujos con estado y etiqueta otras con @smoke, @regression, @nightly. Ejecuta las smoke en cada push, las regression en los PR a main, y las nightly en la suite completa de escenarios de Apidog. Ahorra minutos de CI sin perder cobertura.
Errores comunes a evitar:
- Aserciones solo de
status === 200. Añade al menos una comprobación de campo del cuerpo. - Hardcodificar tokens de portador en fixtures. Usa un
beforeAllpara obtener tokens frescos. - Dejar que Playwright y Apidog importen diferentes archivos de fixture. Una única fuente, punto.
- Saltarse la CLI de Apidog en CI porque "la herramienta de UI es lo suficientemente buena". No lo es; la CLI es lo que hace fallar la compilación.
- Tratar los stubs de
page.routecomo un sustituto de las pruebas de API reales. Son para aislamiento, no para cobertura.
Para equipos que generan pruebas con IA, la guía cómo probar la API de agentes de IA cubre los casos no deterministas que necesitan un cuidado adicional.
Alternativas y comparación de herramientas
Varias combinaciones de herramientas pueden validar APIs junto con pruebas de navegador. Aquí se presenta cómo se comparan las principales opciones.
| Stack | Fortalezas | Debilidades | Mejor para |
|---|---|---|---|
Solo Playwright (fixture request) |
Una herramienta, rápida, nativa de la suite | Validación de esquemas superficial, sin escenarios encadenados, cobertura débil de rutas de error | Equipos pequeños, APIs sencillas |
| Playwright + Postman | Ecosistema Postman maduro, Newman CLI | Dos fuentes de verdad, las colecciones de Postman se desvían de OpenAPI, pago por colaboración | Equipos ya inmersos en Postman |
| Playwright + Apidog | Única fuente OpenAPI, validación de esquemas, mocks, CLI para CI, flujo de trabajo de diseño primero | Dos herramientas que aprender, requiere disciplina de especificación | Equipos que desean pruebas impulsadas por especificaciones y con cobertura completa |
| Cypress + plugin cy-api | Familiar para usuarios de Cypress | Cypress solo se ejecuta en el navegador; las pruebas de API son limitadas; los plugins menos pulidos | Bases de código existentes de Cypress |
| Pact (contratos impulsados por el consumidor) | Fuertes garantías de contrato entre servicios | Curva de aprendizaje pronunciada, infraestructura de broker, no enfocado en la UI | Organización de microservicios con muchos consumidores de API internos |
Si vienes de herramientas más antiguas de la era SOAP, nuestros artículos sobre alternativas a los scripts Groovy de SoapUI y alternativas a ReadyAPI cubren la ruta de migración. Para flujos de trabajo locales, extensiones de cliente REST para VSCode vale la pena leerlo.
La combinación de Playwright + Apidog es la ganadora para equipos que tienen una especificación OpenAPI, implementan múltiples servicios y desean una única pipeline de CI que detecte tanto las regresiones de UI como las de API sin pagar por dos licencias SaaS por ingeniero.
Casos de uso reales
Proceso de pago en comercio electrónico. Un equipo de retail ejecuta pruebas de Playwright para el flujo del carrito a la confirmación y escenarios de Apidog para la cadena de API de intención de pago, verificación de fraude y decremento de inventario. Cuando la pasarela de pago cambió un campo de respuesta de error_code a errorCode, Apidog lo detectó en 90 segundos; Playwright habría mostrado una pantalla genérica de "el pago falló" y habría tardado horas en diagnosticarlo.
Panel de control SaaS con datos de gráficos. Un producto de análisis B2B valida el renderizado de la interfaz de usuario con instantáneas de Playwright y utiliza Apidog para afirmar que los endpoints de agregación devuelven sumas, percentiles y series agrupadas por tiempo correctos. Un error donde el endpoint de latencia p99 eliminaba silenciosamente los valores atípicos fue detectado en la capa de la API; el gráfico se veía bien.
Flujo de trabajo impulsado por webhooks. Un equipo de tecnología financiera utiliza Playwright para el portal de cara al usuario y escenarios de Apidog para la entrega de webhooks, la lógica de reintentos y la idempotencia. Los scripts de Apidog verifican que los IDs de webhook duplicados sean rechazados, que las firmas se validen y que la ventana de consistencia eventual sea inferior a 30 segundos.
Conclusión
Playwright es excelente para los flujos del navegador. No está diseñado para pruebas de API profundas. Emparejarlo con Apidog te ofrece:
- Una especificación OpenAPI como contrato entre ambas suites.
- Fixtures compartidas para que los datos de prueba nunca se desvíen.
- Validación a nivel de esquema en cada endpoint, más allá de los códigos de estado.
- Servidores mock para el desarrollo sin conexión.
- Una única pipeline de CI que falla ante regresiones tanto de UI como de API.
- Interceptación de red en Playwright, cadenas de escenarios profundas en Apidog.
- Propiedad clara: los ingenieros de UI poseen las especificaciones de Playwright, los ingenieros de API poseen los escenarios de Apidog.
Comienza con un viaje crítico, como el pago o el registro. Conecta la fixture de Playwright, construye el escenario de Apidog correspondiente, ejecuta ambos en CI. Expande desde ahí. Descarga Apidog, importa tu especificación OpenAPI y podrás tener el primer escenario funcionando hoy mismo.
FAQ
¿Puedo validar APIs en pruebas de Playwright sin Apidog? Sí, usando la fixture request de Playwright y llamadas expect manuales. Cubrirás los códigos de estado y algunos campos del cuerpo. Para la validación de esquemas, escenarios encadenados, mocks y cobertura de rutas de error a escala, una herramienta dedicada como Apidog es más rápida y produce menos falsos positivos. Consulta nuestra comparación de herramientas de prueba de API para ingenieros de QA para conocer las ventajas y desventajas.
¿Necesito una especificación OpenAPI para usar esta configuración? Necesitas una para obtener el beneficio completo. Sin una especificación, aún puedes ejecutar Playwright y Apidog lado a lado, pero pierdes la fuente de verdad compartida y tienes que mantener las cargas útiles de ejemplo en dos lugares. Generar una especificación a partir de las rutas existentes lleva uno o dos días.
¿Cómo gestiono la autenticación en ambas herramientas? Usa un paso beforeAll que obtenga un token fresco de tu endpoint de autenticación, luego guárdalo en una fixture de Playwright y en una variable de entorno de Apidog. Rota los tokens por ejecución de prueba para que los tokens obsoletos nunca causen inestabilidad.
¿Pueden los escenarios de Apidog reemplazar por completo a Playwright? No. Apidog es excelente para flujos de trabajo de API, pero no renderiza navegadores. Para aserciones de UI (texto visible, diseño, flujos de clics) todavía necesitas Playwright. Las dos herramientas cubren diferentes superficies.
¿Qué pasa si mi backend no tiene un entorno de staging estable? Usa el servidor mock integrado de Apidog. Levanta un mock con estado a partir de tu especificación OpenAPI con un solo clic, devolviendo respuestas de ejemplo definidas en la especificación. Tu suite de Playwright y los escenarios de Apidog se ejecutan correctamente contra el mock, y cambias de nuevo al backend real cuando el entorno de staging está sano.
¿Cómo mantengo la CI rápida a medida que la suite crece? Etiqueta las pruebas por prioridad y ejecuta solo las @smoke en cada push. Ejecuta la suite completa de regresión y escenarios de Apidog en los PR a la rama principal y en un horario nocturno. Paraleliza Playwright con workers: 4 y los escenarios de Apidog con el flag --parallel de la CLI.
¿Necesito un plan de pago de Apidog para CI? La CLI de Apidog se ejecuta localmente y en CI sin necesidad de licencias por asiento para la ejecución de escenarios. Consulta la página de precios actual antes de adoptarla a gran escala. El nivel gratuito cubre a la mayoría de los equipos pequeños.
