هوش مصنوعی برای تولید تست: کجا کمک می‌کند و کجا فریب می‌دهد

هوش مصنوعی تست‌ها را سریع می‌نویسد. اما تست‌هایی هم می‌نویسد که واقعی به نظر می‌رسند ولی موارد اشتباهی را تأیید می‌کنند. ممکن است ببینید که پوشش تست (coverage) شما بالا می‌رود، اما کدتان همچنان خراب باقی می‌ماند.

هوش مصنوعی برای برخی وظایف عالی است. از آن برای موارد زیر استفاده کنید:

  • استخراج الگو از یک مثال خوب. اگر یک تست بی‌نقص بنویسید، هوش مصنوعی می‌تواند ده تست دیگر دقیقاً با سبک شما بنویسد.
  • انجام تایپ‌های تکراری. از آن برای بلوک‌های setup ،teardown و factory helpers استفاده کنید.
  • ایجاد ساختار اولیه (scaffolding). این کار شما را سریع‌تر از یک فایل خالی به مرحله ویرایش می‌رساند.

خطر زمانی شروع می‌شود که اجازه دهید هوش مصنوعی درباره «قرارداد» (contract) تصمیم بگیرد.

اگر یک تابع را به هوش مصنوعی بدهید و از او بخواهید تست بنویسد، او کد را می‌خواند و آنچه را که کد در حال حاضر انجام می‌دهد تست می‌کند؛ نه آنچه را که کد «باید» انجام دهد. این کار یک حلقه بسته ایجاد می‌کند. هوش مصنوعی یک فرض را در نظر می‌گیرد، کد را می‌نویسد و سپس تست‌هایی می‌نویسد که با همان فرض همسو هستند.

وقتی باگ‌ها در محیط عملیاتی (production) ظاهر می‌شوند، به این دلیل است که مجموعه تست‌ها در سمتِ خودِ باگ بوده‌اند.

مراقب این سه تله باشید:

  1. تست‌های وابسته به پیاده‌سازی (Implementation-shaped tests) هوش مصنوعی اغلب به جای قوانین کسب‌وکار (business rules)، مسیرهای منطقی را تست می‌کند. اگر یک جزئیات داخلی کوچک را تغییر دهید، تست‌ها از کار می‌افتند، حتی اگر نتیجه نهایی همچنان درست باشد. این موضوع بازسازی کد (refactoring) را به یک کابوس تبدیل می‌کند.

  2. موارد مرزی سطحی (Shallow edge cases) هوش مصنوعی در تست کردن مقادیر null ،رشته‌های خالی و صفرها خوب است. این‌ها موارد بدیهی هستند. اما او نمی‌تواند «مرزهای دامنه» (domain edges) را پیدا کند. او از باگ‌های خاص منطقه زمانی شما، ویژگی‌های عجیب پایگاه داده یا قوانین منحصربه‌فرد کسب‌وکارتان آگاه نیست.

  3. موک‌های شکننده (Brittle mocks) هوش مصنوعی عاشق mock کردن همه چیز است. این موضوع منجر به دو مشکل می‌شود:

  • موک اشتباه است. این کار نسخه‌ای جعلی از یک API را شبیه‌سازی می‌کند که با واقعیت مطابقت ندارد.
  • موک، پیاده‌سازی را ثابت نگه می‌دارد. این کار به جای تست کردن نتیجه نهایی، نحوه فراخوانی توابع دیگر توسط کد شما را تست می‌کند.

چگونه از هوش مصنوعی به درستی استفاده کنیم:

«هدف» (intent) را از دسترس هوش مصنوعی دور نگه دارید.

  • ابتدا قرارداد را بنویسید. برای هر تست، یک جمله ساده بنویسید. مثال: "کدهای منقضی شده باید مبلغ اصلی را برگردانند."
  • آن جملات را به هوش مصنوعی بدهید. اجازه دهید او assertionها را بنویسد، اما معنای آن‌ها را شما تعیین کنید.
  • در مرزها mock کنید. فقط APIهای خارجی یا پایگاه‌های داده را mock کنید. از نسخه‌های واقعی ماژول‌های داخلی خودتان استفاده کنید.
  • یک مورد مرزی دامنه را دستی بنویسید. هر بار که تابعی را تمام کردید، آن یک موردی که شما را نگران می‌کند یادداشت کنید. از آن به عنوان یک prompt برای هوش مصنوعی استفاده کنید.

هوش مصنوعی یک ابزار بهره‌وری است، نه جایگزینی برای تفکر. از آن برای نوشتن بدنه تست استفاده کنید، اما هرگز اجازه ندهید تصمیم بگیرد که تست قرار است چه چیزی را بررسی کند.

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

Optional learning community: https://t.me/GyaanSetuAi