1. Self-healing test là gì và vì sao nó hấp dẫn
Self-healing test là ý tưởng để một tác nhân tự động sửa những test bị gãy do thay đổi giao diện, thay vì bắt con người sửa thủ công từng locator. Trong Playwright hiện đại, vai trò này thuộc về Healer agent, một trong ba tác nhân AI cộng tác cùng Planner và Generator. Khi một test đỏ, Healer chạy ở chế độ debug, đọc console, network, và snapshot khả năng truy cập của trang, suy luận vì sao locator không còn khớp, rồi đề xuất bản vá locator hoặc đánh dấu test bỏ qua nếu không thể. Sức hấp dẫn rất rõ: giảm chi phí bảo trì khổng lồ khi UI thay đổi liên tục.
Nhưng self-healing là con dao hai lưỡi. Nếu Healer sửa một cách mù quáng để 'cho test xanh', nó có thể vô tình chữa lành trên một bug thật: giả sử nút Thanh toán bị lập trình viên xoá nhầm, một Healer thiếu kỷ luật sẽ tìm nút gần giống rồi bấm vào đó, khiến test xanh trong khi tính năng đã hỏng. Đây là rủi ro trung tâm của bài viết. Mục tiêu không phải là cấm self-healing, mà là dựng guardrail để tận dụng sức mạnh giảm bảo trì của nó mà không bao giờ để nó che mất một regression thật.
2. Healer agent hoạt động thế nào bên trong
Healer không đoán mò trên pixel. Nó làm việc trên accessibility tree — cây khả năng truy cập biểu diễn trang dưới dạng vai trò và tên có ngữ nghĩa, giống cách trình đọc màn hình nhìn thấy. Khi một test đỏ, Healer khởi động lại kịch bản ở chế độ debug, quan sát trạng thái trang tại bước thất bại, thu thập console log, network request, và ARIA snapshot, rồi đối chiếu locator cũ với cây hiện tại. Nếu nút 'Đăng nhập' đổi từ id="login" sang một cấu trúc khác nhưng vẫn có role button với accessible name 'Đăng nhập', Healer suy ra locator ngữ nghĩa getByRole('button', {name:'Đăng nhập'}) và đề xuất thay thế.
# Scaffold ba agent Planner/Generator/Healer + seed.spec.ts
npx playwright init-agents
# Sinh cấu trúc:
# .github/agents/planner.md -> khám phá app, viết test plan Markdown
# .github/agents/generator.md -> biến plan thành spec, verify locator trên app thật
# .github/agents/healer.md -> chạy debug, đọc console/network/snapshot, vá test đỏ
# tests/seed.spec.ts -> fixtures/setup dùng chungĐiểm mấu chốt về chất lượng heal là chất lượng của locator ngữ nghĩa. Healer heal tốt nhất khi ứng dụng có vai trò ARIA và nhãn rõ ràng, vì khi đó việc 'nút này giờ ở đâu' trở thành một suy luận có căn cứ trên ngữ nghĩa ổn định thay vì mò trên cấu trúc DOM dễ vỡ. Ngược lại, nếu app đầy div vô danh không role không label, Healer buộc phải bám vào selector mong manh và dễ heal sai. Vì thế đầu tư vào accessibility không chỉ tốt cho người dùng khuyết tật mà còn trực tiếp làm self-healing đáng tin hơn.
3. Rủi ro trung tâm: heal đè lên bug thật
Đây là nguy cơ khiến self-healing có thể phản tác dụng nghiêm trọng. Test tồn tại để phát hiện khi hành vi thay đổi ngoài ý muốn. Nếu một tác nhân sửa test cho khớp bất kỳ trạng thái hiện tại nào của app, nó biến test thành tấm gương luôn phản chiếu đúng thực tại — kể cả khi thực tại đó là một bug. Hãy hình dung một deploy làm hỏng luồng thanh toán: nút Thanh toán biến mất và một nút Tiếp tục xuất hiện thay thế do lỗi điều kiện hiển thị. Một Healer ngây thơ thấy locator nút Thanh toán gãy, tìm phần tử tương tự, khoá vào nút Tiếp tục, và test xanh. Con người mất đúng tín hiệu đỏ mà lẽ ra phải chặn deploy.
Cái bẫy tinh vi ở chỗ heal thất bại trông y hệt heal thành công: cả hai đều cho test xanh. Sự khác biệt duy nhất là ý nghĩa nghiệp vụ, thứ mà một tác nhân chỉ nhìn locator không thể tự phân định. Vì vậy không được đánh giá một lần heal bằng tiêu chí 'test có xanh không', mà bằng 'bất biến nghiệp vụ có còn được kiểm chứng không'. Đây là lý do mọi hệ self-healing đáng tin đều phải neo vào các assertion nghiệp vụ mà tác nhân không được phép chỉnh, và phải có guardrail chặn heal khi những assertion đó bị vi phạm.
4. Guardrail 1: tách oracle nghiệp vụ khỏi cơ chế
Guardrail nền tảng nhất là phân tách rạch ròi hai loại code trong test: cơ chế và oracle. Cơ chế là cách điều hướng và tìm phần tử — locator, click, chờ đợi; đây là phần Healer được phép sửa vì nó chỉ phản ánh cấu trúc UI có thể thay đổi. Oracle là các assertion khẳng định bất biến nghiệp vụ — tổng tiền phải bằng tổng dòng hàng, tồn kho không âm, người dùng không có quyền không thấy nút admin; đây là phần Healer TUYỆT ĐỐI không được đụng. Khi tách rõ hai loại này trong cấu trúc test, guardrail trở nên khả thi vì ta có thể ra lệnh cho tác nhân chỉ được chỉnh vùng cơ chế.
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!