Pest v4.5.0: تستهای ناپایدار رو خودکار retry کن
خلاصهٔ کاملتر
Pest v4.5.0 منتشر شد و مهمترین ویژگیاش پشتیبانی مستقیم از تستهای flaky (ناپایدار) هست. تست flaky به تستی میگن که نتیجهاش غیرقطعیه — مثلاً به timing، API خارجی، یا شرایط محیطی وابستهست و گاهی پاس میشه، گاهی نه.
با modifier جدید ->flaky()، وقتی یه تست شکست بخوره Pest بهصورت خودکار تا ۳ بار دوباره اجرا میکنه. میشه تعداد retry رو هم با پارامتر tries تنظیم کرد:
it('sends an email notification', function () {
// ...
})->flaky();
it('resolves within the timeout', function () {
// ...
})->flaky(tries: 5);نکته مهم اینه که lifecycle hook های beforeEach و afterEach بین هر بار retry اجرا میشن، پس state تست درست reset میشه. یه فلگ CLI هم اضافه شده (--flaky) که فقط تستهای علامتخورده رو اجرا میکنه و کمک میکنه تستهای ناپایدار رو جداگانه بررسی کنی.
یه assertion معماری جدید به اسم ->toBeCasedCorrectly() هم اضافه شده که namespace کلاسها رو با مسیر فایلشون مقایسه میکنه. macOS و Windows به کوچک/بزرگبودن حروف حساس نیستن، ولی سرورهای Linux هستن — پس یه اشتباه کوچک مثل App\providers\AppServiceProvider بهجای App\Providers\AppServiceProvider روی سرور خطای «کلاس پیدا نشد» میده. این assertion این مشکل رو در همون مرحله تست لوکال شناسایی میکنه.
آپشن --only-covered هم به دستور --coverage اضافه شده؛ با این گزینه فایلهایی که ۰٪ پوشش دارن از خروجی حذف میشن. در پروژههای بزرگ دیگه لازم نیست از بین انبوه فایلهای بدون coverage دنبال فایلهایی بگردی که تست جدیدت واقعاً پوشش داده.
این نسخه چند باگ مهم هم برطرف کرده: مشکل شناسایی trait های بهارثرسیده، مشکل dataset های تودرتو در حالت موازی، حفظ کاراکترهای Unicode در فیلتر نام فایل، و مشکل پارامترهای نامدار در dataset ها.
نکات کلیدی:
- ->flaky() تست رو در صورت شکست بهطور خودکار retry میکنه (پیشفرض: ۳ بار)
- --flaky فقط تستهای flaky رو اجرا میکنه
- ->toBeCasedCorrectly() اختلاف کوچک/بزرگنویسی namespace و مسیر فایل رو شناسایی میکنه
- --only-covered فایلهای بدون پوشش رو از خروجی coverage مخفی میکنه
- باگهای مربوط به dataset، trait و تست موازی برطرف شدن




