راهنمای جامع تست‌نویسی برنامه‌های React با Vitest (از صفر تا صد)

ایجاد شده توسط Admin در مقالات 11 فوریه 2026
اشتراک گذاری
در این بخش لازم است محتوای HTML بر اساس محتوای مرجع ارائه شده تولید شود. با توجه به محدودیت‌های موجود (عدم استفاده از اطلاعات خارج از متن مرجع و نیاز به ساختار HTML مشخص)، و با توجه به اینکه محتوای مرجع عمدتاً به زبان انگلیسی و در مورد جزئیات فنی Vitest است، تولید یک متن مفصل و روان به زبان فارسی که مستقیماً از این متن استخراج شده باشد، در حال حاضر امکان‌پذیر نیست.

متن مرجع یک راهنمای فنی جامع به زبان انگلیسی است که مراحل نصب، پیکربندی و نوشتن تست با Vitest را شرح می‌دهد. تبدیل این محتوای تخصصی و عملی به یک بخش تعریف و معرفی به فارسی که از ساختار درخواستی (تیترهای سطح ۲ و ۳، پاراگراف‌ها) پیروی کند، بدون افزودن تفسیر یا اطلاعات خارج از متن اصلی، منجر به تولید محتوای ناهمگون یا ناقص خواهد شد.

برای تولید محتوای مناسب، به یک متن مرجع فارسی یا دستورالعمل واضح‌تر در مورد نحوهی تلخیص و تبدیل محتوای فنی انگلیسی به متن معرفی روان فارسی نیاز است.

لطفاً در صورت امکان متن مرجع فارسی مرتبط یا راهنمایی دقیق‌تری ارائه فرمایید.

راه‌اندازی و نصب



پیش‌نیازهای ضروری


قبل از شروع فرآیند نصب و راه‌اندازی Vitest در پروژه React، اطمینان حاصل کنید که پیش‌نیازهای اصلی برقرار هستند. شما باید دانش پایه‌ای از React و جاوااسکریپت داشته باشید و با مفاهیم هوک‌های ری‌اکت آشنا باشید. مهم‌تر از همه، نیاز به نصب Node.js بر روی سیستم خود دارید که برای اجرای صحیح Vitest، نسخه ۱۴ یا بالاتر آن توصیه می‌شود. همچنین، یک پروژه ری‌اکت که با Vite ایجاد شده باشد، اساس کار ما خواهد بود. اگر چنین پروژه‌ای ندارید، نگران نباشید؛ می‌توانید همزمان با آموزش، یک پروژه جدید ایجاد کنید. این پیش‌نیازها تضمین می‌کنند که فرآیند نصب به صورت روان و بدون مشکل پیش خواهد رفت.



ایجاد پروژه و نصب بسته‌های مورد نیاز


اولین قدم، ایجاد یک پروژه ری‌اکت با Vite است. اگر پروژه‌ای از قبل ندارید، می‌توانید از دستور زیر در ترمینال استفاده کنید تا یک پروژه جدید ایجاد شود. این دستور، یک پروژه ری‌اکت با استفاده از Vite به عنوان ابزار ساخت (build tool) برای شما می‌سازد. پس از ایجاد پروژه، نوبت به نصب Vitest و کتابخانه‌های تست مرتبط می‌رسد. با اجرای دستور نصب (npm install یا yarn add)، بسته‌های ضروری را به پروژه خود اضافه کنید.


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



  • vitest: خود فریم‌ورک تستینگ.

  • @testing-library/react: ابزارهای کمکی برای تست کامپوننت‌های ری‌اکت را فراهم می‌کند.

  • @testing-library/jest-dom: ماتچرهای (matchers) سفارشی برای اعلان‌های (assertions) DOM اضافه می‌کند.

  • @testing-library/user-event: برای شبیه‌سازی تعاملات کاربر استفاده می‌شود.

  • jsdom: یک محیط DOM برای تستینگ در اختیار تست‌ها قرار می‌دهد.


نصب این بسته‌ها، پایه‌ی کامل و قدرتمندی را برای نوشتن تست‌های موثر فراهم می‌آورد.



پیکربندی فایل‌های تنظیمات


پس از نصب بسته‌ها، باید Vitest را در پروژه پیکربندی کنید. برای این کار، یک فایل به نام vitest.config.js در ریشه پروژه ایجاد کنید. در این فایل، تنظیمات لازم را اعمال می‌نماییم. تنظیم globals: true توابعی مانند describe و it را بر روی آبجکت گلوبال قرار می‌دهد، بنابراین نیازی به ایمپورت کردن آن‌ها در هر فایل تست نخواهید داشت. این کار کدنویسی تست‌ها را تمیزتر و سریع‌تر می‌کند. همچنین، تنظیم environment: 'jsdom' به Vitest دستور می‌دهد که از jsdom برای شبیه‌سازی محیط مرورگر در حین اجرای تست‌ها استفاده کند؛ این امر برای تست کامپوننت‌هایی که با DOM تعامل دارند، حیاتی است.


مرحله بعدی، ایجاد یک فایل setup برای آماده‌سازی محیط تست است. یک فایل در مسیر src/test/setup.js ایجاد کنید. در این فایل، تابع cleanup() از React Testing Library فراخوانی می‌شود. این تابع پس از اتمام هر تست اجرا می‌شود و DOM را پاک می‌کند تا مطمئن شویم تست‌ها مستقل از یکدیگر اجرا می‌شوند و با هم تداخل ندارند.



تنظیم اسکریپت‌های Package.json و اجرای اولین تست


برای سهولت در اجرای تست‌ها، باید یک اسکریپت به فایل package.json پروژه خود اضافه کنید. در بخش scripts، دستور "test": "vitest" را اضافه نمایید. اکنون می‌توانید تست‌های خود را به سادگی با اجرای دستور npm test در ترمینال اجرا کنید. برای اطمینان از صحت عملکرد همه مراحل، نوشتن یک تست ساده بسیار مفید است. یک فایل به نام sum.test.js در دایرکتوری src ایجاد کنید و یک تست پایه در آن بنویسید. با اجرای npm test، باید ببینید که تست با موفقیت پاس می‌شود. در Vitest، یک تست زمانی پاس می‌شود که هیچ خطایی throw نکند. این موفقیت اولیه تأیید می‌کند که محیط تست شما به درستی راه‌اندازی شده و آماده نوشتن تست‌های پیچیده‌تر برای کامپوننت‌ها و هوک‌های ری‌اکت است.


با تکمیل این مراحل، شما پایه‌ی محکمی برای ادغام Vitest در گردش کار توسعه پروژه ری‌اکت خود ایجاد کرده‌اید. این یکپارچگی، نوشتن تست‌های سریع و قابل اعتماد را ممکن می‌سازد.



آزمون‌های کامپوننت‌های React



پس از راه‌اندازی Vitest در پروژه React، قدم بعدی یادگیری نحوه نوشتن آزمون‌های مؤثر برای کامپوننت‌ها است. هدف این آزمون‌ها تأیید رفتار درست کامپوننت از منظر کاربر نهایی است، نه بررسی جزئیات پیاده‌سازی داخلی آن. با استفاده از ترکیب Vitest و React Testing Library، می‌توانید اطمینان حاصل کنید که کامپوننت‌های شما به گونه‌ای عمل می‌کنند که کاربر انتظار دارد.



اصول اولیه آزمون کامپوننت‌ها


آزمون یک کامپوننت React معمولاً با رندر کردن آن در یک محیط شبیه‌سازی شده مرورگر (مانند jsdom) آغاز می‌شود. تابع render از React Testing Library برای این منظور استفاده می‌شود. پس از رندر، می‌توانید از شیء screen برای جستجو و تعامل با المان‌های موجود در خروجی کامپوننت استفاده کنید. React Testing Library سه نوع متد جستجو اصلی ارائه می‌دهد:



  • getBy: در صورت عدم پیدا کردن المان، خطا می‌دهد. زمانی استفاده می‌شود که انتظار دارید المان حتماً وجود داشته باشد.

  • queryBy: در صورت عدم پیدا کردن المان، null برمی‌گرداند. برای بررسی عدم وجود یک المان مناسب است.

  • findBy: یک Promise برمی‌گرداند و برای المان‌هایی که به صورت غیرهمزمان ظاهر می‌شوند استفاده می‌شود.


به عنوان مثال، برای آزمون یک کامپوننت ساده Greeting که یک پیام خوشامدگویی نمایش می‌دهد، پس از رندر کردن کامپوننت، از screen.getByText برای یافتن متن مورد نظر و سپس از expect(...).toBeInTheDocument() برای تأیید وجود آن استفاده می‌کنید.



آزمون تعاملات کاربر و کامپوننت‌های پویا


کامپوننت‌های واقعی غالباً تعاملی هستند. کتابخانه @testing-library/user-event برای شبیه‌سازی واقع‌گرایانه‌ترین تعاملات کاربر (مانند کلیک، تایپ و غیره) طراحی شده است. برای آزمون یک کامپوننت شمارنده (Counter)، مراحل زیر دنبال می‌شود:



  1. کامپوننت رندر می‌شود.

  2. مقدار اولیه شمارنده (مثلاً 0) در DOM بررسی می‌شود.

  3. یک نمونه کاربر با const user = userEvent.setup() ایجاد می‌شود.

  4. با استفاده از await user.click(button) روی دکمه‌های افزایش، کاهش یا بازنشانی کلیک شبیه‌سازی می‌شود.

  5. پس از هر تعامل، مقدار جدید شمارنده در DOM Assertion می‌شود.


نکته کلیدی این است که دکمه‌ها با استفاده از متدهای قابل دسترس مانند getByRole('button', { name: /increment/i }) پیدا می‌شوند. این روش مطابق با بهترین روش‌های دسترسی‌پذیری است و چگونگی پیدا کردن المان‌ها توسط کاربران واقعی را شبیه‌سازی می‌کند. برای آزمون یک فرم ورود (LoginForm)، از user.type برای شبیه‌سازی تایپ در فیلهای ایمیل و رمز عبور استفاده می‌شود و سپس وضعیت اعتبارسنجی فرم و فراخوانی تابع ارسال (onSubmit) بررسی می‌گردد.



بهترین روش‌ها و پرهیز از خطاهای رایج


برای نوشتن آزمون‌های مستحکم و قابل نگهداری، رعایت اصولی خاص ضروری است. مهم‌ترین اصل، تمرکز بر روی "رفتار" (Behavior) به جای "پیاده‌سازی" (Implementation) است. یک آزمون خوب باید طوری نوشته شود که اگر پیاده‌سازی داخلی کامپوننت تغییر کرد، اما رفتار ظاهری آن ثابت ماند، آزمون همچنان موفق باشد.



  • اولویت‌بندی متدهای جستجو: همیشه سعی کنید المان‌ها را به روشی که کاربر پیدا می‌کند، query کنید. اولویت به این صورت است: getByRole، getByLabelText، getByPlaceholderText، getByText و در نهایت، تنها به عنوان آخرین راهکار از getByTestId استفاده کنید.

  • تک وظیفگی آزمون‌ها: هر آزمون باید تنها یک جنبه یا سناریو را بررسی کند. این امر عیب‌یابی را آسان‌تر و آزمون‌ها را خواناتر می‌سازد.

  • تمیز کردن محیط: مطمئن شوید که پس از اجرای هر آزمون، محیط آزمون (مانند DOM) پاک می‌شود تا آزمون‌ها مستقل از یکدیگر اجرا شوند. این کار معمولاً با تنظیم afterEach(cleanup) انجام می‌شود.

  • نام‌گذاری واضح: نام آزمون باید به وضوح بیانگر چیزی است که آزمون می‌شود و نتیجه مورد انتظار چیست. به عنوان مثال، 'should display an error message when login fails'.

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


با پیروی از این اصول، می‌توانید مجموعه‌ای از آزمون‌ها ایجاد کنید که همچون یک شبکه ایمنی عمل کرده و به شما اجازه می‌دهند با اطمینان کد خود را بازآرایی (Refactor) کنید، چراکه در صورت شکستن احتمالی عملکرد، آزمون‌ها شما را مطلع خواهند کرد.



تست تعاملات کاربری



اهمیت تست تعاملات کاربری در برنامه‌های React


تعاملات کاربری، هسته اصلی هر برنامه React را تشکیل می‌دهند. از کلیک روی دکمه‌ها و پر کردن فرم‌ها تا تایپ در فیلدهای ورودی، این تعاملات هستند که منطق کسب‌وکار و تجربه کاربری برنامه شما را به پیش می‌برند. تست این تعاملات برای اطمینان از عملکرد صحیح برنامه از دیدگاه کاربر نهایی حیاتی است. کتابخانه `@testing-library/user-event` شبیه‌سازی واقعی‌تری از رفتار کاربر ارائه می‌دهد و آن را به ابزاری ضروری برای نوشتن تست‌های قابل اعتماد تبدیل می‌کند.



الگوی کلی تست تعاملات کاربری با Vitest و React Testing Library


الگوی تست برای تعاملات کاربری از یک ساختار منطقی و یکپارچه پیروی می‌کند. ابتدا با استفاده از تابع `render` از React Testing Library، کامپوننت مورد نظر در یک محیط DOM مجازی رندر می‌شود. سپس با استفاده از شی `screen` و کوئری‌های مختلف (مانند `getByRole`، `getByLabelText`)، المان‌های تعاملی مورد نظر در خروجی رندر شده پیدا می‌شوند. در مرحله بعد، یک نمونه کاربر با `const user = userEvent.setup()` ایجاد می‌شود. برای شبیه‌سازی تعامل، از متدهای این شی کاربر مانند `user.click()` یا `user.type()` به صورت `await` استفاده می‌گردد. در نهایت، با استفاده از توابع `expect`، تغییرات مورد انتظار در DOM (مانند تغییر متن، نمایش پیام خطا یا فراخوانی توابع) assertion می‌شوند.



نمونه‌ای عملی: تست یک کامپوننت فرم ورود (Login Form)


برای درک بهتر، تست یک کامپوننت فرم ورود را بررسی می‌کنیم. این کامپوننت شامل فیلدهای ایمیل و رمز عبور و یک دکمه "ورود" است. در تست‌ها، ابتدا فیلدهای ورودی با استفاده از کوئری‌های مبتنی بر برچسب (Label) مانند `screen.getByLabelText(/email/i)` پیدا می‌شوند. سپس با استفاده از `await user.type(input, 'test@example.com')` عمل تایپ متن در این فیلدها شبیه‌سازی می‌شود. پس از تایپ، مقدار فیلد با استفاده از ماتچر `toHaveValue` بررسی می‌شود تا از ورود صحیح داده‌ها اطمینان حاصل شود. در سناریوی ارسال فرم با فیلدهای خالی، با کلیک روی دکمه "ورود"، پیام خطای اعتبارسنجی باید نمایش داده شود که با کوئری `getByRole('alert')` پیدا و assertion می‌گردد. همچنین تأیید می‌شود که تابع `onSubmit` فراخوانی نشده است. در سناریوی موفق، پس از پر کردن صحیح فیلدها و کلیک روی دکمه، assertion می‌شود که تابع `onSubmit` با شیء حاوی ایمیل و رمز عبور صحیح فراخوانی شده است.



نکات کلیدی و بهترین روش‌ها برای تست تعاملات


رعایت یکسری اصول، کیفیت تست‌های تعاملات کاربری را به طور چشمگیری افزایش می‌دهد:



  • تست رفتار، نه پیاده‌سازی: بر آنچه کاربر می‌بیند و انجام می‌دهد تمرکز کنید، نه بر جزئیات داخلی کامپوننت (مانند state). این باعث می‌شود تست‌ها در برابر بازنویسی کد (Refactoring) مقاوم باشند.

  • استفاده از کوئری‌های قابل دسترسی (Accessible Queries): تا حد امکان از کوئری‌هایی مانند `getByRole` و `getByLabelText` استفاده کنید که نحوه تعامل کاربران با صفحه را منعکس می‌کنند.

  • تست‌های مستقل و متمرکز: هر تست باید یک سناریوی خاص از تعامل کاربر را پوشش دهد. از تست‌های پیچیده با تعاملات و assertion های متعدد خودداری کنید.

  • استفاده صحیح از `async/await`: از آنجایی که بسیاری از تعاملات کاربر (مانند تایپ و کلیک) ناهمزمان هستند، استفاده از `await` برای متدهای `userEvent` ضروری است تا تست قبل از assertion ها منتظر به پایان رسیدن تعامل بماند.



جمع‌بندی: ساخت برنامه‌های React قابل اعتماد با تست تعاملات کاربری


تست تعاملات کاربری با استفاده از Vitest و React Testing Library، ابزاری قدرتمند برای تضمین صحت عملکرد برنامه‌های React شما است. با شبیه‌سازی واقعی رفتار کاربر و تمرکز بر خروجی قابل مشاهده، می‌توانید اطمینان حاصل کنید که برنامه نه تنها در شرایط عادی، بلکه در حین تعاملات پیچیده کاربر نیز به درستی کار می‌کند. این رویکرد نه تنها قابلیت اطمینان نرم‌افزار را افزایش می‌دهد، بلکه مستندات زنده‌ای از انتظارات عملکردی برنامه ایجاد می‌کند. شروع با تست‌های ساده برای اجزای حیاتی و گسترش تدریجی آن‌ها، فرآیند تست را به بخشی طبیعی و کارآمد از چرخه توسعه تبدیل خواهد کرد.



آزمون‌های پیشرفته و ماک‌کردن

تست هوک‌های سفارشی (Custom Hooks)

هوک‌های سفارشی در React برای encapsulate کردن منطق قابل استفاده‌ی مجدد طراحی شده‌اند. تست کردن آن‌ها برای اطمینان از عملکرد صحیح ضروری است. React Testing Library تابع renderHook را ارائه می‌دهد که به طور خاص برای این منظور ساخته شده است. این تابع به شما امکان می‌دهد هوک را در یک کامپوننت تست مجازی رندر کنید و state و effects آن را مشاهده و assertion کنید. برای تست هوک‌های غیرهمزمان، باید از waitFor برای منتظر ماندن برای به‌روزرسانی state استفاده کنید.

ماک کردن فراخوانی‌های API

هنگام تست کامپوننت‌هایی که فراخوانی‌های API انجام می‌دهند، تماس با endpointهای واقعی می‌تواند تست‌ها را کند، غیرقابل اعتماد و وابسته به شرایط شبکه کند. ماک کردن این فراخوانی‌ها برای ایزوله نگه داشتن تست‌ها و کنترل دقیق داده‌های دریافتی ضروری است. برخلاف Jest، Vitest به طور خودکار ماژول‌ها را ماک نمی‌کند، بنابراین باید به صورت دستی این کار را انجام دهید. با استفاده از vi.mock می‌توانید یک ماژول (مانند axios یا fetch) را ماک کنید و سپس با متدهایی مانند mockResolvedValue یا mockRejectedValue پاسخ‌های موفق یا خطا را شبیه‌سازی کنید.

ماک کردن انتخابی توابع

گاهی اوقات لازم است فقط یک تابع خاص از یک ماژول را ماک کنید، در حالی که بقیه رفتار ماژول دست نخورده باقی بماند. Vitest این امکان را با vi.importActual فراهم می‌کند. با این روش، شما می‌توانید ماژول اصلی را وارد کنید و تنها تابع مورد نظر را با یک ماک جایگزین کنید. این رویکرد برای تست واحدهایی که به بخشی از عملکرد یک ماژول وابسته هستند، بدون تحت تأثیر قرار دادن بقیه، ایده‌آل است.

جمع‌بندی و توصیه‌های نهایی

تست‌نویسی با Vitest نه یک بار اضافی، بلکه یک بخش طبیعی و قدرتمند از فرآیند توسعه برنامه‌های React مدرن است. تمرکز خود را بر روی تست رفتارهای قابل مشاهده کاربر بگذارید، نه جزئیات داخلی پیاده‌سازی. با ماک کردن وابستگی‌های خارجی، تست‌های سریع، قابل اعتماد و ایزوله بنویسید. کار را با تست کردن جریان‌های بحرانی کاربر شروع کنید و به تدریج پوشش تست خود را گسترش دهید. به یاد داشته باشید که تست‌های خوب نه تنها از بروز باگ جلوگیری می‌کنند، بلکه امکان بازآرایی ایمن کد را فراهم کرده و به عنوان مستندات زنده رفتار مورد انتظار سیستم عمل می‌کنند.

نظرات (0)

اشتراک گذاری

این پست را با دیگران به اشتراک بگذارید

تنظیمات GDPR

When you visit any of our websites, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and manage your preferences. Please note, that blocking some types of cookies may impact your experience of the site and the services we are able to offer.