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

AI viết test rất nhanh. Nhưng nó cũng viết ra những bản test trông có vẻ thật nhưng lại kiểm tra sai thứ cần kiểm tra. Bạn có thể thấy độ bao phủ (coverage) tăng lên, nhưng mã nguồn của bạn vẫn bị lỗi.

AI rất tuyệt vời cho một số tác vụ nhất định. Hãy sử dụng nó để:

  • Suy luận từ một ví dụ tốt. Nếu bạn viết một bản test hoàn hảo, AI có thể viết thêm mười bản nữa theo đúng phong cách của bạn.
  • Xử lý các thao tác gõ lặp đi lặp lại. Sử dụng nó cho các khối setup, teardown và các hàm hỗ trợ factory.
  • Tạo khung mã nguồn ban đầu (scaffolding). Nó giúp bạn bắt đầu viết code nhanh hơn là đối mặt với một file trống.

Nguy hiểm bắt đầu khi bạn để AI quyết định "hợp đồng" (contract).

Nếu bạn đưa cho AI một hàm và yêu cầu viết test, nó sẽ đọc mã nguồn và kiểm tra những gì mã nguồn đang thực hiện. Nó không kiểm tra những gì mã nguồn nên thực hiện. Điều này tạo ra một vòng lặp khép kín. AI đưa ra một giả định, viết mã nguồn, và sau đó viết các bản test đồng tình với chính giả định đó.

Khi lỗi xảy ra trên môi trường production, đó là vì bộ test đã đứng về phía cái lỗi đó.

Hãy cẩn thận với ba cái bẫy sau:

  1. Các bản test bám sát quá mức vào cách triển khai (Implementation-shaped tests) AI thường kiểm tra các luồng logic thay vì các quy tắc nghiệp vụ (business rules). Nếu bạn thay đổi một chi tiết nội bộ nhỏ, các bản test sẽ bị lỗi ngay cả khi kết quả trả về vẫn đúng. Điều này khiến việc tái cấu trúc mã (refactoring) trở thành một cơn ác mộng.

  2. Các trường hợp biên nông cạn (Shallow edge cases) AI rất giỏi kiểm tra các giá trị null, chuỗi rỗng và số không. Đó là những điều hiển nhiên. Nó không thể tìm ra các "biên nghiệp vụ" (domain edges). Nó không biết về các lỗi múi giờ cụ thể, các đặc thù của cơ sở dữ liệu hay các quy tắc nghiệp vụ riêng biệt của bạn.

  3. Các bản mock dễ vỡ (Brittle mocks) AI rất thích mock mọi thứ. Điều này dẫn đến hai vấn đề:

  • Bản mock bị sai. Nó mô phỏng một phiên bản giả của một API không khớp với thực tế.
  • Bản mock làm đóng băng cách triển khai. Nó kiểm tra cách mã của bạn gọi các hàm khác thay vì kiểm tra kết quả cuối cùng.

Cách sử dụng AI đúng đắn:

Hãy giữ "ý định" (intent) nằm ngoài tầm kiểm soát của AI.

  • Viết hợp đồng trước. Viết một câu bằng ngôn ngữ tự nhiên cho mỗi bản test. Ví dụ: "Các mã đã hết hạn phải trả về số tiền ban đầu."
  • Đưa những câu đó cho AI. Hãy để nó viết các câu lệnh khẳng định (assertions), nhưng bạn mới là người cung cấp ý nghĩa.
  • Mock tại các ranh giới. Chỉ mock các API bên ngoài hoặc cơ sở dữ liệu. Hãy sử dụng các phiên bản thực của các module nội bộ của chính bạn.
  • Tự viết một trường hợp biên nghiệp vụ bằng tay. Mỗi khi bạn hoàn thành một hàm, hãy viết ra một điều khiến bạn lo lắng nhất. Sử dụng điều đó làm prompt cho AI.

AI là một công cụ tăng năng suất, không phải là sự thay thế cho tư duy. Hãy sử dụng nó để viết phần thân của bản test, nhưng đừng bao giờ để nó quyết định mục đích của bản test đó là gì.

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

Cộng đồng học tập tùy chọn: https://t.me/GyaanSetuAi