Về Blog
Lập trìnhCông nghệHọc hỏiQA
Đọc bằngvien

Từ bug production đến regression test trong 30 phút

Kể một incident sát thực tế: xử lý nhanh, thêm test Playwright, ship lại — kèm checklist từ sự cố đến tài sản test.

·8 phút đọc
Nghe đọc
1 / 24

Từ bug production đến regression test trong 30 phút Kể một incident sát thực tế: xử lý nhanh, thêm test Playwright, ship lại — kèm checklist từ sự cố đến tài sản test.

Thứ Ba, 9h47 sáng. Slack ping: 「Khách thanh toán xong mà đơn vẫn Pending.」

Case dưới đây mình dựng theo kiểu bug team nhỏ hay gặp sau refactor auth hoặc webhook — không phải để drama, mà để thấy một quy trình gọn: từ incident đến có regression test trong khoảng 30 phút.

Dành cho: QA, dev, hoặc tech lead squad nhỏ — ai cũng có thể là người bắt đầu xử lý sự cố.

Dashboard và cảnh báo — incident thường bắt đầu từ đây

Ý chính: Hotfix không kèm test = hẹn lịch gặp lại bug tuần sau.

Phút 0–5 · Xác nhận và khoanh vùng

Triệu chứng: Thanh toán Stripe thành công, UI vẫn 「Đang xử lý」, không có email xác nhận.

Việc đầu tiên không phải sửa code — mà tái hiện được:

  1. Tài khoản test + thẻ 4242… trên staging.
  2. Checkout trên Chrome desktop → đạt.
  3. Lặp trên Safari mobile, refresh ngay sau redirect → không đạt: đơn kẹt Pending.

Giả thuyết nhanh: webhook payment_intent.succeeded về trước khi session cookie kịp set sau redirect — race condition.

Ghi lại: môi trường, role user, thời điểm, request id (nếu có). Chưa reproduce thì chưa nhảy vào code.

Phút 5–15 · Dev sửa, QA giữ ngữ cảnh

Dev bổ sung idempotency key + job retry cập nhật trạng thái đơn khi webhook đến sớm.

QA song song:

  • Giữ bước tái hiện gọn (tối đa 5 bước).
  • Chụp HAR / tab Network lúc lỗi.
  • Viết rõ kết quả mong đợi: đơn chuyển Paid trong ≤ 30 giây sau redirect.

Fix lên staging. QA verify tay 3 lần: desktop, Safari mobile, refresh sớm.

Phút 15–25 · Viết regression test (Playwright)

Quy tắc mình hay nhắc team: bug production đáng nhớ → một test hồi quy.

// pseudo — ý tưởng test
test('đơn chuyển Paid dù user refresh sớm sau checkout', async ({ page }) => {
  await loginAsTestBuyer(page);
  await page.goto('/checkout');
  await completeStripeTestPayment(page);
  await page.reload(); // mô phỏng user F5 sớm
  await expect(page.getByRole('status')).toHaveText(/paid|đã thanh toán/i, { timeout: 30_000 });
});

Test nên:

  • Dùng user + sản phẩm seed cố định.
  • Chạy độc lập, không phụ thuộc test khác.
  • Fail với message rõ: 「Expected Paid after early refresh」.

Setup Playwright chi tiết hơn: Playwright trong thực tế software.

Phút 25–30 · Ship lại và đóng ticket

Trước khi deploy production:

  • Regression test mới xanh trên CI
  • Smoke login + checkout xanh trên staging
  • Postmortem 2 dòng: nguyên nhân + cách phòng

Sau deploy: smoke production (dữ liệu test). Đóng ticket, gắn link PR test.

Template · Từ incident đến tài sản test

Copy vào Notion / Confluence:

## Incident → tài sản test

### 1. Ghi nhận (≤ 5 phút)
- [ ] Triệu chứng user thấy (1 câu)
- [ ] Môi trường + build/version
- [ ] Bước tái hiện tối thiểu
- [ ] Mức độ + ước lượng user bị ảnh hưởng

### 2. Xử lý (≤ 15 phút)
- [ ] Dev fix + QA verify staging
- [ ] Kết quả mong đợi được viết lại rõ

### 3. Tài sản test (≤ 10 phút)
- [ ] Regression test mô tả đúng bug cũ
- [ ] Seed / dữ liệu test được ghi chú
- [ ] Test chạy trên CI (PR hoặc nightly)

### 4. Ship & rút kinh nghiệm
- [ ] Smoke sau deploy
- [ ] Link test ↔ ticket
- [ ] Một dòng: 「Lần sau tránh bằng cách…」

Kết

30 phút không phải con số thần — nó là hạn chót để team không dừng ở hotfix. Automation không thay judgment của QA; nó ghi lại judgment đó thành thứ chạy được mỗi đêm.


Lần incident tới, thử bấm giờ: từ Slack ping đến test xanh mất bao lâu?

Cùng trao đổi

Bình luận

Chưa có bình luận

0 / 1000

Chưa có bình luận nào. Hãy là người đầu tiên nhé.

My Little World | Tam Vo