Bỏ qua để vào nội dung chính
Prompt sinh test bằng AI: 5 thay đổi để bắt được bug

Prompt sinh test bằng AI: 5 thay đổi để bắt được bug

Bởi Ryan Patel
14 thg 10, 20263 phút đọc

Test do AI sinh ra luôn xanh nhưng bug vẫn lọt. Năm thay đổi prompt cho Cursor và Claude Code để test thật sự bắt được lỗi trong code của bạn.

Bạn bảo Cursor hay Claude Code "viết test cho hàm này". Ba mươi giây sau có một file test xanh mướt, coverage tăng, và tuần sau bug vẫn lên production.

Một bài hướng dẫn trên Dev.to mô tả đúng hiện tượng này: "the tests are green, coverage goes up, and a real bug ships straight through them". Tác giả cho rằng lỗi không nằm ở model mà ở prompt, và đưa ra năm thay đổi áp dụng cho "every testing prompt — in Cursor, Claude Code, ChatGPT or Copilot Chat".

Gốc rễ: bạn đưa code, model lấy code làm spec

Đây là phần đáng giá nhất của bài. Tác giả chỉ ra: "If the only input is the implementation, the implementation becomes the spec. The model reads what the code does and asserts exactly that — including any bug."

Cách sửa là viết một hai câu mô tả ý định bằng lời của bạn, trước khi dán code vào. Có mô tả ý định, model mới có cơ sở để báo rằng code đang sai thay vì ghim hành vi sai đó lại thành test.

Bốn thay đổi còn lại

  • Bắt lập kế hoạch trước khi viết code. Yêu cầu model liệt kê hành vi quan sát được và bảng case trước: "List every observable behaviour (return values, errors, side effects, branches). Mark anything that looks like a bug with [SUSPECT]", kèm các case "happy path, boundaries (empty, zero, one, max, off-by-one), invalid input, error paths". Duyệt một bảng case mất mười giây; duyệt 300 dòng test sinh sẵn thì không.
  • Đính kèm một file test có sẵn. Mô tả convention bằng lời hiệu quả kém hơn nhiều so với đưa mẫu: "Conventions to copy: tests/billing/invoice.test.ts Match its imports, helpers, file location and naming."
  • Viết sẵn các luật model hay phá. Bốn luật được nêu: "Do not change production code to make tests pass", "Expected values must be hand-computed literals, not the same formula as the code", "Only stub true boundaries: clock, randomness, network, third-party APIs", và "No fixed sleeps. Freeze time and seed randomness explicitly."
  • Bắt model tự biện minh từng test. Câu chốt: "For each test, state in one line the specific bug it would catch. Delete any test whose answer is 'none' or 'same as another test'."

Luật đáng giá nhất trong nhóm

Theo tác giả, chỉ riêng luật về giá trị kỳ vọng đã "removes a whole class of 'mirror tests' — tests that agree with the implementation by construction and can never fail for the reason you care about". Đây là đúng loại test mà AI dễ sinh ra: lấy đúng công thức trong code làm giá trị kỳ vọng, nên nó không bao giờ đỏ dù logic sai.

Bài viết cũng đề xuất một bước kiểm tra thủ công sau cùng: phá code có chủ đích rồi chạy lại test. "If nothing does, the tests are decoration."

Áp dụng thế nào cho hợp lý

Năm thay đổi này là chi phí prompt một lần, không phải quy trình mới cho cả team — đó là lý do chúng dễ áp dụng. Phần đáng cân nhắc là đừng chạy nguyên bộ cho mọi hàm: với code cũ không ai dám đụng, bài viết gợi ý hướng khác là "write characterization tests that pin current behaviour, bugs included, before you change anything".

Việc nên làm hôm nay: lấy một hàm bạn thuộc nằm lòng, chạy thử prompt có phần mô tả ý định và bảng case. Nếu bảng case lòi ra một edge case bạn chưa từng viết xuống, prompt đó đáng giữ lại làm template.

Không spam, hủy đăng ký bất kỳ lúc nào.

Bài viết liên quan