이메일 서버 없이 이메일 워크플로우 테스트 – Playwright와 Mokapi 활용

발행: (2026년 6월 6일 AM 07:07 GMT+9)
5 분 소요
원문: Dev.to

Source: Dev.to

이메일은 실제로 테스트하기 어려운 항목 중 하나입니다. SMTP 서버를 통해 발송되고 실제 받은 편지함에 도착하지만, 도착한 내용을 프로그래밍적으로 확인할 방법이 없습니다. 그래서 대부분의 팀은 수동으로 테스트하거나 sendEmail()이 호출됐는지만 확인하고 끝냅니다.
하지만 이렇게 하면 제목이 맞는지, 링크가 유효한지, HTML이 올바르게 렌더링됐는지 알 수 없습니다.

그래서 저는 Mokapi에 이메일 지원 기능을 만들었습니다. 백엔드는 실제 메일 서버와 마찬가지로 Mokapi의 SMTP 서버에 연결합니다. Mokapi이 메시지를 캡처하고, 테스트에서는 HTTP를 통해 해당 메시지를 가져와 내용에 대해 어설션을 수행합니다. 실제 이메일이 전송되지 않으며, 받은 편지함을 폴링하거나 외부 의존성을 가질 필요가 없습니다.

Kafka나 HTTP와 달리 이메일은 표준 사양 포맷이 없습니다. 그래서 Mokapi은 간단한 YAML 설정을 사용합니다. 필요한 설정은 다음뿐입니다:

mail: '1.0'
info:
  title: "Email Workflows"
servers:
  smtp:
    host: :2525
    protocol: smtp

백엔드를 localhost:2525에 연결하면 Mokapi이 모든 메일을 캡처하기 시작합니다.

개발 중에 실제 메일 클라이언트로 이메일을 미리 보고 싶다면 IMAP도 추가할 수 있습니다. 한 줄만 추가하면 됩니다:

  imap:
    host: :1430
    protocol: imap

테스트는 실제 회원가입 폼을 구동한 뒤, Mokapi의 HTTP API에서 캡처된 이메일을 가져와 어설션을 수행합니다.

test('Email verification after signup', async ({ page, request }) => {
  const recipient = randomEmail();

  // 회원가입 폼 구동
  await page.goto('');
  const form = page.getByRole('form', { name: 'Sign Up' });
  await form.getByLabel('Email').fill(recipient);
  await form.getByLabel('Password').fill('SuperSecure123!');
  await form.getByRole('button', { name: 'Sign Up' }).click();
  await expect(form.getByText('Check your inbox to verify your email')).toBeVisible();

  // Mokapi에서 이메일 가져오기
  const mails = await request.get(
    `http://localhost:8080/api/services/mail/Email%20Workflows/mailboxes/${recipient}/messages?limit=1`
  );
  const mailList = await mails.json();
  expect(mailList[0]).toEqual(expect.objectContaining({
    subject: 'Verify your email address',
    from: expect.arrayContaining([expect.objectContaining({ address: 'noreply@example.com' })]),
    to: expect.arrayContaining([expect.objectContaining({ address: recipient })])
  }));

  // 본문과 인증 링크 확인
  const res = await request.get(
    `http://localhost:8080/api/services/mail/messages/${mailList[0].messageId}`
  );
  const mail = await res.json();
  expect(mail.body).toContain(`verify?email=${encodeURIComponent(recipient)}`);
});

테스트마다 무작위 이메일을 사용해 격리성을 유지합니다. Playwright의 request 객체가 Mokapi API 호출을 직접 처리하므로, 브라우저를 구동하는 동일한 테스트에서 이메일까지 검사할 수 있습니다. 별도의 HTTP 클라이언트가 필요 없습니다.

자동 어설션으로 콘텐츠가 깨지는 경우를 잡아낼 수 있지만, Outlook에서 레이아웃이 엉망인 경우는 잡아내지 못합니다. Mokapi이 IMAP을 지원하므로 개발 중에 localhost:1430에 실제 메일 클라이언트를 연결해 사용자가 보게 될 화면을 정확히 확인할 수 있습니다. 이는 테스트 스위트가 할 수 없는 시각적 검증입니다.

이것이 요약 버전이며, 제 사이트에 있는 전체 가이드에서는 전체 설정, Express 백엔드, 모든 Playwright 헬퍼, 그리고 전체 흐름이 어떻게 맞물리는지를 다룹니다.

👉 전체 가이드를 여기서 읽어보세요
작업 저장소: mokapi-email-workflow

댓글로 질문을 남겨주시면 답변드리겠습니다.

0 조회
Back to Blog

관련 글

더 보기 »

모바일 한여름 열풍

!Cover image for Mobile Midsommer Madnesshttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploa...