Next.js & Playwright / Cypress
El problema
Los datos aleatorios en tests E2E son frágiles: un DNI o un IBAN generado al vuelo puede chocar con validaciones, o hacer que un test falle una vez de cada mil sin motivo aparente.
La solución: seed fija por test
Cada test usa su propia seed (por ejemplo, el nombre del test). Misma seed + mismos parámetros ⇒ siempre los mismos datos, así que el test es reproducible y sus asserts pueden usar valores concretos.
Playwright
tests/alta-cliente.spec.ts
import { test, expect } from "@playwright/test";
async function fetchDni(seed: string) {
const res = await fetch(
"https://datamockseed.firstflip.es/api/v1/es/document?sub=dni&count=1&seed=" + seed,
);
const { data } = await res.json();
return data[0].documento as string;
}
test("el formulario de alta valida un DNI ficticio", async ({ page }) => {
const dni = await fetchDni("alta-cliente-e2e");
await page.goto("/alta");
await page.getByLabel("DNI").fill(dni);
await page.getByRole("button", { name: "Continuar" }).click();
await expect(page.getByText("DNI válido")).toBeVisible();
});Cypress
cypress/e2e/alta-cliente.cy.js
Cypress.Commands.add("fixtureDni", (seed) => {
return cy
.request(
`https://datamockseed.firstflip.es/api/v1/es/document?sub=dni&count=1&seed=${seed}`,
)
.its("body.data.0.documento");
});
it("valida un DNI ficticio", () => {
cy.fixtureDni("alta-cliente-e2e").then((dni) => {
cy.visit("/alta");
cy.findByLabelText("DNI").type(dni);
cy.findByRole("button", { name: "Continuar" }).click();
cy.findByText("DNI válido").should("be.visible");
});
});Datasets de fixtures completos
Para un fixture con varias filas coherentes (nombre + DNI + email), usa
POST /v1/es/bulk con la misma seed del test, en vez de encadenar
peticiones individuales.