برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.
به عنوان یکی از توسعه دهنده های PEST خوشحالم که بگم که ورژن 3 این فریم ورک منتشر شده🎈🍕
Pest 3 در لاراکون 2024 منتشر شد و قابلیت های خفنی اضافه شده که در این پست قراره کامل بررسی میکنیم👍
Mutation Testing
یکی از خفن ترین آپدیت های این ورژن قابلیت Mutation Testing هست. این قابلیت به شما این کمک میکند که اگه تست هاتون یک سری از بخش ها کاور نکرده بهتون نشون بده، برای مثال شما دارید برای فایل TodoController
تست مینویسید اما یک سری از کد های این کنترلر تست نویسی نکردید، با این قابلیت شما متوجه میشید کدوم قسمت تست نویسی نکردید و برای اون تست مینویسید. بریم یه مثال واقعی ببینیم:
برای اینکه از این قابلیت استفاده کنید نیاز دارید درون اون فایل تستی که دارید از فانکشن "()covers" استفاده کنید:
covers(TodoController::class);
it('list todos', function () {
$this->getJson('/todos')->assertStatus(200);
});
خب حالا شما تست اجرا کنید اگه بخشی از کدتون کاور نکردید اینجوری ارور میده:
همینطور برای اجرا تست ها به صورت mutate باید زمانی که تست ها اجرا میکنید آپشن --mutate
هم همراش بنویسید:
./vendor/bin/pest --mutate
# or in parallel...
./vendor/bin/pest --mutate --parallel
اگه بعد از اجرا ارور نداد باید به شکل زیر امتیاز 100 بهتون نشون بده:
Mutations: 1 tested
Score: 100.00%
امتیاز 100 به معنای این هست که تمام اون فایل کاور کردید و تست خفنی نوشتید (آفرین سید).
همینطور میتونید یک سری از کد هاتون که نیاز ندارید کاور بشن با
@pest-mutate-ignore
میتونید این کار انجام بدید.
Arch Presets
احتمال زیاد با Architecture testing آشنا هستید، حالا شما میتونید با استفاده از Arch Presets یک سری قوانین بنویسید که خیلی سریع تست نویسی کنید.
اینجا لیستی از Arch Presets که در Pest وجود داره مشاهده میکنید:
- php
- laravel
- security
- relaxed
- strict
# php
اگر از php برای preset استفاده کنید فانکشن هایی مثل die
، var_dump
و غیره شناسایی میکنه. برای دیدن تمامی فانکشن ها میتونید این لینک رو ببینید:
arch()->preset()->php();
# laravel
اگر از laravel برای preset استفاده کنید میاد پوشه ای مثل AppTraits
رو بررسی میکنه توش فایل هایی از نوع trait هست. برای دیدن تمامی rule ها میتونید این لینک ببینید:
arch()->preset()->laravel();
# security
اگر از laravel برای preset استفاده کنید فانکشن هایی مثل md5
، sha1
و.. رو شناسایی میکنه. برای دیدن تمامی فانکشن ها میتونید این لینک رو ببینید:
arch()->preset()->security();
# relaxed
اگر از relaxed برای preset استفاده کنید میاد چک میکنه که شما از strict types ها استفاده نمیکنید همینطور کلاس هاتون به صورت final نیست و متد های private ندارید. برای دیدن تمامی فانکشن ها میتونید این لینک رو ببینید:
arch()->preset()->relaxed();
strict
اگر از strict برای preset استفاده کنید دقیقا مثل relaxed عمل میکنه با این تفاوت که چک میکنه که فانکشن sleep
و usleep
استفاده نمیکنید. برای دیدن تمامی فانکشن ها میتونید این لینک رو ببینید:
arch()->preset()->strict();
همینطور یک نکته هم در آخر این قابلیت بگم که شما میتونید یک سری چیز هایی از از rule ها نادیده بگیرید و رد کنید، برای اینکار از متد ignore
میتونید استفاده کنید:
arch()->preset()->security()->ignoring('md5');
arch()->preset()->laravel()->ignoring(User::class);
Team Management
این قابلیت یک ویژگی خیلی باحاله به نظرم. شما با این قابلیت میتونید یک سری تسک ها که به صورت todo هستند رو به یک سری از هم تیمی هاتون assign کنید، بریم جلوتر و بیشتر باهاش آشنا بشیم:
در مرحله اول شما نیاز دارید که در فایل Pest.php
بیاید repo خودتون معرفی کنید:
pest()->project()->github('my-organization/my-repository');
اگر از سورس کنترل دیگه ای مثل gitlab
، bitbucket
، jira
یا custom
استفاده میکنید میتونید از همین متد استفاده کنید.
حالا شما میتونید تست هایی که todo کردید بتونید به یک نفر assign کنید و.... :
it('has a contact page', function () {
//
})->todo(assignee: 'milwad.dev@gmail.com', issue: 123);
همینطور این متد به شما این قابلیت میده یک سری نکات ذکر کنید:
it('has a contact page', function () {
//
})->todo(note: <<<NOTE
Given I am a user
When I visit the contact page
Then I should see a contact form
NOTE);
وقتی که روی تست هاتون دارید کار میکنید یا تست هاتون تکمیل شدند میتونید از متد wip
و done
استفاده کنید:
it('has a contact page', function () {
//
})->wip(assignee: 'milwad.dev@gmail.com', issue: 123); // or ->done()
همینطور در آخر شما میتونید با استفاده از یک سری آپشن فقط تست هایی که todo هستند یا به کسی خاصی assign شده ببینید:
./vendor/bin/pest --todos --assignee=milwad # or --issue=123
New Configuration API
در ورژن های قبلی Pest شما نیاز داشتید برای اینکه از یک trait یا کلاس و.. استفاده کنید در تست هاتون از فانکشن "()uses
" استفاده کنید، اما الان شما میتونید از فانکشن های جدید استفاده کنید:
- uses(TestCase::class)->in(__DIR__);
+ pest()->extends(TestCase::class);
- uses(TestCase::class, RefreshDatabase::class)->in('Features');
+ pest()->extends(TestCase::class)->use(RefreshDatabase::class)->in('Features');
- uses()->compact();
+ pest()->printer()->compact();
همینطور این نکته هم باید بگم که فانکشن "()uses" در حال حاضر هست و در فریم ورک حذف نمیشه و میتونید از اون هم استفاده کنید اما توصیه میشه از فانکشن های جدید استفاده کنید.
More Architectural Testing Improvements
در Pest 3 یک سری متد ها به Expectations اضافه شدند برای راحتی کار ما!
خب بریم ببینیم که چی هستند و چه تاثیری دارند:
toHaveAllMethodsDocumented()
: مطمن میشه که اون کلاس تمامی متد ها رو documante کرده.toHaveAllPropertiesDocumented()
: مطمن میشه که تمامی پراپرتی های اون کلاس رو documante کرده.toHaveFileSystemPermissions()
: مطمن میشه که اون فایل دسترسی (permission) های مورد انتظار داره.toHaveLineCountLessThan()
: مطمن میشه که اون فایل تعداد خط (line) کمتری از عددی که انتظار داشتید داره.toHaveMethods()
: مطمن میشه که اون کلاس متد های مورد انتظار داره.not->toHavePrivateMethodsBesides()
: مطمن میشه که اون کلاس فقط اجازه متد های private داره.not->toHavePrivateMethods()
: مطمن میشه که اون کلاس متد های private نداره.not->toHaveProtectedMethodsBesides()
: مطمن میشه که اون کلاس فقط اجازه متد های protected داره.not->toHaveProtectedMethods()
: مطمن میشه که اون کلاس متد های protected نداره.not->toHavePublicMethodsBesides()
: مطمن میشه که اون کلاس فقط اجازه متد های public داره.not->toHavePublicMethods()
: مطمن میشه که اون کلاس متد های public نداره.toUseTrait()
: مطمن میشه که اون کلاس از trait که انتظار دارید داره استفاده میکنه.toUseTraits()
: مطمن میشه که اون کلاس از trait هایی که انتظار دارید داره استفاده میکنه.
Tear Down Improvements
شما اگه با Pest آشنا هستید میدونید که با استفاده از فانکشن "()afterEach
" میتونید یک سری کد بعد از اجرا هر تست ران کنید:
afterEach(function () {
// This will run after each test...
});
حالا شما میتونید با استفاده از فانکشن "()after
" بیاید و یک سری کد بعد از اجرا یک تست خاص ران کنید نه تمامی تست ها:
it('may list todos', function () {
//
})->after(function () {
// This will run after this test only...
});
اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁