Volver al blog
Adiós a los tests de email inestables: Automatiza todo con Cypress y Playwright (y conserva tu cabello)

Adiós a los tests de email inestables: Automatiza todo con Cypress y Playwright (y conserva tu cabello)

Probar un flujo de registro no debería requerir un doctorado en paciencia. Descubre cómo usar la API de JunkMail para hacer que tus pruebas E2E sean finalmente fiables.

Por Equipo de Ingeniería2/1/2026

¿Conoces esa sensación de profunda soledad?

Es la que sientes cuando tu prueba E2E falla por cuarta vez consecutiva porque tu servidor SMTP simulado decidió tomar una siesta. O peor aún, el momento en que tienes que explicarle a tu Product Owner que el error en producción pasó desapercibido porque "en el entorno de prueba simulamos el envío de correos, no lo hacemos de verdad".

Seamos honestos: probar correos electrónicos en un flujo de usuario (registro, restablecimiento de contraseña, OTP) es a menudo la pesadilla de un desarrollador. Es lento, es frágil ("flaky", como dicen nuestros amigos angloparlantes), y francamente, es un dolor de cabeza.

Pero, ¿y si te dijera que existe un mundo donde tus pruebas de correo son tan rápidas y fiables como tus pruebas unitarias? ¿Un mundo donde puedes invocar una dirección real, recibir un correo real y hacer clic en un enlace real, todo en unos pocos milisegundos?

Bienvenido al futuro. Bienvenido a JunkMail.

Por qué tus pruebas actuales te odian

Generalmente, hay dos escuelas de pensamiento:

  1. La Escuela de "Simular Todo": Interceptas la solicitud a la API y le dices a tu frontend: "Tranquilo, el correo se envió". Excepto el día en que SendGrid cambia su configuración o tu plantilla HTML se rompe, y no ves absolutamente nada.
  2. La Escuela "Mailtrap / Mailhog": Es mejor. Pero a menudo es lento, limitado en volumen y no prueba la entregabilidad real (SPF, DKIM, DMARC... esas siglas bárbaras que determinan si un correo llega o no).

Necesitamos una tercera vía: una infraestructura real, efímera y controlada por API.

El Arma Secreta: La API Business de JunkMail

Imagina poder invocar un buzón recién creado con un chasquido de dedos (o mejor dicho, una llamada POST), usarlo y dejar que desaparezca en el vacío digital una vez que tu prueba haya terminado. Limpio. Eficiente.

Eso es exactamente lo que vamos a hacer.

Paso 1: Invocar a los espíritus (Crear una dirección)

Antes de lanzar Cypress o Playwright, necesitamos un objetivo. No test@test.com (el pobre ya recibe suficiente spam), sino una dirección única para esta ejecución de prueba específica.

// Script de configuración (o en tu beforeEach)
const response = await fetch('https://api.junkmail.site/v1/addresses', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer TU_CLAVE_BUSINESS_BRILLANTE', 
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ alias: 'e2e-signup-test' })
});

const { data } = await response.json();
const miDireccionMagica = data.address; // ej: xkcd42@junkmail.site

Boom. Tienes una dirección. Está viva. Respira.

Cypress: El arte de esperar sin perder la cabeza

Cypress es genial, pero no le gusta mucho salir del navegador. Para verificar nuestros correos, tendremos que usar cy.request y un poco de magia recursiva.

Creemos un comando personalizado, porque somos gente civilizada:

// cypress/support/commands.js
Cypress.Commands.add('esperarMiPreciosoEmail', (addressId) => {
  const verificar = () => {
    return cy.request({
      method: 'GET',
      url: `https://api.junkmail.site/v1/emails?address_id=${addressId}`,
      headers: { 'Authorization': `Bearer ${Cypress.env('JUNKMAIL_KEY')}` }
    }).then((res) => {
      // Si el array no está vacío, ¡ganamos!
      if (res.body.data.length > 0) return res.body.data[0];
      
      // Si no, respiramos hondo e intentamos de nuevo
      cy.wait(1000); 
      return verificar();
    });
  };
  return verificar();
});

Y ahora, la prueba que realmente da gusto ver:

it('debe permitir un registro completo sin problemas', () => {
  // 1. Llenamos el formulario
  cy.visit('/signup');
  cy.get('input[name="email"]').type(testEmail);
  cy.get('button[type="submit"]').click();

  // 2. El momento de la verdad
  cy.esperarMiPreciosoEmail(testAddressId).then((email) => {
    expect(email.subject).to.contain('¡Bienvenido a bordo!');
    
    // 3. Extracción quirúrgica del enlace de validación
    const enlaceValidacion = /href="([^"]+)"/.exec(email.bodyHtml)[1];
    
    // 4. Cerrando el círculo
    cy.visit(enlaceValidacion);
    cy.contains('Cuenta confirmada').should('be.visible');
  });
});

Es fluido. Es robusto. Es hermoso.

Playwright: Para los que aman await

Con Playwright, es aún más simple. No hacen falta comandos complejos; el JavaScript moderno hace el trabajo pesado.

test('Restablecimiento de contraseña: La prueba de fuego', async ({ page }) => {
  // ... saltamos los pasos de llenado del formulario ...
  await page.click('#reset-password-btn');

  // El bucle de espera (Polling)
  // Démosle 10 intentos de 2 segundos cada uno. Seamos generosos.
  let emailEncontrado = null;
  for (let i = 0; i < 10; i++) {
    const res = await api.get(`/emails?address_id=${addressId}`); // Pseudocódigo para mayor claridad
    if (res.data.length > 0) {
      emailEncontrado = res.data[0];
      break;
    }
    await page.waitForTimeout(2000);
  }

  expect(emailEncontrado).not.toBeNull();
  expect(emailEncontrado.subject).toBe('Restablece tu contraseña (¡rápido!)');
});

Conclusión: Pon fin al sufrimiento

Probar correos electrónicos no debería ser la parte más dolorosa de tu pipeline CI/CD. Con JunkMail Business, transformas una tarea aleatoria en una ciencia exacta.

Tus pruebas se ponen en verde, tu equipo de QA vuelve a sonreír y finalmente puedes irte a casa a tiempo.

¿No es maravillosa la vida?

¿Listo para escalar? Pásate a JunkMail Business y obtén acceso ilimitado a la API.