Bỏ qua

Module 10: Maintenance — Khi Test Gãy, Phải Làm Gì?

🎯 Mục Tiêu Module

  • Hiểu tại sao test gãy
  • Biết cách phân biệt UI thay đổi vs bug thật
  • Nắm được flow xử lý khi test gãy
  • Thực hành maintenance test

10.1. Tại Sao Test Gãy?

Các nguyên nhân phổ biến

┌─────────────────────────────────────────────────────┐
│                                                     │
│  Nguyên nhân test gãy:                              │
│                                                     │
│  1. UI thay đổi (element thay đổi)                 │
│     - Locator cũ không tìm thấy element mới        │
│     - Text thay đổi                                 │
│     - Layout thay đổi                               │
│                                                     │
│  2. Logic thay đổi                                  │
│     - Flow thay đổi                                 │
│     - Validation thay đổi                           │
│     - Error message thay đổi                        │
│                                                     │
│  3. Data thay đổi                                   │
│     - Test data không còn hợp lệ                   │
│     - Database thay đổi                             │
│                                                     │
│  4. Environment thay đổi                            │
│     - URL thay đổi                                  │
│     - Config thay đổi                               │
│                                                     │
└─────────────────────────────────────────────────────┘

10.2. Phân Biệt UI Thay Đổi vs Bug Thật

Flow quyết định

Test fail
Kiểm tra nguyên nhân
    ├── Mở website thủ công
    │   │
    │   ├── Website hoạt động bình thường?
    │   │   │
    │   │   ├── Có ──► UI THAY ĐỔI
    │   │   │         └── Cần cập nhật test
    │   │   │
    │   │   └── Không ──► BUG THẬT
    │   │                  └── Tạo bug report cho Dev
    │   │
    │   └── Element có tồn tại?
    │       │
    │       ├── Có ──► Locator sai → Cập nhật locator
    │       │
    │       └── Không ──► Element bị xóa → Cần viết lại test

Bảng quyết định

Tình huống Nguyên nhân Hành động
Element không tìm thấy UI thay đổi Cập nhật locator
Text không khớp UI thay đổi Cập nhật assertion
Timeout Trang load chậm Tăng timeout hoặc dùng waitFor
Element disabled Logic thay đổi Cập nhật flow test
Page not found URL thay đổi Cập nhật URL

10.3. Flow Xử Lý Khi Test Gãy

Flow đầy đủ

┌─────────────────────────────────────────────────────┐
│                                                     │
│  1. Test gãy (fail)                                 │
│         ↓                                           │
│  2. Phân tích nguyên nhân                           │
│         ↓                                           │
│  3. Quyết định: UI thay đổi hay Bug thật?          │
│         ↓                                           │
│  ┌─────────────────────┐  ┌────────────────────┐   │
│  │ UI THAY ĐỔI         │  │ BUG THẬT           │   │
│  │                     │  │                    │   │
│  │ → Cập nhật test     │  │ → Tạo bug report   │   │
│  │ → Hoặc chạy lại     │  │ → Chuyển cho Dev   │   │
│  │   pipeline AI       │  │                    │   │
│  └─────────────────────┘  └────────────────────┘   │
│         ↓                         ↓                │
│  4. Chạy lại test để verify                        │
│                                                     │
└─────────────────────────────────────────────────────┘

10.4. Cập Nhật Test

Cách 1: Sửa locator thủ công

// Locator cũ (gãy)
await page.locator('#old-id').click();

// Locator mới (hoạt động)
await page.locator('#new-id').click();

Cách 2: Chạy lại pipeline AI

UI thay đổi nhiều
Chạy lại pipeline từ Stage 2
IDE Agent sinh code mới
So sánh code mới với code cũ
Chỉ sửa phần khác

Cách 3: Dùng fallback locator

// Primary locator (có thể gãy)
await page.locator('[data-testid="login-btn"]').click();

// Fallback locator (dự phòng)
await page.locator('button:has-text("Login")').click();

10.5. Best Practices cho Maintenance

1. Dùng locator ổn định

Ưu tiên: data-testid > id > aria-label > text > CSS

2. Tách test data

// ❌ Hardcode
await page.locator('#username').fill('testuser123');

// ✅ Tách riêng
const TEST_DATA = { username: 'testuser123' };
await page.locator('#username').fill(TEST_DATA.username);

3. Dùng Page Object Model

Locator thay đổi → Chỉ sửa 1 file Page Object
→ Không cần sửa tất cả test

4. Chạy test định kỳ

Chạy hàng ngày → Phát hiện lỗi sớm
→ Maintenance ít hơn

5. Version control

Lưu code vào Git
→ Dễ dàng revert khi cần
→ Theo dõi thay đổi

10.6. Ví Dụ Thực Tế

Tình huống: Element thay đổi

Trước: <button id="login-btn">Login</button>
Sau:   <button id="sign-in-btn">Sign In</button>

Code cũ (gãy)

await page.locator('#login-btn').click();

Code mới (hoạt động)

await page.locator('#sign-in-btn').click();

Hoặc dùng text (linh hoạt hơn)

// Dùng text → Ít bị ảnh hưởng khi ID thay đổi
await page.locator('text=Sign In').click();

📝 Bài Tập

Bài Tập 1: Phân Tích Test Fail

  1. Tạo test có lỗi (sai locator)
  2. Chạy test
  3. Phân tích nguyên nhân
  4. Xác định: UI thay đổi hay Bug thật?

Bài Tập 2: Cập Nhật Test

  1. Tìm locator mới cho element
  2. Cập nhật test
  3. Chạy lại test

Bài Tập 3: Dùng Fallback Locator

  1. Viết test với primary locator
  2. Thay đổi primary locator (giả lập UI thay đổi)
  3. Thêm fallback locator
  4. Chạy test

✅ Checklist Hoàn Thành Module

  • [ ] Hiểu tại sao test gãy
  • [ ] Biết cách phân biệt UI thay đổi vs bug thật
  • [ ] Nắm flow xử lý khi test gãy
  • [ ] Biết cách cập nhật test
  • [ ] Thực hành maintenance test
  • [ ] Hoàn thành bài tập