← Tất cả bài viết
19.08.2026

Condition-Based Waiting: Chấm dứt cảnh test "lúc pass lúc fail", cho bộ test ổn định và nhanh hơn

Condition-Based Waiting: Chấm dứt cảnh test "lúc pass lúc fail", cho bộ test ổn định và nhanh hơn
Nguyễn Ngọc Hải 6 phút đọc

Vì sao cần skill này

Trong lập trình, có một loại lỗi khiến ai cũng đau đầu: test "chập chờn" (flaky test) — cùng một bài kiểm thử, chạy lần này thì pass, lần khác lại fail mà không đổi gì. Thủ phạm quen thuộc là các khoảng chờ cứng: lập trình viên viết "chờ 50 mili-giây rồi kiểm kết quả", đoán rằng ngần đó thời gian là đủ. Trên máy nhanh thì đủ; nhưng khi hệ thống tải nặng, hoặc khi chạy song song trên máy chủ CI, 50ms lại chưa đủ — thế là test fail vô cớ.

Hệ quả: kết quả test không đáng tin, đội phát triển mất niềm tin vào chính bộ test của mình, và tốn thời gian "chạy lại cho may". Condition-Based Waiting giải quyết đúng gốc rễ đó với một nguyên tắc đơn giản: chờ đúng điều kiện bạn thực sự quan tâm, thay vì đoán nó mất bao lâu.

Skill này làm được gì

Skill dạy Claude thay các khoảng chờ cứng bằng cơ chế "chờ theo điều kiện" (polling) — kiểm tra liên tục cho tới khi điều kiện thật sự xảy ra thì đi tiếp. So sánh trực quan:

❌ TRƯỚC: đoán thời gian
chờ 50ms → kiểm kết quả (hy vọng nó đã sẵn sàng)

✅ SAU: chờ điều kiện
chờ tới khi "kết quả đã có" → rồi mới kiểm

Kèm theo, skill cung cấp:

  • Hàm chờ tổng quát (waitFor) — kiểm điều kiện mỗi 10ms, kèm thời hạn tối đa (timeout) để không lặp vô tận, và báo lỗi rõ ràng nếu quá hạn.
  • Bảng mẫu nhanh cho các tình huống thường gặp: chờ một sự kiện xuất hiện, chờ trạng thái đạt "sẵn sàng", chờ đủ số lượng phần tử, chờ một file được tạo, hay chờ một điều kiện phức hợp.
  • Các lỗi thường mắc & cách sửa: kiểm quá dày (mỗi 1ms → tốn CPU) → nên 10ms; quên timeout → phải luôn có; đọc dữ liệu cũ (cache trước vòng lặp) → phải lấy dữ liệu mới trong mỗi lần kiểm.
  • Khi nào khoảng chờ cứng LÀ đúng: nếu bạn đang kiểm thử chính hành vi thời gian (debounce, throttle…) thì dùng chờ cứng là hợp lý — nhưng skill yêu cầu chờ điều kiện kích hoạt trước, dựa trên thời gian đã biết (không phải đoán), và ghi chú giải thích vì sao.

Về hiệu quả thực tế, tài liệu skill dẫn một phiên gỡ lỗi: sửa 15 test chập chờn, tỷ lệ pass từ 60% lên 100%, và chạy nhanh hơn 40% (vì không còn phải chờ "dư" thời gian).

Giải quyết vấn đề gì — cho ai ở VNPAY

Cần nói thẳng để dùng đúng: đây là skill rất hẹp và thuần kỹ thuật.

Đối tượng — lập trình viên và kỹ sư QA của Khối Công nghệ. Nếu bạn viết kiểm thử tự động (unit test, integration test) cho các thao tác bất đồng bộ (async) và gặp cảnh test chập chờn, đây là công cụ trị đúng bệnh. Với môi trường fintech — nơi bộ test đáng tin và pipeline CI ổn định là điều kiện để phát hành an toàn — giá trị của việc "hết flaky test" là rất thực. Đây là "người anh em" của các skill Root Cause Tracing, Writing Plans và Verification Before Completion — cùng bộ kỹ năng làm việc kỷ luật trên codebase.

Với Phòng Quản trị dự án (PM, P&T): thành thật mà nói, skill này gần như không dùng trực tiếp trong công việc của phòng — bạn không viết test. Điều duy nhất có thể mang đi là tinh thần: hãy chờ/đo đúng tín hiệu thật, thay vì đoán mò theo thời gian. Ví dụ, đừng cho rằng "chắc bên kia đã xong sau 2 ngày" mà hãy xác nhận bằng một tín hiệu cụ thể (đã bàn giao, đã duyệt). Nhưng liên hệ này khá gián tiếp — bài này chủ yếu hữu ích cho đội kỹ thuật.

Đặt kỳ vọng đúng

  • Đây là một "khuôn mẫu code" (pattern), không phải công cụ dùng chung. Nó chỉ phát huy khi bạn đang viết/sửa kiểm thử tự động.
  • Ví dụ viết bằng TypeScript/JavaScript. Skill khai "áp dụng mọi ngôn ngữ", nhưng mã mẫu là JS/TS; team dùng ngôn ngữ khác (Java, Go, Python…) vẫn áp được nguyên lý, phải chuyển mã sang cú pháp tương ứng.
  • Không phải "thần chú" xoá mọi flaky test. Nó trị đúng loại flaky do đoán thời gian; các nguyên nhân khác (dữ liệu dùng chung, thứ tự chạy test…) cần cách xử lý riêng.

Điều kiện để dùng

  • Hợp nhất khi chạy trong Claude Code, làm việc trực tiếp trong codebase có bộ test.
  • Cần gói Claude hỗ trợ Skills và code/agent (Pro, Max, Team hoặc Enterprise).

Hướng dẫn upload skill lên Claude Desktop

Sau khi tải file skill về, làm theo 3 bước:

Bước 1 — Mở Customize. Trong giao diện Claude Desktop, bấm "Customize" ở góc trên bên trái.

Bước 2 — Mở menu Add. Trong màn hình Customize, bấm vào dropdown của phần "Add" ở góc trên bên phải.

Bước 3 — Upload skill. Chọn "Upload skill", rồi trỏ tới file skill của bạn.

Lưu ý về định dạng file: skill cần ở dạng thư mục chứa SKILL.md (ở đây kèm cả file example.ts minh hoạ). Nếu tải về từ site nội bộ dưới dạng .zip, cứ upload file .zip đó — bên trong đã là đúng cấu trúc skill.

Upload xong, skill nằm sẵn trong danh sách kỹ năng và Claude tự biết khi nào cần gọi.

Các cách gọi skill lên

1. Để Claude tự nhận diện (khuyên dùng). Mô tả triệu chứng, Claude sẽ khớp với skill:

"Test này lúc pass lúc fail, nhất là khi chạy song song — giúp tôi làm nó ổn định."

"Thay các setTimeout trong test này bằng cách chờ đúng điều kiện giúp tôi."

2. Gọi đích danh:

"Dùng Condition-Based Waiting để refactor các test dùng khoảng chờ cứng trong file này."

3. Rà soát cả bộ test:

"Tìm các test đang dùng setTimeout/sleep tuỳ tiện và đề xuất chuyển sang chờ theo điều kiện."

Gợi ý dùng hiệu quả: nếu một khoảng chờ cứng thật sự cần thiết (đang kiểm thử hành vi thời gian), hãy yêu cầu Claude ghi chú rõ vì sao — đúng tinh thần của skill: không cấm tuyệt đối, nhưng mọi khoảng chờ cứng phải có lý do được giải thích.

Lưu ý cho môi trường VNPAY

  • Skill này không truy cập dữ liệu hay chạy thao tác nguy hiểm — nó chỉ cải thiện cách viết test. Rủi ro thấp.
  • Với hệ thống liên quan giao dịch/tài chính, một bộ test ổn định, đáng tin là nền tảng để phát hành an toàn — nhưng kết quả vẫn cần đội kỹ thuật rà soát theo quy trình nội bộ.

(Đây là khuyến nghị chung; team cần đối chiếu với chính sách nội bộ hiện hành của VNPAY.)

Tóm lại

Condition-Based Waiting trị đúng một nỗi khổ quen thuộc của dân phát triển: những bài test "lúc pass lúc fail" do đoán mò thời gian. Bằng cách chờ đúng điều kiện thay vì chờ một số giây tuỳ tiện, nó giúp bộ test vừa đáng tin hơn vừa chạy nhanh hơn. Đây là một skill hẹp nhưng sắc — giá trị nằm gọn ở đội lập trình và QA của VNPAY; với phần còn lại của phòng, thứ đáng lấy chỉ là một nguyên lý nhỏ: hãy chờ tín hiệu thật, đừng đoán mò.


Download file:


References

  1. Anthropic Agent Skills — Claude Platform Docs. Available at: https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview (Accessed: 19/08/2026).
  2. Skill nguồn: Condition-Based Waiting (tải từ GitHub), kèm file example.ts.