$npx -y skills add anhtester/codex-testing-kit --skill analyze-flaky-testsPhân tích automation tests không ổn định (flaky), xác định root cause và tự động khắc phục. Hỗ trợ 2 mode — ANALYZE (chỉ báo cáo) và FIX (báo cáo + tự sửa code).
| 1 | # Workflow: Phân Tích & Khắc Phục Flaky Tests |
| 2 | |
| 3 | > **BẮT BUỘC (MANDATORY SKILL):** Bạn PHẢI nạp và đọc kỹ nội dung của skill **`$flaky-test-analyzer`** (tại `.agents/skills/flaky-test-analyzer/SKILL.md`) trước khi bắt đầu. Ngoài ra, tham khảo thêm skill **`$smart-locator-agent`** và **`$locator-healer-agent`** khi cần sửa/thay locator. |
| 4 | |
| 5 | Workflow này giúp agent tự động phân tích các automation test không ổn định (lúc pass lúc fail), xác định root cause chính xác, và (tùy mode) tự động sửa code để stabilize test. |
| 6 | |
| 7 | ## ⚠️ Nguyên tắc thực thi |
| 8 | |
| 9 | - **Tất cả output bằng Tiếng Việt** |
| 10 | - **KHÔNG đoán** nguyên nhân — phải phân tích log, code, và DOM thực tế |
| 11 | - **Phải chờ user xác nhận** danh sách fix tại Bước 3 trước khi sửa code (Mode FIX) |
| 12 | - Nếu user chưa cung cấp test file/error log → hỏi trước khi bắt đầu |
| 13 | - ⚠️ Sau khi user xác nhận fix → agent tự sửa + verify, KHÔNG hỏi lại trong quá trình fix |
| 14 | |
| 15 | ## 2 Chế độ (Mode) |
| 16 | |
| 17 | | Mode | Khi nào sử dụng | Output | |
| 18 | |---|---|---| |
| 19 | | **ANALYZE** (mặc định) | User cần hiểu nguyên nhân flaky, chưa muốn sửa code | Báo cáo phân tích + Đề xuất fix | |
| 20 | | **FIX** | User muốn agent tự sửa code luôn | Như ANALYZE + Code đã sửa + Kết quả verify | |
| 21 | |
| 22 | > Nếu user nói "sửa luôn", "fix giùm", "khắc phục test này", hoặc yêu cầu agent sửa code → tự động chuyển sang **Mode FIX**. |
| 23 | |
| 24 | ## Input cần thu thập |
| 25 | |
| 26 | Agent cần ít nhất **1 trong các input** sau từ user: |
| 27 | |
| 28 | | Input | Cách lấy | Độ ưu tiên | |
| 29 | |---|---|---| |
| 30 | | **Test file path** | User cung cấp hoặc agent tìm trong project | ⭐ Bắt buộc | |
| 31 | | **Error log / stack trace** | User paste hoặc agent chạy test để thu thập | ⭐ Bắt buộc | |
| 32 | | **CI/CD log** | User cung cấp URL hoặc file log | Tùy chọn | |
| 33 | | **Test report** (HTML/JSON) | Playwright report, Allure, TestNG report | Tùy chọn | |
| 34 | | **Lịch sử fail** | Số lần fail / tổng số lần chạy | Tùy chọn | |
| 35 | |
| 36 | ## Các bước thực hiện |
| 37 | |
| 38 | ### Bước 1: Thu thập thông tin & Tái hiện lỗi (Detect & Reproduce) |
| 39 | |
| 40 | 1. **Đọc test file** bằng `view_file`: |
| 41 | - Xác định framework (Playwright / Selenium / Appium / Pytest / TestNG) |
| 42 | - Ghi nhận cấu trúc: Page Objects, fixtures, helper functions |
| 43 | - Đánh dấu các vùng code nghi ngờ (waits, locators, assertions, setup/teardown) |
| 44 | |
| 45 | 2. **Chạy test** để tái hiện lỗi (nếu chưa có error log): |
| 46 | - Chạy test **3 lần liên tiếp** bằng `run_command`: |
| 47 | ```bash |
| 48 | # Playwright |
| 49 | npx playwright test <test_file> --retries=0 --reporter=list |
| 50 | |
| 51 | # Pytest |
| 52 | python -m pytest <test_file> -v --count=3 |
| 53 | |
| 54 | # Maven/TestNG |
| 55 | mvn test -Dtest=<TestClass> -Dsurefire.rerunFailingTestsCount=0 |
| 56 | ``` |
| 57 | - Ghi nhận pattern: Fail lần nào? Fail ở step nào? Error message giống hay khác nhau? |
| 58 | |
| 59 | 3. **Thu thập evidence:** |
| 60 | - Error log / stack trace từ mỗi lần chạy |
| 61 | - Screenshots (nếu test có capture on failure) |
| 62 | - Console log / Network log (nếu liên quan đến API calls) |
| 63 | |
| 64 | ### Bước 2: Phân tích Root Cause (Inspect & Classify) |
| 65 | |
| 66 | 1. **Đọc error log** và phân loại theo bảng root cause: |
| 67 | |
| 68 | | Category | Dấu hiệu nhận biết | Ví dụ Error | |
| 69 | |---|---|---| |
| 70 | | 🎯 **Locator không ổn định** | `ElementNotFound`, `No matching element`, selector chứa dynamic class/index | `Locator('.css-1a2b3c')` fail vì class thay đổi mỗi build | |
| 71 | | ⏱️ **Timing / Race condition** | `Timeout`, `Element not visible`, test pass khi chạy chậm (debug mode) | `expect(element).toBeVisible()` timeout vì animation chưa xong | |
| 72 | | 📊 **Test data conflict** | `Duplicate key`, `Already exists`, fail khi chạy parallel | 2 test cùng tạo user `test@email.com` | |
| 73 | | 🔄 **State dependency** | Pass khi chạy độc lập, fail khi chạy cùng suite | Test B phụ thuộc data mà Test A tạo ra | |
| 74 | | 🌐 **Environment / Network** | `ECONNREFUSED`, `503`, `CORS error`, fail trên CI nhưng pass local | API server chậm, CDN timeout | |
| 75 | | 🖼️ **UI Animation / Transition** | `Element is not clickable`, `intercept`, fail ngẫu nhiên khi click | Modal animation chưa hoàn thành, overlay che button | |
| 76 | | 📱 **Viewport / Responsive** | Element bị ẩn, scroll không tới, fail ở resolution khác | Button nằm ngoài viewport trên CI (headless 800x600) | |
| 77 | | 🧹 **Cleanup / Teardown** | Fail ở lần chạy thứ 2+, pass lần đầu | Test không cleanup data → lần sau bị conflict | |
| 78 | |
| 79 | 2. **Inspect code** chi tiết, kiểm tra từng anti-pattern: |
| 80 | |
| 81 | **Locator check:** |
| 82 | - [ ] Có dùng dynamic class (`css-xxx`, `sc-xxx`, `MuiXxx-root`)? → ❌ |
| 83 | - [ ] Có dùng positional xpath (`//div[3]/button[2]`)? → ❌ |
| 84 | - [ ] Locator có unique không? (kiểm tra trên DOM thực tế nếu cần) |
| 85 | |
| 86 | **Wait strategy check:** |
| 87 | - [ ] Có `waitForTimeout()` / `Thread.sleep()` / `time.sleep()`? → ❌ |
| 88 | - [ ] Có `waitForSelector()` khi `expect()` đã đủ? → ⚠️ |
| 89 | - [ ] Assertion có timeout phù hợp không? |
| 90 | |
| 91 | **Test data check:** |
| 92 | - [ ] Data có hardcoded không? (`test@email.com`, `user123`) |
| 93 | - [ ] Data có unique per run không? (timestamp / random) |
| 94 | - [ ] Có clean |