Wiki

← Tất cả bài wiki

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 @tag trực tiếp trong title test, hoặc dùng field tag trong 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 tag tag: ['@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 tag hơ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 @smkoe vẫn hợp lệ nhưng grep không khớp gì → test lặng lẽ không bao giờ chạy smoke. Field tag bắt format @xxx nên an toàn hơn.
  • --grep match cả tên describe — tag ở describe (title lẫn field) ảnh hưởng toàn nhóm; kiểm tra bằng --list trướ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 @flaky chạy regression trừ flaky.
  • So sánh: tương tự --testNamePattern của Jest hoặc -k củ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òn test.fixme để nói 'đang chờ fix'; hai thứ bổ sung nhau.