OTP 이메일 흐름 테스트가 불안정하면 안 됩니다 — AssertKit을 만나보세요
발행: (2026년 5월 24일 PM 05:58 GMT+9)
3 분 소요
원문: Dev.to
Source: Dev.to
어떤 E2E 스위트에서도 가장 플레이크가 발생하기 쉬운 테스트는 “사용자가 회원가입한다”는 흐름이다.
이 다리를 완전히 없애기 위해 AssertKit을 출시했다.
8줄의 테스트 코드만으로 구현한다:
import { test } from "@assertkit/playwright";
test("signup with OTP", async ({ page, inbox }) => {
await page.goto("/signup");
await page.getByLabel("Email").fill(inbox.address);
await page.getByRole("button", { name: "Sign up" }).click();
const otp = await inbox.waitForOtp({ from: "noreply" });
await page.getByLabel("Code").fill(otp);
});
그게 전부다. 폴링도, 정규식도, 플레이크도 없다.
작동 원리
inbox픽스처가 각 테스트마다 고유한 일회용 주소(foo-1717xxx@assertkit.com)를 제공한다.waitForOtp는 최대 25초까지 AssertKit 서버에 롱 폴링을 수행한다.- 서버는 해당 주소로 들어오는 메일을 감시하고, OTP 형태의 코드를 추출해 타입이 지정된 필드로 반환한다.
- 테스트에서는 이메일 본문을 파싱할 필요 없이 문자열 형태의 OTP를 바로 얻는다.
Cypress 사용자도 동일하게 사용 가능
import "@assertkit/cypress";
cy.uniqueInbox().then((inbox) => {
cy.visit("/signup");
cy.get('input[name="email"]').type(inbox.address);
cy.get('button[type="submit"]').click();
cy.waitForOtp(inbox.local).then((otp) => {
cy.get('input[name="otp"]').type(otp);
});
});
라이브 데모 체험 (회원가입 없이)
https://assertkit.com/demo
데모는 실제 wait 엔드포인트에 대한 롱 폴링을 수행한다.
무료 체험
- 두 npm 패키지는 MIT 라이선스이며 런타임 의존성이 전혀 없다.
- 무료 공개 API는 계정 없이 바로 사용할 수 있다.
- 아직 정식 구독은 열려 있지 않으며, 초기 접근을 위한
/beta프로그램이 관리자의 승인을 필요로 한다.
기술 스택 (궁금한 분들을 위해)
Next.js 16 App Router, Drizzle + Solo founder. 궁금한 점이 있으면 언제든 물어보라.