AI trong việc tạo kiểm thử: Nơi nó hỗ trợ và nơi nó gây sai lệch

AI viết kiểm thử rất nhanh. Nhưng nó cũng viết những bài kiểm thử trông có vẻ thật nhưng lại xác minh sai vấn đề.

Bạn dán một hàm vào AI. Ba mươi giây sau, bạn có mười hai bài kiểm thử đều vượt qua (passing). Điểm độ bao phủ (coverage score) của bạn tăng lên. Bạn cảm thấy mình làm việc rất hiệu quả.

Sau đó, một lỗi (bug) xuất hiện trên môi trường production. Bạn nhìn lại mười hai bài kiểm thử đó và nhận ra không có bài nào có thể phát hiện ra lỗi này.

AI đã kiểm thử những gì mã nguồn của bạn đang làm, chứ không phải những gì mã nguồn của bạn đáng lẽ phải làm.

AI rất hữu ích, nhưng bạn phải biết cách sử dụng nó.

Nơi AI phát huy tác dụng:

  • Tạo các đoạn mã mẫu (boilerplate) như các khối setup và teardown.
  • Viết các hàm hỗ trợ factory và các đối tượng dữ liệu lặp đi lặp lại.
  • Tạo ra nhiều biến thể từ một mẫu kiểm thử tốt duy nhất.
  • Xử lý các trường hợp biên (edge cases) hiển nhiên như null, chuỗi rỗng hoặc số không.

Nơi AI thất bại:

  • Kiểm thử dựa trên cách triển khai (Implementation-based tests): Nó viết các bài kiểm thử đi theo cấu trúc mã nguồn thay vì logic nghiệp vụ. Nếu bạn tái cấu trúc (refactor) mã nguồn, các bài kiểm thử sẽ bị lỗi ngay cả khi kết quả trả về vẫn đúng.
  • Các trường hợp biên nông cạn: Nó tìm thấy các lỗi hiển nhiên nhưng bỏ lỡ các lỗi đặc thù của lĩnh vực (domain-specific). Nó không biết về các đặc thù múi giờ, các ràng buộc cơ sở dữ liệu hay các quy tắc nghiệp vụ cụ thể của bạn.
  • Các bản giả lập (mocks) dễ vỡ: Nó giả lập các dịch vụ nội bộ vốn dĩ nên được giữ nguyên bản. Điều này khiến việc bảo trì kiểm thử trở nên chậm chạp và dễ bị lỗi khi thực hiện tái cấu trúc.

Cách sử dụng AI mà không tạo ra "kiểm thử hình thức" (test theater):

  1. Xác định hợp đồng (contract) trước. Viết một câu bằng ngôn ngữ tự nhiên về những gì bài kiểm thử phải chứng minh. Ví dụ: "Một mã đã hết hạn phải trả về số tiền ban đầu."
  2. Đưa câu đó cho AI. Hãy để AI viết mã, nhưng bạn phải là người nắm giữ mục đích (intent).
  3. Chỉ giả lập (mock) tại các ranh giới (boundary). Sử dụng các thực thể (instances) thật cho các module nội bộ. Chỉ giả lập các API hoặc cơ sở dữ liệu bên ngoài.
  4. Tự viết tay một trường hợp biên đặc thù của nghiệp vụ. AI xử lý các trường hợp biên "hiển nhiên". Bạn phải xử lý các trường hợp biên "lúc 3 giờ sáng" – những lỗi thực sự gây ra sự cố trên production.

Đừng để AI quyết định bài kiểm thử sẽ xác minh điều gì. Hãy dùng nó để gõ mã, nhưng bạn mới là người cung cấp logic.

Source: https://dev.to/nazar_boyko/ai-for-test-generation-where-it-helps-and-where-it-lies-jhm