Khi AI viết cả code lẫn test, test dễ chỉ xác nhận chính cái code. Câu hỏi đúng không phải "test có xanh không" mà là "code sai thì test có đỏ không".
Tóm lại: bắt đầu bằng cách rẻ nhất, phá code bằng tay.
Lưu ý: ví dụ mã dựng lại. Con số 4% lấy từ bản tóm tắt một bài báo, mình chưa đọc toàn văn. Chưa chạy các công cụ nêu tên.
| Thuật ngữ | Nói dễ hiểu |
|---|---|
| Độ phủ | Tỷ lệ dòng code mà test chạy qua. Không nói test kiểm có đúng không |
| Kiểm thử đột biến | Cố ý làm hỏng code một chút xem test có đỏ không |
| Điểm đột biến | Tỷ lệ phiên bản bị phá mà test bắt được |
| Kiểm thử theo thuộc tính | Mô tả một quy tắc luôn đúng, để công cụ thử nhiều đầu vào |
| Giá trị biên | Giá trị nằm đúng trên vạch của quy tắc, như đúng 500 nghìn |
| Test luôn xanh | Test không bao giờ đỏ, kể cả khi code sai |
Đơn từ 500 nghìn trở lên được giảm 10%. Đúng 500.000 cũng được giảm.
total > 500000. Hai test: 600.000 được giảm, 100.000 không. Cả hai xanh, độ phủ 100%.
| Phiên bản code | Test 600.000 | Test 100.000 | Đúng 500.000 |
|---|---|---|---|
| total > 500000 (sai) | Xanh | Xanh | Không giảm: sai |
| total >= 500000 (đúng) | Xanh | Xanh | Có giảm: đúng |
| Thêm test đúng 500.000 | Đỏ với bản sai | Xanh với bản đúng | Đây là test có giá trị |
Nhìn yêu cầu, không nhìn code. Cho AI cả đặc tả và ví dụ.
Viết test trước, chạy, thấy đỏ đúng lý do, rồi sửa.
Đổi > thành >=, đổi 0.9 thành 0.8, bỏ một điều kiện.
Công cụ tạo nhiều bản bị phá. Chậm, nên dùng ở phần lõi.
Quy tắc luôn đúng: kết quả không bao giờ lớn hơn tổng ban đầu.
Ngay dưới, đúng bằng, ngay trên vạch. Cộng 0, số âm, rất lớn.
Mở ra bấm thử. Có lỗi chỉ mắt mới thấy.
| Đầu vào | Kết quả mong đợi |
|---|---|
| 499.999 | 499.999, không giảm |
| 500.000 | 450.000, có giảm |
| 500.001 | 450.000,9, có giảm |
| 0, số âm, rất lớn, trống | Chỉ rõ cách xử lý từng trường hợp |
| Dấu hiệu | Vì sao yếu |
|---|---|
| Không có phép kiểm | Chỉ chạy qua dòng, không so kết quả |
| Mock mọi thứ | Kiểm cái mock, không kiểm hành vi |
| Chụp đầu ra hiện tại làm đáp án | Mọi lỗi sẵn có thành "đúng" |
| Bắt lỗi rồi nuốt | Che mất thất bại |
| Giá trị mong đợi tính bằng chính công thức của code | Cùng sai thì cùng đạt |
"Test chạy qua 100% dòng, vậy là an toàn."
Bài MutGen (2025) cho rằng độ phủ là chỉ báo yếu về khả năng bắt lỗi, và nhắc một bộ test phủ 100% nhưng điểm đột biến khoảng 4% (theo bản tóm tắt).
Test viết dựa vào đâu.
Ít nhất một lần.
Thử một chỗ quan trọng.
Cho mọi ngưỡng.
Không chỉ chạy qua.
Đường chính của ứng dụng.
| Thay vì | Thử viết |
|---|---|
| "Viết test cho hàm này" | "Đây là đặc tả và ba ví dụ. Viết test từ đặc tả, không từ code hiện có." |
| (không nói về biên) | "Gồm giá trị ngay dưới, đúng bằng, ngay trên mỗi ngưỡng." |
| (không tự kiểm) | "Rồi cố ý phá code ba cách và cho biết test nào đỏ." |
Dùng có chọn lọc ở phần lõi quan trọng, và bắt đầu bằng cách phá code bằng tay.
Nếu test vẫn xanh, bạn vừa tìm được chỗ test không kiểm.