TL;DR
Một bug pipeline hiển thị dân số Malaysia là 3.4 triệu thay vì 34 triệu sẽ pass qua mọi selector test trong suite Playwright của bạn. Lý do: E2E test truyền thống chỉ verify DOM render, không verify giá trị. Trong bài đăng trên freeCodeCamp, Lee Ren Jie (Tech With RJ) demo pattern viết assertion bằng tiếng Anh tự nhiên — để Claude và Gemini cùng "đọc" trang và verify thay con người. Stack: Passmark (open-source wrapper quanh Playwright của Bug0). Áp dụng cho data.gov.my, OpenDOSM, KKMNow.
Vấn đề: test page render ≠ test data đúng
Một suite Playwright điển hình check class name, data-testid, text exists. Nó nói "Có element .population-total, có nội dung khác rỗng" → pass. Nhưng nếu pipeline ETL nhân nhầm hệ số, hiển thị 3.4M thay vì 34M, suite vẫn xanh. Bug data magnitude lọt thẳng production, người dùng phát hiện trước CI.
Tác giả gọi đây là khoảng trống lớn nhất của E2E hiện đại: chúng ta đầu tư hàng nghìn dòng selector code để bảo vệ cấu trúc, nhưng để mặc nội dung tự lo.
Cách Passmark hoạt động
Passmark wrap Playwright và đẩy mỗi assertion qua hai mô hình Claude và Gemini (qua OpenRouter). Hai mô hình vote độc lập trên cùng một câu hỏi tiếng Anh. Bất đồng → escalate đến arbiter. Đồng ý → assert pass/fail.
Ví dụ một assertion thật:
"Trang hiển thị tổng dân số Malaysia là một số lớn hơn 20 triệu và nhỏ hơn 40 triệu."
Đây là range check. Không cần selector, không cần parser, không cần locale handling — AI đọc trang và quyết định.
Một pattern mạnh hơn là cross-field math:
"Tổng dân số nam và nữ cộng lại xấp xỉ con số tổng ở headline, sai số dưới 5%."
Tác giả thống kê: một câu như vậy thay thế 70–100 dòng vanilla JS để fetch giá trị, parse number, normalize locale, và so sánh.
Số liệu kỹ thuật đáng nhớ
| Chỉ số | Giá trị | Ý nghĩa |
|---|---|---|
| Cache hit rate | 14% | Chỉ atomic step (1 tool call) mới cache. 86% step gọi LLM mỗi run. |
| Số mô hình vote | 2 (Claude + Gemini) | Defend single-model hallucination — nhưng không defend được correlated failure. |
| LOC tiết kiệm / assertion | ~70–100 dòng → 1 câu | Đặc biệt rõ ở cross-field math. |
| Failure mode mới | OpenRouter 504 | Gateway down hoặc assertion ambiguous → arbiter escalation timeout. |
Bài học vận hành quan trọng nhất: cache rate is cost rate. Mỗi step không atomic là một LLM call mỗi CI run. Discipline khi viết step (1 hành động = 1 step) ảnh hưởng trực tiếp đến hoá đơn cuối tháng.
So sánh selector vs plain-English AI
| Khía cạnh | Selector (vanilla Playwright) | Plain-English AI (Passmark) |
|---|---|---|
| "Page renders" | ✅ | ✅ |
| "Data is correct" | ❌ — phải code thủ công | ✅ — assert tự nhiên |
| Brittle khi UI đổi | Có (selector vỡ) | Không (AI tự đọc) |
| Cost / run | Thấp (CPU only) | Cao (LLM API) |
| Cold cache speed | Nhanh | Chậm hơn nhiều |
| Bug magnitude (3.4M vs 34M) | Pass nhầm | Catch |
Đối thủ trong không gian này: ZeroStep, Applitools Autonomous, Shortest, Momentic, testRigor. Passmark unique vì open-source và two-model voting.
Use case nên thử ngay
- Data dashboard / open-data portal: dân số, GDP, stats COVID — số có range hợp lý, range check một dòng.
- Fintech: tổng debit + credit ≈ balance change, cross-field math thay 100 dòng JS.
- E-commerce checkout: subtotal + tax + shipping ≈ total within 1 cent.
- Analytics dashboard: tổng các segment ≈ tổng user count, sai số < 5%.
- Báo cáo tự động: catch off-by-1000, missing zero, locale formatting (3,400 vs 3.400).
Limitations & pricing
Không phải free lunch:
- Cost LLM: 86% step không cache → mỗi CI run tốn API call. Suite cỡ trung có thể $0.10–$1+ mỗi run.
- Cold cache chậm: lần đầu chậm hơn selector suite vài lần.
- Correlated failure: Claude + Gemini đôi khi cùng misread (cùng đọc nhầm trục biểu đồ).
- OpenRouter SPOF: gateway down = toàn suite stuck. Cần retry + runbook trong CI/CD.
- Ambiguous assertion: viết "approximately near total" quá vague → arbiter escalation 504.
Pricing: Passmark là open-source (miễn phí), bạn trả tiền LLM provider (Claude API, Gemini API) qua OpenRouter.
What's next
Hướng tiếp dự đoán cho không gian này: semantic caching (cache theo ý nghĩa, không theo prompt exact) để đẩy 14% lên 60%+; voting với 3+ mô hình; plug Passmark vào Playwright MCP để IDE-native authoring; và schema-driven assertion (JSON Schema sinh plain-English assertion tự động).
Industry shift đáng theo dõi: nhiều suite CI 2026–2027 sẽ chạy hybrid — selector cho UI integrity, AI cho data correctness. Cộng nhau, hai pattern này phủ đúng khoảng trống lớn nhất mà E2E truyền thống bỏ ngỏ suốt 10 năm qua.
Nguồn: freeCodeCamp — Lee Ren Jie, freeCodeCamp X post, Mabl AI agent frameworks.
