Tags & grep (đánh nhãn và lọc test khi chạy)
automationplaywright
Tags là nhãn @smoke/@regression/@flaky đặt trong title hoặc qua field tag của test, còn --grep/--grep-invert là cờ CLI lọc test theo regex khớp với title + tag. Cặp này giải quyết bài toán chạy subset: smoke nhanh trước deploy, regression đầy đủ ban đêm, bỏ qua test flaky — mà không phải tách file test.
Khái niệm & Bản chất
- Tag = nhãn phân loại test (
@smoke,@regression,@payment,@flaky...) để chọn lọc nhóm test khi chạy. - Hai cách đặt tag: viết
@tagtrực tiếp trong title test, hoặc dùng fieldtagtrong details object (API chính thức từ Playwright 1.42+). - --grep = regex lọc test theo title+tag, chỉ chạy test khớp; --grep-invert = chạy mọi test KHÔNG khớp (loại trừ).
- grep cũng cấu hình được trong project của
playwright.config.ts— vd project 'smoke' tự động chỉ chạy@smoke. - Tag đặt trên
test.describe→ tất cả test con kế thừa tag đó (với cú pháp details object).
Cách hoạt động & API chính
- CLI:
npx playwright test --grep @smoke— chỉ chạy test có @smoke;--grep-invert @flaky— chạy tất cả trừ @flaky. - Regex kết hợp:
--grep '@smoke|@critical'(hoặc), lookahead phức tạp cũng được:--grep '(?=.*@smoke)(?=.*@payment)'. - Details object:
test('tên', { tag: '@smoke' }, fn)hoặc nhiều tagtag: ['@smoke', '@payment']; describe tương tựtest.describe('x', { tag: '@cart' }, () => ...). - Trong config:
{ name: 'smoke', grep: /@smoke/ }và{ name: 'no-flaky', grepInvert: /@flaky/ }— chạy bằng--project=smoke. - Tag qua details object được validate format (phải bắt đầu bằng
@), còn tag trong title chỉ là string thường.
Ví dụ & Cú pháp thực tế
- Hai cách đặt tag trên test:
``
ts import { test, expect } from '@playwright/test'; // cách cũ — tag nằm trong title test('login thành công @smoke', async ({ page }) => { /* ... */ }); // cách mới 1.42+ — field tag (khuyên dùng) test('login thất bại', { tag: '@smoke' }, async ({ page }) => { /* ... */ }); // nhiều tag cùng lúc test( 'checkout bằng Visa', { tag: ['@regression', '@payment'] }, async ({ page }) => { /* ... */ } );`` - Tag trên describe — test con kế thừa:
``
ts test.describe('Giỏ hàng', { tag: '@cart' }, () => { test('thêm sản phẩm', { tag: '@smoke' }, async ({ page }) => { // test này mang CẢ @cart LẪN @smoke }); });`` - CLI thực tế:
``
bash # chỉ chạy smoke trước khi deploy npx playwright test --grep @smoke # regression nhưng bỏ test flaky npx playwright test --grep @regression --grep-invert @flaky # smoke HOẶC critical npx playwright test --grep '@smoke|@critical'`` - Project smoke trong config — CI chỉ cần gọi
--project: ``ts // playwright.config.ts projects: [ { name: 'smoke', grep: /@smoke/ }, { name: 'regression', grep: /@regression/, grepInvert: /@flaky/ }, ]``
Best practices & Khi nào dùng
- Bộ tag tối thiểu cho team:
@smoke(5–15 test lõi, chạy < 5 phút, gate trước deploy),@regression(full suite, chạy đêm),@flaky(cách ly test đang điều tra — không được để chết build). - Ưu tiên field
taghơn nhét vào title: được validate, không vỡ title khi rename, và tooling đọc được tag riêng. - Đặt tag trên describe khi cả feature thuộc 1 nhóm — test con tự kế thừa, khỏi tag từng cái.
- Định nghĩa project theo tag trong config (smoke/regression) — CI command gọn, người mới không phải nhớ regex.
- Tên tag có namespace khi suite lớn:
@api,@ui,@payment-critical— tránh đụng khi grep.
Gotchas, So sánh & Lưu ý
- Tag trong title là string tự do — gõ sai
@smkoevẫn hợp lệ nhưng grep không khớp gì → test lặng lẽ không bao giờ chạy smoke. Fieldtagbắt format@xxxnên an toàn hơn. --grepmatch cả tên describe — tag ở describe (title lẫn field) ảnh hưởng toàn nhóm; kiểm tra bằng--listtrước khi tin vào regex.- Dùng
npx playwright test --list --grep @smokeđể liệt kê test sẽ chạy trước khi chạy thật — kiểm chứng regex không sót/không thừa. - Kết hợp grep + grepInvert được:
--grep @regression --grep-invert @flakychạy regression trừ flaky. - So sánh: tương tự
--testNamePatterncủa Jest hoặc-kcủa pytest — nhưng Playwright hỗ trợ cả config-level grep trong project, mạnh cho multi-env. - Tag chỉ là cơ chế lọc — không thay annotation:
@flakyđể loại khỏi CI, còntest.fixmeđể nói 'đang chờ fix'; hai thứ bổ sung nhau.
