Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Laravel 5
Code

تست نویسی در لاراول

by
Difficulty:BeginnerLength:MediumLanguages:

Persian (پارسی) translation by Erfan (you can also view the original English article)

صرفنظر از اینکه شما با چه اپلیکیشنی کار میکنید، موضوع testing یک جنبه مهم است که اغلب نادیده گرفته میشود. امروز ما قصد داریم در در مورد testing در فریم ورک Laravel صحبت کنیم.

Laravel به صورت پیش فرض PHPUnit را در هسته خورد دارد و از آن پشتیبانی می کند. PHPUnit یکی از محبوب ترین ابزار های testing در میان جامعِ برنامه نویسان php است. که به شما اجازه ی گرفتن تست های unit و functional را میدهد.

ما با معرفی unit and functional testing شروع می کنیم. همانطور که در این آموزش جلو میرویم، چگونگی ایجاد unit and functional testing در لاروال را بررسی خواهیم کرد. ما فرض میکنیم که شما با اصول PHPUnit آشنا هستید، زیرا در این مقاله میخواهیم آن را برای لاراول بررسی کنیم.

تستِ واحد (unit testing) و تستِ فانکشنال (Functional Tests)

اگر قبلا با PHPUnit آشنا هستید، باید بدانید که می توانید تست ها را به دو تست واحد و تست های عملکردی تقسیم کنید.

در تست واحد، شما صحت یک تابع یا یک متُد خاص را آزمایش می کنید. مهمتر از همه، شما یک قطعه از کد خود را در یک زمان خاص آزمایش می کنید.

در زمان توسعه، اگر متوجه شوید که متُدی که نوشتید شامل بیش از یک واحد منطق ( logic ) است، بهتر است که آن را به متُد های مختلف تقسیم کنید تا هر کدام یک قطعه کد منطقی و قابل تست داشته باشد.

بیایید یک نگاه سریع به این مثال داشته باشیم که یک نمونه ایده آل برای unit testing است.

همانطور که می بینید، این متُد یک کار و تنها یک کار دارد. و آن این است که با استفاده از تابع ucfirst حرف اول عنوان را به حرف بزرگ تبدیل میکند.

در حالی که unit test برای تست صحت یک قطعه منطقی کد استفاده می شود، از سوی دیگر functional test، به شما امکان می دهد تا صحت یک مورد خاص را آزمایش کنید. به طور خاص، به شما اجازه می دهد تا اقداماتی که کاربر در یک برنامه انجام می دهد شبیه سازی کنید.

به عنوان مثال، شما می توانید یک مورد functional test را برای برخی از قابلیت هایی که یک عمل لاگین دارد پیاده سازی کنید که ممکن است گام های زیر را شامل شود.

  • برای دسترسی به صفحه لاگین به سیستم، یک درخواست از نوع GET ایجاد کنید.
  • بررسی کنید که آیا ما در صفحه ورود به سیستم هستیم.
  • یک درخواست POST را برای ارسال داده به صفحه لاگین ایجاد کنید.
  • بررسی کنید که آیا session با موفقیت ایجاد شد یا نه ؟

حالا که کمی با این مفاهیم آشنا شدید. از بخش بعدی، نمونه هایی را می سازیم که نشان می دهد چگونه در لاراول میتوانیم unit and functional test بسازیم.

تنظیم پیش نیازها

قبل از اینکه ما شروع کنیم و تست های واقعی ایجاد کنیم، باید یک سری از چیزهایی را که در تست هایمان استفاده می شود، تنظیم کنیم.

برای شروع ما مدل Post و migration مربوط به آن را ایجاد  میکنیم. برای ایجاد مدل Post ، دستور زیر را اجرا کنید.

دستور بالا باید مُدلِ Post و database migration مرتبط را نیز ایجاد کند.

کلاس مدل Post باید شبیه به کد زیر باشد:

And the database migration file should be created at database/migrations/YYYY_MM_DD_HHMMSS_create_posts_table.php.

ما همچنین می خواهیم عنوان پست را ذخیره کنیم. اجازه دهید کد فایل migration database پست را بازنویسی کنیم.

همانطور که می بینید، ستون $table->string('name') را برای ذخیره عنوان پست اضافه کردیم. بعد، شما فقط باید فرمان migrate را اجرا کنید تا بتواند آن جدول را در پایگاه داده ایجاد کند.

همچنین، اجازه دهید مدل Post را به صورت زیر بازنویسی کینم.

ما فقط متُدِ accessor را اضافه کردیم که عنوان پست را اصلاح می کند و دقیقا همان چیزی است که ما در unit test مان آزمایش می کنیم.

بعد، ما یک فایل controller را در مسیر app/Http/Controllers/AccessorController.php ایجاد میکنیم. این فایل برای بعدا که قصد ایجاد functional test را داشتیم مفید است.

در متد index، ما post id را از پارامترهای request بازیابی می کنیم و سعی می کنیم که شی post model را بارگذاری کنیم.

اجازه دهید یک مسیر مرتبط را نیز درroutes/web.php اضافه کنیم.

And with that in place, you can run the http://your-laravel-site.com/accessor/index URL to see if it works as expected.

تستِ واحد (unit testing)

در بخش قبلی ما راه اندازی اولیه را انجام دادیم که برای این قسمت و قسمت های بعدی مان مفید خواهد بود. در این بخش، ما قصد داریم که مفاهیم unit testing را در لاراول نشان دهیم.

مثل همیشه لاراول یک artisan command برای ما فراهم کرده است.

دستور زیر را برای ایجاد کلاس AccessorTest  اجرا کنید.توجه داشته باشیم که ما کلید واژه ی --unit را ایجاد می کنیم که تست واحد را فولدر test/Unit ایجاد می کند.

And that should create the following class at tests/Unit/AccessorTest.php.

اجازه دهید آن را با یک کد معنی دار جایگزین کنیم.

همانطور که می بینید، کد دقیقا همان است که در core PHP وجود دارد. ما فقط  dependency مربوط به Laravel را وارد کردیم که به ما اجازه می دهد از API های مورد نیاز استفاده کنیم. در متد testAccessorTest، ما باید صحت متد getNameAttribute که در مدل Post وجود دارد را آزمایش کنیم.

برای انجام این کار، یک نمونه از پایگاه داده دریافت کرده ایم و خروجی مورد انتظار را در متغیر $db_post_title آماده کرده ایم. بعد، همان پست را با استفاده از مدل Eloquent بارگذاری می کنیم که متد getNameAttribute را نیز اجرا می کند تا عنوان پست را آماده کند. در نهایت، ما از متد assertEquals برای مقایسه دو متغیر به طور معمول استفاده می کنیم.

So that's how to prepare unit test cases in Laravel.

تستِ فانکشنال 

در این بخش، ما یک functional test case را ایجاد می کنیم که عملکرد Controller ای را که قبلا ایجاد کرده ایم، آزمایش می کند.

دستور زیر را برای ایجاد کلاس AccessorTest اجرا کنید. مبینید که ما از کلمه کلیدی --unit استفاده نمی کنیم، به این صورت ما کلاسمان را در فولدرِ tests/feature میسازیم.

It'll create the following class at tests/Feature/AccessorTest.php.

Let's replace it with the following code.

کدی که نوشتیم باید برای کسانی که تجربه قبلی در functional testing دارند، آشنا باشد.

اول، ما نمونه ای از کلاس Post میگیریم و خروجی که انتظار داریم را در متغییر $db_post_title میریزیم. سپس، ما سعی میکنیم درخواست GET به آدرس /accessor/index?id=1 را شبیه سازی کنیم و پاسخ درخواستی که ایجاد کردیم را در متغییر $response میریزیم.

سپس، ما سعی مینیم کد پاسخ را که در متغیر $response  قرار دارد را با کد پاسخ مورد انتظارمان مطابقت دهیم. علاوه بر این، پاسخ باید حاوی یک عنوان باشد که با حروف بزرگ شروع می شود و این دقیقا همان چیزی است که ما با استفاده از متد assertSeeText آن را مطابقت می دهیم.

و این یک نمونه از functional test case است. در حال حاضر، ما همه چیزهایی را داریم که می توانیم test هایمان را بر علیه آن اجرا کنیم. بیایید پیش برویم و دستور زیر را در root برنامه مان اجرا کنیم تا همه test ها را اجرا کند.

این دستور باید تمام test هایی را که برای برنامه تان نوشته اید را اجرا کند. شما باید یک خروجی استاندارد PHPUnit را که وضعیت تست ها و assertion ها را نشان می دهد را ببینید.

And with that, we're at the end of this article.

نتیجه گیری

امروزه ما جزئیات testing را در Laravel را بررسی کردیم که به صورت پیشفرض PHPUnit را در هسته خود پشتیبانی می کند. این مقاله با مقدمه ای برای unit  و functional test آغاز شد و هرچه جلوتر رفتیم، جزئیات خاصی را در زمینه لاروول بررسی کردیم.

در این مقاله، مثال هایی را ایجاد کردیم که نشان داد چگونه می توانید با استفاده از فرمان artisan نمونه های unit و functional test ایجاد کنید.

اگر شما تازه با Laravel شروع به کار کرده اید یا به دنبال گسترش دانش یا سایت تان هستید، ما چیزهایی را که می توانید در Envato Market مطالعه کنید را در اختیار شما قرار می دهیم.

Don't hesitate to express your thoughts using the feed below!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.