سود:
- توانایی تولید واحد، ادغام و تست های مورد لبه با ادعای معنادار با هوش مصنوعی
- امکان استخراج سیستماتیک پوشش تست، مقادیر حد و سناریوهای منفی با پشتیبانی هوش مصنوعی
- امکان تأیید اینکه آزمایش های تولید شده توسط هوش مصنوعی واقعاً رفتار را تأیید می کند و فقط کد موجود را تکرار نمی کند
تست مکانیزمی است که ثابت می کند نرم افزار در واقع مطابق وعده عمل می کند. یک مجموعه آزمایشی خوب در عرض چند ثانیه به شما می گوید که آیا تغییر چیزی را می شکند و به مهندس آزادی عمل می دهد تا با اطمینان عمل کند. هوش مصنوعی خستهکنندهترین و نادیده گرفتهشدهترین بخش نوشتن تست را سرعت میبخشد: ایجاد سناریوها، نقاط شکست و موارد منفی. اما یک تله یواشکی در اینجا وجود دارد: هوش مصنوعی ممکن است آزمایش هایی بنویسد که رفتار فعلی (شاید معیوب) کد را تأیید کند، نه رفتار فرضی آن. یا می تواند تست های خالی تولید کند که همیشه قبول می شوند و در واقع چیزی را بررسی نمی کنند. ارزش یک تست در این نیست که آیا آن را قبول می کند، بلکه در این است که آیا چیز درست را بررسی می کند و وقتی اشتباه می کند قرمز می شود.
در این واحد، نحوه تولید آزمون های واحد، ادغام و مورد لبه با ادعاهای معنادار را یاد خواهید گرفت. نحوه استخراج سیستماتیک پوشش تست، نقاط شکست و سناریوهای نزولی. و خواهیم دید که چگونه می توانید بررسی کنید که آزمایش هایی که هوش مصنوعی تولید می کند واقعاً رفتار را تأیید می کند.
مفاهیم: تست واحد: یک تابع/کلاس را به صورت مجزا آزمایش می کند. تست یکپارچه سازی: تست هایی که چندین قسمت به درستی با هم کار می کنند. ادعا: عبارتی که بررسی می کند که آیا نتیجه با آنچه مورد انتظار بود برابر است. این قلب آزمون است. پوشش: چه مقدار از کد توسط تست ها اجرا می شود. پوشش بالا کیفیت را تضمین نمی کند.
تولید تست های معنادار
یک آزمون خوب سه کار را به وضوح انجام می دهد: حالتی را ایجاد می کند، عملی را انجام می دهد، نتیجه را اثبات می کند. هنگام چاپ آزمایشات روی هوش مصنوعی، مشخص کنید که چه رفتاری را می خواهید تأیید کنید و چه سناریوهایی را باید پوشش دهد. در غیر این صورت آزمایش های سطحی تولید می کند که همیشه موفق می شوند.
- رفتار مورد آزمایش را تعریف کنید. "چه چیزی درست به حساب می آید؟" به سوال واضح پاسخ دهید.
- انواع سناریو را بخواهید حالت عادی، حد، منفی، خطا.
- ادعای معنادار وارد کنید. این فقط "خطا را پرتاب نکرد" بلکه "مقدار صحیح را برگرداند".
- صحت آزمایش را بررسی کنید. آیا وقتی شما کد را آگاهانه شکسته اید، تست قرمز می شود؟
درخواست جامع تولید آزمون: "تستهای واحد را برای تابع "اعمال تخفیف(مبلغ، کوپن)" زیر بنویسید. حداقل یک سناریو در دستههای زیر داشته باشید: (1) کوپن معتبر معمولی، (2) نقاط شکست (0 مبلغ، 100٪ تخفیف)، (3) منفی (کوپن نامعتبر، کوپن خطا، مقدار مورد انتظار منفی (4 مورد خطای COTE)). مقدار در هر آزمون (نه فقط "کار شده" نامگذاری کنید. کد قابل خواندن است.
اعلان استخراج مقدار مرزی: "یک تجزیه و تحلیل مقدار مرزی برای ورودی های این تابع انجام دهید. برای هر پارامتر، مقادیر "فقط در مرز"، "فقط در زیر مرز"، "فقط بالای مرز" را به عنوان جدول استخراج کنید. سپس سناریوهای آزمایشی را که این مرزها را پوشش می دهند، فهرست کنید.
احتیاط: پوشش تست بالا (به عنوان مثال 90٪) صحت کد را ثابت نمی کند. پوشش تعداد ردیف های اجرا شده را اندازه گیری می کند. نه اینکه آن خطوط نتیجه درستی را ایجاد کنند. تست بدون ادعای معنی دار پوشش را افزایش می دهد اما چیزی را تضمین نمی کند. محتوای ادعا تعیین کننده کیفیت است نه تعداد ادعاها.
آزمایش خود آزمون: منطق جهش
عملی ترین راه برای درک اینکه آیا آزمایش تولید شده توسط هوش مصنوعی واقعا کار می کند یا خیر، شکستن عمدی کد است (منطق تست جهش). یک شرط را معکوس کنید، یک علامت + ایجاد کنید -; اگر هیچ تستی قرمز نشود، آزمایشات شما در واقع آن رفتار را حفظ نمی کنند.
اعلان شکار آسیبپذیری را آزمایش کنید: "به من بگویید که آزمایشهای زیر کدام اشکالات احتمالی در این کد را پیدا نمیکنند. 5 جهش کوچک را پیشنهاد کنید که میتوان روی کد ایجاد کرد (به عنوان مثال >= به جای >، - به جای +) و برای هر کدام مشخص کنید که آیا آزمایشهای موجود میتوانند آن را پیدا کنند یا خیر. برای آنهایی که شناسایی نشدهاند، آزمایش را پیشنهاد کنید که باید اضافه شود. کد: [cotest]."
اعلان ضعیف / اعلان قوی
ضعیف: "یک آزمایش برای این تابع بنویسید." (نتیجه: معمولاً یک سناریوی خوشحال کننده، ادعای ضعیف؛ خطاها را از دست می دهد.) STRONG: "یک آزمایش برای این تابع "passwordStrong" بنویسید. قانون: حداقل 8 کاراکتر، 1 حرف بزرگ، 1 رقم مورد نیاز است. سناریوهای زیر را به عنوان تست های مجزا پوشش دهید: دقیقا 8 کاراکتر (بدون حروف خالی، بدون حروف خالی)، 7 کاراکتر رشته، فقط فاصله، خیلی طولانی (1000 کاراکتر) به صراحت مقدار درست/نادرست مورد انتظار را در هر آزمون اعلام کنید و نام تست را بر اساس آنچه که بررسی می کند، نامگذاری کنید."
اعلان قدرتمند قوانین و سناریوهای مرزی کامل را ارائه می دهد. جفت های مرزی مانند "دقیقاً 8/7 کاراکتر" رایج ترین مکان ها برای اشتباه هستند (گیج کننده > با >=). اعلان ضعیف این مرزها را دور می زند و خطا را به تولید می رساند.
انواع تست و محل استفاده
نوع تست
چه چیزی را تایید می کند؟
سهم هوش مصنوعی
توجه
واحد
تک عملکرد/کلاس
چند سناریو را به سرعت تولید می کند
ادعای معنادار مورد نیاز است
ادغام
قطعات با هم کار می کنند
سناریو و پیش نویس داده های ساختگی
رفتار اعتیادآور واقعی
پایان/پذیرفتن
کل جریان کاربر
فهرست قدم و انتظارات
مستعد شکنندگی
رگرسیون
خطای قدیمی باز نمی گردد
تست خاص خطا
باید به هر اصلاحی اضافه شود
موارد کوچک
مورد 1 - آزمونی که همیشه موفق می شود. هوش مصنوعی 12 تست را روی یک تابع می نویسد و همه آنها قبول می شوند. مهندس مشکوک می شود و عمداً مقدار بازگشتی تابع را تحریف می کند. فقط 3 تا از تست ها قرمز می شوند. 9 آزمون دیگر حاوی ادعاهای معنادار نیستند. آزمایش با شکار جهش تقویت می شود. حفاظت واقعی در 9 سناریو به دست می آید.
مورد 2 - خطای مرزی. تابع تأیید سن باید بگوید "18 و بالاتر معتبر است" اما > 18 نوشته شده است، به این معنی که سن 18 رد می شود. این خطا بلافاصله در آزمایش نشان داده می شود زیرا هوش مصنوعی سناریوی "دقیقا 18" را از طریق تجزیه و تحلیل نقطه شکست ایجاد می کند. یک آزمایش حد از هرگونه شکایت واقعی کاربر جلوگیری می کند.
مورد 3 - اصلاح رفتار فعلی. وقتی به هوش مصنوعی گفته میشود «بر اساس این کد یک آزمایش بنویسد»، آزمایشی را تولید میکند که خطای گرد کردنی را که از قبل در کد وجود دارد، به عنوان «صحیح» میپذیرد. وقتی مهندس تست را بر اساس نیاز (مقدار صحیح مورد انتظار) و نه کد چاپ می کند، تست قرمز می شود و خطای واقعی رخ می دهد. تست ها باید از انتظارات استخراج شوند نه از کد.
اشتباهات رایج
- ادعای بیهوده "خطا نکرد" کافی نیست. مقدار صحیح باید تایید شود.
- دامنه اشتباه با کیفیت. پوشش بالا تضمینی برای نتایج دقیق نیست.
- چاپ تست با کد خطای فعلی را به "درست" رفع می کند. آزمون ها باید از انتظارات ناشی شود.
- رد شدن از مقادیر حدی گیج کردن > با >= رایج ترین اشتباه است. جفت های مرزی باید آزمایش شوند.
- ممیزی خود آزمون نیست. تستی که با شکستن کد قرمز نمی شود، محافظتی ایجاد نمی کند.
به طور خلاصه
یک مجموعه آزمایشی خوب، کلید ایجاد تغییرات با اطمینان است. هوش مصنوعی به سرعت سناریوها، محدودیتها و موقعیتهای منفی زیادی ایجاد میکند. اما اگر تستها را به جای الزامات از کد استخراج کند، میتواند باگهای موجود را برطرف کند یا آزمایشهای بیمعنی بنویسد که همیشه موفق میشوند. مقدار مورد انتظار مشخص را در هر آزمایش مشخص کنید، جفتهای محدود را در نظر بگیرید و بررسی کنید که آزمایشهای شما واقعاً با شکستن عمدی کد محافظت میکنند. محتوای ادعا، نه تعداد دامنه ها، کیفیت را تعیین می کند.
وظیفه کاربردی
یک تابع را انتخاب کنید و از آن بخواهید تست هایی را در چهار دسته (عادی، محدود، منفی، خطا) با یک اعلان جامع تولید آزمایش ایجاد کند. در هر آزمون مقدار مورد انتظار مشخص شده را بیان کنید. سپس اعلان شکار آسیبپذیری تست را اجرا کنید، 5 جهش کوچک را در کد پیشنهاد دهید و آزمایشها را اجرا کنید تا بررسی کنید کدامها را پیدا کردهاند. یک آزمایش جدید برای حداقل یک جهش که کشف نشده است اضافه کنید و نشان دهید که اکنون در قرمز است.
چک لیست
- [ ] من آزمایش ها را بر اساس رفتار مورد انتظار/درست چاپ کردم، نه کد.
- [ ] من سناریوهای عادی، محدود، منفی و خطا را پوشش دادم.
- [ ] من مقدار مورد انتظار بتن را در هر آزمایش بیان کردم.
- [ ] من جفت حاشیه (فقط بالا-پایین / درست بالا-پایین) را آزمایش کردم.
- [ ] با شکستن عمدی کد، تأیید کردم که تست ها قرمز شده اند.
- [ ] من یک آزمایش جدید برای جهش های کشف نشده اضافه کردم.