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. 궁금한 점이 있으면 언제든 물어보라.

0 조회
Back to Blog

관련 글

더 보기 »

내 스킬

프로젝트를 위한 AI 지시문을 만들고, 설치하고, 관리하세요 — 코딩이 필요 없습니다. CREATE 이름을 정하고, 카테고리를 선택하고, 원하는 것을 설명하세요 — 마법사가 자동으로 구성합니다.