Vitest ۵ منتشر شد؛ سریعتر و با ابزارهای دیباگ جدید
خلاصهٔ کاملتر
تیم Vitest برای این نسخه یه مجموعه بنچمارک واقعی به اسم vitest-dev/benchmarks ساخته، از یه پکیج کوچیک ۵ فایلی تا یه مونولیت سازمانی با ۱۲۸۰ ماژول، و روی حالتهای مختلف اجرا (forks، threads، vmForks، vmThreads) و محیطهای مختلف (node، jsdom، happy-dom، Browser Mode) تستش کرده. نتیجه: تو مونولیت بزرگ زمان اجرا از ۷.۲۴ ثانیه به ۵.۸۳ ثانیه (۱۹ درصد کمتر) رسیده، و تو یه پروژهی پر از وابستگی حتی تا ۵۳ درصد سریعتر شده.
دلیل این سرعت چند تغییره: پروژههای تعریفشده تو test.projects حالا سرور Vite رو با هم به اشتراک میذارن، کش ماژولها (fsModuleCache) روی دیسک پایدار میمونه و بین اجراهای مختلف دوباره استفاده میشه، رفتوبرگشت بین پردازش اصلی و workerها کمتر شده، و pool های vmThreads/vmForks کد کامپایلشده رو بین context ها دوباره استفاده میکنن.
یه قابلیت تازه به اسم Trace View هم به Browser Mode اضافه شده: وقتی روشنش کنی، Vitest هر تعامل و assertion رو بهشکل یه snapshot از DOM ضبط میکنه و بعداً میتونی قدمبهقدم برشون گردونی، حتی بعد از اینکه مرورگر از اون صفحه رد شده. این تو Vitest UI و گزارش HTML هم در دسترسه و برای پیدا کردن دلیل خرابی تستهای CI خیلی کاربردیه.
یه API جدید به اسم vi.when هم اومده که تعریف رفتار متفاوت برای هر ورودی یه mock رو ساده میکنه، بدون اینکه لازم باشه دستی تو mockImplementation شرط بذاری. آرگومانها با تطبیق کامل مقایسه میشن و matcherهای نسبی مثل expect.any() هم پشتیبانی میشن.
const findById = vi.fn()
vi.when(findById)
.calledWith(1).thenResolve({ id: 1, name: 'Ella' })
.calledWith(2).thenResolve({ id: 2, name: 'Gracie' })
.calledWith(expect.any(Number)).thenReject(new Error('not found'))با این تعریف، findById(1) جواب Ella رو برمیگردونه، findById(2) جواب Gracie، و هر عددی غیر از این دوتا هم با خطای not found رد میشه. رفتارها رو میشه با thenReturnOnce یا گزینهی times محدود کرد، و assertion تازهی toHaveBeenExhausted چک میکنه همهی رفتارهای تعریفشده واقعاً استفاده شدن یا نه.
چند تغییر دیگه هم تو این نسخه هست: پروژههای تودرتو حالا بهطور پیشفرض تنظیمات ریشه رو ارث میبرن، وقتی یه لوکیتور تو Browser Mode چیزی رو پیدا نکنه، خروجی خطاش درخت ARIA (که کوتاهتر و خواناتر از HTML خامه) رو هم نشون میده، تایمرهای fake حالا Temporal رو هم مثل Date موک میکنن، و assertion های async مثل resolves و rejects اگه await نشن دیگه فقط warning نمیدن، تست رو fail میکنن.
نکات کلیدی:
- تو مونولیت بزرگ با ۱۲۸۰ ماژول، زمان اجرا از ۷.۲۴ به ۵.۸۳ ثانیه (۱۹٪ کمتر) رسیده؛ بعضی پروژهها تا ۵۳٪ سریعتر شدن
- Trace View جدید تعاملهای Browser Mode رو بهشکل قابلبازپخش ضبط میکنه
- vi.when رفتار mock رو بر اساس آرگومانهای ورودی تعریف میکنه
- assertion های async الان اگه await نشن، تست رو fail میکنن نه فقط warning




