AxioAPI

Kiểm thử email đăng ký với Playwright và API temp mail

2026-10-05

Luồng đăng ký và đặt lại mật khẩu phụ thuộc vào email nên rất khó kiểm thử. API temp mail cấp cho mỗi test một hộp thư riêng, nên test có thể chờ email thật và đọc nó thay vì giả lập.

Bạn cần gì

Tạo khóa trong tài khoản của bạn. Không commit khóa vào mã nguồn; hãy đọc từ biến môi trường hoặc kho bí mật của CI.

  • Một khóa AxioAPI, lưu trong biến môi trường AXIOAPI_KEY.
  • Playwright Test, hoặc bất kỳ HTTP client nào trong ngôn ngữ của bạn.
  • Một môi trường staging thực sự gửi email.

Bài test

Bài test tạo hộp thư bằng POST /api/v1/temp-mail/inboxes, trả về ID hộp thư và địa chỉ. Nó nhập địa chỉ vào form đăng ký, poll danh sách thư cho đến khi có email, và xóa hộp thư ở cuối.

// signup.spec.js
import { test, expect } from '@playwright/test';

const API = 'https://axioapi.com/api/v1';
const headers = { Authorization: `Bearer ${process.env.AXIOAPI_KEY}`, Accept: 'application/json' };

async function waitForMail(request, inbox, timeoutMs = 60000) {
  const deadline = Date.now() + timeoutMs;
  while (Date.now() < deadline) {
    const res = await request.get(`${API}/temp-mail/inboxes/${inbox}/messages`, { headers });
    const { items } = (await res.json()).data;
    if (items.length > 0) return items[0];
    await new Promise((resolve) => setTimeout(resolve, 3000));
  }
  throw new Error('No email arrived in time');
}

test('signup sends a confirmation email', async ({ page, request }) => {
  const created = await request.post(`${API}/temp-mail/inboxes`, { headers });
  const { id, address } = (await created.json()).data;

  try {
    await page.goto('https://staging.example.com/signup');
    await page.fill('[name=email]', address);
    await page.click('button[type=submit]');

    const message = await waitForMail(request, id);
    expect(message.subject).toContain('Confirm');
  } finally {
    await request.delete(`${API}/temp-mail/inboxes/${id}`, { headers });
  }
});

Cách hoạt động

  • Lệnh tạo trả về data.id và data.address.
  • Lệnh danh sách trả về data.items. Mỗi mục là tóm tắt một thư; mở một thư bằng GET /api/v1/temp-mail/inboxes/{inbox}/messages/{message} để đọc toàn bộ nội dung.
  • DELETE xóa hộp thư và miễn phí, nên luôn chạy trong khối finally.

Giữ cho ổn định và tiết kiệm

Mỗi lần poll đều tính phí, nên hãy chờ vài giây giữa các lần poll và đặt timeout thay vì lặp vô hạn. Xem giá endpoint trên trang API Temp Mail.

Dùng hộp thư mới cho mỗi test để các test không đọc thư của nhau, và đổi địa chỉ nếu ứng dụng từ chối địa chỉ đã gặp.

Hộp thư dùng một lần chỉ để kiểm thử. Đừng dùng cho tài khoản bạn cần giữ.