Học cách viết kiểm thử chấp nhận từ lời nhắc bằng cách biến mỗi yêu cầu tính năng thành 5–10 kịch bản rõ ràng, bao phủ luồng thành công và các trường hợp biên mà không làm phình to bộ test.

Bắt đầu với một câu nêu rõ mục tiêu người dùng và vạch đích.\n\nRồi bóc prompt thành:\n- Đầu vào (người dùng cung cấp gì)\n- Đầu ra (hệ thống hiển thị/lưu/gửi/chặn gì)\n- Quy tắc (các điều kiện “chỉ khi”, “phải”, và ngoại lệ)\n\nTừ đó, viết 1–2 luồng thành công và 4–8 trường hợp biên phù hợp với rủi ro thực tế (quyền, trùng lặp, timeout, dữ liệu thiếu).
Vì prompt che giấu giả định. Một prompt có thể nói “lưu”, nhưng không định nghĩa đó là bản nháp hay đã xuất bản, chuyện gì xảy ra khi thất bại, hoặc ai được phép làm việc đó.\n\nKịch bản buộc bạn phải đặt tên cho các quy tắc từ sớm, trước khi xuất hiện lỗi như gửi trùng, sai quyền truy cập, hoặc kết quả không nhất quán.
Dùng Given–When–Then khi tính năng có trạng thái và tương tác.\n\nDùng bảng đầu vào/đầu ra đơn giản khi bạn có nhiều kiểm tra quy tắc tương tự.\n\nChọn một định dạng và dùng nó trong 30 ngày rồi điều chỉnh. Định dạng tốt nhất là định dạng mà đội của bạn thực sự sẽ viết và đọc.
Tập trung vào hành vi quan sát được:\n- người dùng nhấp/gõ gì\n- hệ thống hiển thị gì (thông báo, trạng thái)\n- thay đổi nào được lưu (tạo/cập nhật/chặn)\n\nTránh chi tiết triển khai như bảng cơ sở dữ liệu, mã phản hồi API, job nền, hay framework. Những chi tiết đó thay đổi thường xuyên và không chứng minh người dùng nhận được kết quả họ cần.
Viết luồng thành công nhàm chán nhất nơi mọi thứ đều đúng:\n- đặt tên người dùng/role thực tế (ví dụ: “khách hàng đã đăng nhập với email đã xác minh”)\n- dùng dữ liệu tối thiểu hợp lý (một project, một mục)\n- giữ các bước ngắn (không luồng tuỳ chọn)\n\nRồi xác nhận bốn điều: màn hình/trạng thái đúng, thông báo thành công rõ, dữ liệu được lưu, và người dùng có thể tiếp tục hành động hợp lý kế tiếp.
Chọn trường hợp biên dựa trên rủi ro và tần suất:\n- Thiếu/đầu vào không hợp lệ (rỗng, dài quá, sai định dạng)\n- Quyền hoặc session (không truy cập, đăng nhập hết hạn)\n- Xung đột trạng thái (đã gửi, đã active)\n- Đồng thời (nhấn double-click, hai tab)\n- Lỗi tích hợp (timeout, provider không sẵn sàng)\n\nMục tiêu: một kịch bản cho mỗi rủi ro khác nhau, không cần tất cả biến thể.
Giữ an toàn và rõ ràng:\n- Không lưu một cách im lặng/không hoàn chỉnh\n- Thông báo lỗi rõ (xảy ra gì và làm gì tiếp theo)\n- Retry an toàn (không lặp hành động)\n- Trạng thái đúng (ví dụ: phiên bản cũ vẫn hoạt động nếu deployment thất bại)\n\nMột kịch bản thất bại nên chứng minh hệ thống không làm hỏng dữ liệu hoặc gây hiểu nhầm cho người dùng.
Đối xử với output của Koder.ai như mọi app khác: kiểm thử những gì người dùng trải nghiệm, không phải cách mã được sinh ra.\n\nCách thực hành:\n- viết kịch bản trong Chế độ Planning trước khi xây\n- xây tính năng\n- chạy kịch bản như checklist chấp nhận\n- dùng snapshot và rollback trước thay đổi rủi ro để phục hồi nhanh khi biên lỗi xuất hiện
Lưu ở nơi công việc đã diễn ra và giữ một nguồn chân lý:\n- trong ticket dưới mục “Acceptance scenarios”\n- cạnh mã sản phẩm\n- trong tài liệu chia sẻ, một trang cho mỗi tính năng\n\nNếu dùng Koder.ai, giữ kịch bản trong Chế độ Planning để chúng luôn gắn với lịch sử build. Quan trọng nhất: yêu cầu kịch bản trước khi bắt đầu phát triển.