تمام تست‌ها پاس شدند، اما کاربر هنوز نمی‌توانست بازی کند

«API کد 200 OK برمی‌گرداند!»

در اولین شغل مهندسی‌ام با یک مشکل بزرگ روبرو شدم. ارشد‌های من عاشق داشبوردها بودند. آن‌ها عاشق پوشش کد (code coverage) بالا بودند. فکر می‌کردند اگر تست‌ها سبز باشند، یعنی محصول درست کار می‌کند.

آن‌ها اشتباه می‌کردند.

کار کردن کد و رسیدن کاربر به آنچه نیاز دارد، دو موضوع متفاوت هستند. یک دکمه می‌تواند کد موفقیت (success code) برگرداند، در حالی که کاربر را در یک صفحه خراب و گیر کرده باقی بگذارد.

من راهی برای پیدا کردن این بن‌بست‌های UX بدون اجرای اپلیکیشن ساختم. من آن را two-agent static walkthrough می‌نامم. این روش از دو عامل هوش مصنوعی (AI agents) استفاده می‌کند که در یک حلقه با هم گفتگو می‌کنند.

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

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

نوبت ۱: دکمه با شکست مواجه شد. کاربر روی "Generate" کلیک کرد. کد به جای اندپوینت جدید، درخواست را به یک اندپوینت قدیمی و از کار افتاده فرستاد. تست‌ها پاس شدند چون API قدیمی هنوز کار می‌کرد.

نوبت ۲: خلأ غیرقابل‌کلیک. کاربر سعی کرد روی نتیجه کلیک کند. کد، متن را در یک باکس ساده بدون هیچ click handler قرار داده بود. هیچ اتفاقی نیفتاد.

نوبت ۳: مژده‌ی دروغین. کاربر سعی کرد خطا را رفع کند. بک‌اند به دلیل نبودن یک ID شکست خورد. صفحه یک پیام موفقیت سبز نشان داد، در حالی که سیستم از کار افتاده بود.

نوبت ۴: امید نیمه‌تمام. کاربر سعی کرد کد را به صورت دستی کپی کند. API متن را در نیمه راه قطع کرد. کد خراب بود.

کاربر منصرف شد.

بیشتر تست‌های واحد (unit tests) فقط بررسی می‌کنند که آیا یک endpoint کد ۲۰۰ برمی‌گرداند یا خیر. آن‌ها بررسی نمی‌کنند که آیا کاربر واقعاً به هدف خود می‌رسد یا نه.

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

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

این روش استاتیک و ارزان است. این کار حتی قبل از اینکه یک single test fixture بنویسید، انجام می‌شود. این روش «کار کردن کد» را به «موفقیت کاربر» تبدیل می‌کند.

Source: https://dev.to/terum/every-test-passed-the-user-still-couldnt-play-the-game-388o

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