Tại sao tôi viết test trước khi viết code

Tại sao tôi viết test trước khi viết code

Viết test trước không phải vì sách bảo thế — mà vì nó buộc tôi hiểu mình đang làm gì trước khi gõ dòng code đầu tiên.

April 10, 2026Phuong Tran
EssayVIIndustry
Tại sao tôi viết test trước khi viết code

Tôi viết test trước khi viết code. Không phải vì sách bảo thế, mà vì sau nhiều năm tôi nhận ra: viết test trước buộc tôi phải hiểu mình đang làm gì trước khi gõ dòng code đầu tiên.

Phần lớn bug tôi từng tạo ra không phải do code sai. Chúng đến từ việc tôi không hiểu rõ yêu cầu, nhưng vẫn lao vào viết. Viết test trước chặn đúng cái lỗi đó lại.

Test trước là một cách đặt câu hỏi#

Khi tôi viết test trước, câu đầu tiên tôi phải trả lời là: hàm này nhận gì, trả về gì? Nghe đơn giản, nhưng nửa số lần tôi nhận ra mình chưa biết. Input có thể null không? Khi rỗng thì sao? Lỗi thì trả về gì hay ném exception?

Những câu hỏi đó, nếu không có test, tôi sẽ trả lời trong lúc viết code — tức là trả lời một cách ngẫu hứng, mỗi chỗ một kiểu. Test trước ép tôi trả lời trước, một lần, dứt khoát.

Red, green, refactor — nhưng thực dụng#

Tôi không theo TDD một cách giáo điều. Tôi theo nó ở chỗ nó đáng theo:

  • Logic nghiệp vụ — test trước, luôn luôn. Đây là chỗ bug đắt nhất.
  • Wiring, gán field, getter — không test trước, đôi khi không test luôn.
  • Bug — viết test tái hiện bug trước, rồi mới sửa. Test đó vừa chứng minh bug có thật, vừa đảm bảo nó không quay lại.
it("trả về null khi slug không tồn tại", () => {
  expect(service.findBySlug("khong-co")).toBeNull();
});

Cái giá và cái lợi#

Viết test trước chậm hơn ở giờ đầu. Nhưng cái "chậm" đó là chậm khi suy nghĩ, không phải chậm khi gõ phím. Và suy nghĩ trước khi gõ là việc đáng làm chậm.

Cái lợi đến vài tháng sau, khi tôi đụng lại module cũ. Tôi sửa, chạy test, thấy xanh — và tôi tin. Không có test, mỗi lần sửa code cũ là một lần đánh cược. Có test, nó chỉ là một thay đổi bình thường.

Khi nào tôi không viết test trước#

Khi tôi đang khám phá — chưa biết giải pháp trông như thế nào, đang thử nghiệm. Lúc đó test trước là cản trở, vì tôi còn chưa biết cái mình muốn test. Tôi prototype cho tới khi hình dạng lộ ra, rồi xoá prototype, và viết lại tử tế với test trước. Bước xoá đó quan trọng — prototype không có test không nên sống tới production.

© 2026 Phuong Tran