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.
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ố.
Ý 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:
- Tài khoản test + thẻ 4242… trên staging.
- Checkout trên Chrome desktop → đạt.
- 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
Chưa có bình luận nào. Hãy là người đầu tiên nhé.