Mọi bài kiểm tra đều vượt qua. Người dùng vẫn không thể chơi được game

"API trả về 200 OK!"

Trong công việc kỹ sư đầu tiên của mình, tôi đã nhận thấy một vấn đề lớn. Các tiền bối của tôi rất thích các bảng điều khiển (dashboards). Họ thích độ bao phủ mã nguồn (code coverage) cao. Họ nghĩ rằng nếu các bài kiểm tra đều hiển thị màu xanh (green), thì sản phẩm đã hoạt động tốt.

Họ đã lầm.

Mã nguồn hoạt động và việc con người đạt được mục đích của họ là hai việc hoàn toàn khác nhau. Một nút bấm có thể trả về mã thành công trong khi vẫn khiến người dùng bị kẹt trên một màn hình lỗi.

Tôi đã xây dựng một phương pháp để tìm ra những "ngõ cụt" UX này mà không cần chạy ứng dụng. Tôi gọi đó là quy trình duyệt tĩnh bằng hai tác nhân (two-agent static walkthrough). Nó sử dụng hai tác nhân AI trò chuyện lặp đi lặp lại với nhau.

  • Tác nhân A là người dùng. Tác nhân này có một mục tiêu cụ thể. Nó rất kiên trì. Nó không bỏ cuộc sau một lần sai sót mà sẽ tiếp tục thử các con đường khác nhau.
  • Tác nhân B là ứng dụng. Nó có quyền đọc mã nguồn thực tế. Nó truy vết đường đi của mã nguồn cho mọi hành động của người dùng. Nó báo cáo chính xác những gì mã nguồn thực hiện, kèm theo tên tệp và số dòng. Nó không thể tự tưởng tượng ra những thứ không tồn tại trong mã nguồn.

Tôi đã thử nghiệm nó trên một trình tạo mini-game AI bị lỗi. Đây là những gì đã xảy ra:

Turn 1: Nút bấm thất bại. Người dùng nhấn "Generate". Mã nguồn đã gửi yêu cầu đến một endpoint cũ đã ngừng hoạt động thay vì endpoint mới. Các bài kiểm tra vẫn vượt qua vì API cũ vẫn còn hoạt động.

Turn 2: Khoảng trống không thể nhấp. Người dùng cố gắng nhấp vào kết quả. Mã nguồn đặt văn bản trong một khung trống mà không có trình xử lý sự kiện nhấp (click handler). Không có gì xảy ra cả.

Turn 3: Sự chúc phúc giả tạo. Người dùng cố gắng sửa lỗi. Backend thất bại do thiếu ID. Màn hình hiển thị thông báo thành công màu xanh mặc dù hệ thống đã bị lỗi.

Turn 4: Hy vọng bị cắt đứt. Người dùng cố gắng sao chép mã thủ công. API đã cắt ngang văn bản giữa chừng. Mã nguồn đã bị hỏng.

Người dùng đã bỏ cuộc.

Hầu hết các bài kiểm tra đơn vị (unit tests) chỉ kiểm tra xem một endpoint có trả về 200 hay không. Chúng không kiểm tra xem người dùng có thực sự đạt được mục tiêu của họ hay không.

Cách sử dụng:

  • Hãy làm cho tác nhân người dùng trở nên kiên trì. Những lỗi thực sự thường ẩn nấp sau sai sót đầu tiên.
  • Hãy gắn tác nhân ứng dụng vào mã nguồn thực tế. Điều này biến việc đóng vai thành một báo cáo lỗi thực thụ.
  • Hãy sử dụng phương pháp này như một sự bổ sung cho các bài kiểm tra của bạn. Nó giúp tìm ra những lỗ hổng nơi logic của bạn va chạm với thực tế.

Phương pháp này mang tính tĩnh và tiết kiệm chi phí. Nó chạy ngay cả trước khi bạn viết một bộ dữ liệu kiểm thử (test fixture) nào đó. Nó biến "mã nguồn hoạt động" thành "người dùng thành công."

Source: https://dev.to/terum/every-test-passed-the-user-still-couldnt-play-the-game-388o

Optional learning community: https://t.me/GyaanSetuAi