واحد 10 / 11

تست ریسک اعتماد کاذب، کیفیت تست و تست جهش: تست های تست

سود:

  • توانایی تشخیص سه چهره اعتماد کاذب (غیر قاطعانه، ابراز وجود، ادعای بی اهمیت) و اعمال پادزهر
  • امکان استفاده از تست جهش و امتیاز جهش به عنوان معیار دقیق تری از کیفیت نسبت به درصد پوشش توسط ابزار یا دست
  • امکان قرار دادن هوش مصنوعی به عنوان یک تیم قرمز در برابر آزمایش و شکار حفره های آزمایشی بدون افتادن در دام ستایش

در قلب این ماژول یک هشدار مکرر وجود دارد: یک پنل آزمایشی درخشان سبز دلیلی بر کیفیت نیست. اگر آزمایشات شما به شما اطمینان می دهد، باید بدانید که آیا این اطمینان واقعی است یا ساختگی. در عصر هوش مصنوعی (AI)، این سوال مهم‌تر از همیشه است، زیرا هوش مصنوعی در تولید تست‌های روان، صاف اما توخالی ماهر است. اعتماد به نفس کاذب - باور درست بودن نرم افزار به دلیل سبز بودن تست ها، در حالی که در واقع تست ها هیچ چیزی را تایید نمی کنند - خطرناک ترین چیزی است که می تواند برای یک تیم QA اتفاق بیفتد. زیرا پنهان نمی کند که هیچ خطایی وجود ندارد، بلکه شما نمی توانید خطاها را ببینید. این واحد فلسفه اعتبار سنجی کل ماژول را در یک رشته گرد هم می آورد: آزمایش تست های شما.

استاندارد طلایی برای اندازه گیری کیفیت آزمایش: آزمایش جهش

قوی ترین راه برای درک اینکه آیا آزمون واقعاً محافظت می کند یا خیر، آزمایش جهش است (تست جهش - تکنیکی که تحریف/جهش های کوچک عمدی را در کد منبع ایجاد می کند و اندازه گیری می کند که آیا آزمایش ها این اعوجاج ها را تشخیص می دهند). منطق ساده است: اگر شما عمداً کد را بشکنید (یک + را به -، یک > را به >=، یک درست را به نادرست تبدیل کنید)، یک مجموعه آزمایشی خوب باید آن فساد را شناسایی کرده و قرمز شود. اگر اینطور نیست، این اختلال یک جهش یافته باقی مانده است - بنابراین آزمایشات شما در واقع آن رفتار را حفظ نمی کند.

امتیاز جهش = جهش کشته شده / جهش کل. بسته ای با پوشش خط 90 درصد ممکن است دارای امتیاز جهش 40 درصد باشد. این نشان می دهد که خطوط کار می کنند اما رفتار تأیید نشده است. امتیاز جهش معیار بسیار صادقانه تری برای کیفیت نسبت به پوشش درصد است.

نکته: ابزارهای جهش خودکار (PIT/Pitest برای جاوا، Stryker برای JavaScript/TypeScript، Stryker.NET برای NET، mutmut برای Python) وجود دارد. اینها به طور خودکار صدها جهش را تولید و آزمایش می کنند. اگر ابزاری ندارید، حتی روش دستی «تست کد شکستن» برای توابع حیاتی بسیار ارزشمند است.

سه چهره اعتماد کاذب و پادزهر آن

شکل شبه اعتماد

علامت

پادزهر

تست بدون ادعا

کد کار می کند، هیچ چیز تایید نشده است

ادعای واقعی در هر آزمون؛ تست با جهش

تست خود تاییدی

مورد انتظار = خروجی کد

مقدار مورد انتظار را به طور مستقل محاسبه کنید

ادعای بی اهمیت

"تهی نیست"، "200 بازگشته"

اعتبار قانون تجارت/نتیجه واقعی

مغالطه با دامنه بالا

خطوط 90٪، حفاظت کم

به امتیاز جهش نگاه کنید

تحمل تست شکننده

"دوباره گیر کرده، بگذر"

علت اصلی + آزمایش قطعی

استفاده از هوش مصنوعی به عنوان "تیم قرمز"

هوش مصنوعی هم می تواند اعتماد شبه ایجاد کند و هم متحد قدرتمندی در شکار آن باشد. از هوش مصنوعی به‌عنوان یک تیم قرمز در برابر آزمایش‌های خود استفاده کنید: بپرسید «کدی بنویسید که این تست‌ها را با موفقیت پشت سر بگذارد اما اشتباه است» یا «یک براندازی پیدا کنید که این تست‌ها را فریب دهد». اگر هوش مصنوعی حفره هایی را در آزمایشات شما پیدا کند، این حفره ها خطرات واقعی هستند.

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

جهش های معادل و حدود امتیاز

تست جهش قدرتمند است، اما یک نکته مهم دارد: برخی جهش‌ها به هیچ وجه رفتار کد را تغییر نمی‌دهند. اینها جهش‌های معادل نامیده می‌شوند (جهش معادل - کد خراب، جهشی که دقیقاً همان نتیجه اصلی را ایجاد می‌کند). به عنوان مثال، تغییر مقدار اولیه متغیری که هرگز استفاده نمی شود، بر خروجی تأثیر نمی گذارد. هیچ آزمایشی نمی تواند و نباید این را بگیرد. بنابراین، نمره جهش 100٪ اغلب در عمل دست نیافتنی است و هدف نیست. از بین بردن جهش های معادل با دست کار فشرده ای است. بنابراین نمره جهش را به عنوان یک نمره امتحان مطلق نخوانید، بلکه به عنوان یک شاخص صادقانه از "آیا آزمون های من واقعا محافظت می کنند؟"

رویکرد عملی این است: به جای اجرای مداوم آزمایش جهش در کل پایه کد، آن را روی ماژول هایی اجرا کنید که دارای بالاترین خطر و پیچیده ترین قوانین تجاری هستند. جهش های باقی مانده در این ماژول ها را یک به یک بررسی کنید. اگر شکاف واقعی است، یک آزمایش اضافه کنید. اگر یک جهش معادل است، آن را با توجیه علامت گذاری کنید و پاس کنید. هوش مصنوعی می‌تواند غربالگری اولیه را برای ارزیابی اینکه آیا یک جهش باقی‌مانده معادل است انجام دهد. اما تصمیم نهایی توسط شما گرفته می شود که می دانید کد چه کاری انجام می دهد.

احتیاط: آزمایش جهش از نظر محاسباتی گران است (همه آزمایش‌های مربوطه برای هر جهش دوباره اجرا می‌شوند). بنابراین یک استراتژی معمول و معقول این است که آن را به‌عنوان یک بررسی عمیق هفتگی یا پیش از انتشار برای ماژول‌های حیاتی زمان‌بندی کنید، نه هر ادغام.

اعلان ضعیف / اعلان قوی

ضعیف: "آیا آزمایشات من کافی است؟"
Strong: "به عنوان یک تیم قرمز برای این تابع و مجموعه آزمایشی عمل کنید. (1) 8 جهش در کد ایجاد کنید که می تواند کشته شود (جایگزینی عملگر، تغییر مرز، وارونگی شرط، جایگزینی مقدار بازگشتی). (2) برای هر جهش، مشخص کنید کدام یک از تست های موجود آن را پیدا می کند و کدام یک نمی تواند. (3) همچنین برای هر جهش، یک آزمایش جدید بنویسید. یک نمونه کد که همه این تست ها را با موفقیت پشت سر می گذارد، اما قانون تجاری را نقض می کند: [paste]"

اعلان قدرتمند؛ هوش مصنوعی را به‌عنوان یک آزمایش‌کننده آزمایش‌کننده، نه یک ماشین ستایش، قرار می‌دهد.

چهار قالب قابل کپی

1) کنترل دستی جهش:

8 جهش قابل توجه (اختلال عمدی جزئی) برای این کد ایجاد کنید: جایگزینی عملگر حسابی، حد مقایسه (> در مقابل >=)، وارونگی منطقی، جایگزینی بازگشت / ثابت، رد شدن شرط. برای هر جهش، پیش‌بینی کنید که کدام یک از آزمایش‌های موجود آن را پیدا می‌کند یا خیر. کد+تست: [چسباندن]

2) کشتن جهش زنده:

گزارش آزمایش جهش زیر حاوی جهش‌های باقی‌مانده (غیر کشف‌شده) است: [list/report]. برای هر کدام، یک تست حداقلی بنویسید که آن جهش را از بین ببرد (کد وقتی به این ترتیب شکسته شود قرمز می شود). در مورد اینکه تست چه رفتاری را تایید می کند نظر دهید.

3) تیم قرمز - آزمایش خون:

آیا می‌توانید کدی بنویسید که همه آزمایش‌های زیر را با موفقیت پشت سر بگذارد، اما قانون تجاری زیر را نقض کند: [قانون تجاری]. اگر چنین است، کدام خلأ در این آزمایش‌ها این اجازه را می‌دهد؟ آزمایشی را اضافه کنید که این حفره را می بندد. تست ها: [چسباندن]

4) بازرسی کیفیت تست:

این مجموعه آزمایشی را از نظر کیفیت بررسی کنید. برای هر آزمون علامت بزنید: - آیا یک ادعای واقعی وجود دارد یا دارای ویژگی است؟ - آیا مقدار مورد انتظار مستقل است که از کد مشتق شده است؟ - آیا این قانون تجارت یا چیزی بی اهمیت را تأیید می کند؟ در نهایت یک "امتیاز ادعای واقعی" و 3 تست ضعیف را ارائه دهید. تست ها: [چسباندن]

سه کیف کوچک

مورد 1 - پوشش 92٪، امتیاز جهش 38٪. یک تیم به پوشش بالایی متکی بود. هنگامی که آزمایش جهش با Stryker انجام شد، امتیاز 38٪ بود: بیشتر جهش های تولید شده زنده ماندند. این گواه بر این بود که آزمایش‌ها خطوط را اجرا نمی‌کردند و رفتار را تأیید نمی‌کردند. تیم سه هفته روی کیفیت تست سرمایه گذاری کرد. امتیاز جهش به 81 درصد افزایش یافت و دو خطای محاسباتی واقعی توسط این آزمایش‌های تقویت‌شده در نسخه بعدی مشاهده شد.

مورد 2 - هوش مصنوعی آزمون را فریب داد. با یک الگوی "تیم قرمز"، یک متخصص از هوش مصنوعی کدی درخواست کرد که آزمایش‌های موجود را گذرانده اما قانون تخفیف را نقض کرده است. هوش مصنوعی کدی را نوشت که همیشه یک تخفیف صفر برمی‌گرداند - و همه آزمایش‌ها سبز باقی ماندند زیرا هیچ آزمایشی ارزش واقعی تخفیف را تأیید نمی‌کرد. شکاف مشاهده شد، ادعاهای واقعی اضافه شد.

مورد 3 - تله ستایش. یک آزمایش کننده جوان از هوش مصنوعی پرسید: "آیا تست های من خوب است؟" و با شنیدن پاسخ "بسیار جامع" خیالم راحت شد. همکار ارشد او همین آزمایش ها را با استفاده از الگوی "ممیزی کیفیت تست" ممیزی کرد. معلوم شد که 12 تست از 20 تست دکور (بدون ادعا یا آشغال) بوده است. سوال درست جواب درست را به ارمغان آورد.

اشتباهات رایج

  • اشتباه در زمینه کیفیت تکیه بر پوشش ردیف بالا و نگاه نکردن به نمره جهش.
  • اعتماد به ستایش هوش مصنوعی. پرسیدن "آیا تست های شما خوب است؟" و پاسخ مثبت را به عنوان اطمینان در نظر گرفتن.
  • استخراج مقدار مورد انتظار از کد تست های خود تأییدی که کد معیوب را تأیید می کند.
  • به اظهارات بی اهمیت بسنده کنید. چک هایی که قاعده واقعی را تایید نمی کنند، مانند "عدم تهی"، "200 بازگشت".
  • نادیده گرفتن جهش های باقی مانده نادیده گرفتن آنچه در گزارش جهش یافت نشد.
  • حتی تلاشی برای جهش دستی کدهای حیاتی ندارید. در صورت در دسترس نبودن ابزار، از مرحله "شکستن کد و تست" صرفنظر کنید.

به طور خلاصه

اعتماد کاذب این است که معتقد باشد نرم افزار درست است زیرا تست ها سبز هستند. در حالی که آزمایش ها ممکن است چیزی را تایید نکنند. استاندارد طلایی برای اندازه‌گیری این، آزمایش جهش است: شکستن عمدی کد و اندازه‌گیری اینکه آیا آزمایش‌ها آن را می‌گیرند یا خیر. امتیاز جهش معیار بسیار صادقانه تری برای کیفیت نسبت به پوشش درصد است. هوش مصنوعی هم اعتماد کاذب ایجاد می کند و هم به یک تیم قرمز قدرتمند در شکار آن تبدیل می شود - بپرسید "یک اشکال تولید کنید که این تست ها را با موفقیت پشت سر بگذارد." تست های خود را آزمایش کنید: ادعای واقعی، ارزش مورد انتظار مستقل، اعتبار سنجی قوانین تجاری و جهش های کشته شده.

وظیفه کاربردی

یک تابع حاوی یک قانون تجاری و آزمایشات آن را از پروژه خود وارد کنید. در صورت امکان، ابزار جهش (Stryker/Pitest/mutmut) را اجرا کنید و امتیاز جهش را اندازه بگیرید. اگر ابزاری وجود ندارد، حداقل 8 جهش را با الگوی "کنترل جهش دستی" ایجاد کنید و آنها را به صورت دستی امتحان کنید. برای هر جهش باقیمانده، یک آزمایش جدید با الگوی "کشتن جهش زنده" بنویسید. در نهایت، با الگوی «تیم قرمز»، ببینید آیا هوش مصنوعی می‌تواند کدی تولید کند که آزمایش‌های شما را فریب دهد. امتیاز جهش شروع و پایان خود را گزارش دهید (یا میزان جهش یافت شده/کل).

چک لیست

  • [ ] من کیفیت آزمایش را با نمره جهش ارزیابی کردم، نه پوشش.
  • [ ] من آزمایش جهش (به صورت ابزاری یا دستی) را برای کد بحرانی انجام دادم.
  • [ ] من برای هر جهش باقیمانده آزمایشات جدیدی نوشتم.
  • [ ] من از هوش مصنوعی به عنوان تیم قرمز استفاده کردم و در آزمایشات خود به دنبال نقاط ضعف بودم.
  • [ ] من ستایش هوش مصنوعی "تست های شما خوب هستند" را به عنوان اطمینان تلقی نکردم.
  • [ ] بررسی کردم که هر آزمون ادعای واقعی، ارزش مورد انتظار مستقل و قانون تجاری را تأیید می کند.