# Cơ chế Kiểm thử Hồi quy (Regression Test)

Kiểm thử hồi quy (Regression Test) là công cụ quan trọng nhằm đảm bảo các bản cập nhật Model, Flow hoặc Prompt không làm suy giảm chất lượng và độ chuẩn xác của câu trả lời. Bộ công cụ Regression Test cung cấp một giao diện UI trực quan để thực thi các bộ câu hỏi tiêu chuẩn (Golden Dataset) nhằm ghi nhận, đối chiếu kết quả.

## Logic Hoạt động (Logic Flow)

Để cập nhật tiến trình (Progress Bar) liên tục trên giao diện, kiến trúc hệ thống chia nhỏ việc gọi API thay vì gửi một lúc toàn bộ batch:

```mermaid
sequenceDiagram
    participant Admin as Admin (Browser)
    participant UI as Frontend (regression-test.js)
    participant API as Backend (regression_test_route.py)
    participant Target as Target URL (Prod/Dev)

    Admin->>UI: Quản lý Test Cases (Lưu tại localStorage)
    Admin->>UI: Bấm "Run All"
    loop Duyệt qua từng Test Case
        UI->>API: POST /api/regression-test/run (gửi 1 test_case)
        API->>Target: POST target_url ({"user_query": "..."})
        Target-->>API: Trả về JSON (ai_response, trace_id)
        API-->>UI: Kết quả (status, response, trace_id, latency_ms)
        UI->>UI: Cập nhật Progress Bar & Hiển thị kết quả Real-time
    end
    UI-->>Admin: Báo cáo tổng quan (Passed/Failed, Latency)
```

## Chi tiết Triển khai

### 1. Quản lý Test Cases (Client-side)
*   **Dữ liệu mồi (Seed Data):** Hệ thống tích hợp sẵn một danh sách 10 test case mẫu (VD: "Ngân sách 500k mua được gì?", "Size chart của Canifa như thế nào?") nếu dữ liệu trống.
*   **Lưu trữ:** Toàn bộ tập dữ liệu kiểm thử được lưu trữ tại trình duyệt thông qua `localStorage` (sử dụng key `regression_test_cases`). Điều này cho phép tester/admin toàn quyền kiểm soát thiết bị của mình mà không cần cấu hình database phức tạp.
*   **Import/Export:** UI cung cấp các hàm chuyển đổi (blob conversion) cho phép tải xuống (download JSON) hoặc tải lên (import JSON) bộ test cases thuận tiện.

### 2. Thực thi và Xử lý Lỗi (Server-side)
*   **Đo lường Độ trễ (Latency):** Backend sử dụng thư viện `httpx.AsyncClient` và ghi nhận chỉ số `elapsed.total_seconds() * 1000` cho từng request để theo dõi hiệu năng trả lời của LLM.
*   **Theo vết (Traceability):** Các response từ target agent có chứa `trace_id` được bắt và đưa lại UI, đóng vai trò như pointer để tra cứu thêm nhật ký LLM trên nền tảng Log (VD: Promtail/Grafana).
*   **Xử lý Ngoại lệ:** Nếu Request tới Target URL gặp sự cố (như Timeout, mã HTTP lỗi, hoặc target chưa khởi động), backend tự động gói gọn thông báo lỗi thay vì crash, và báo cáo status bằng `error` về UI.
