نسخه:

تست: شروع به کار

معرفی

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

به طور پیش فرض، دایرکتوری برنامه شما tests شامل دو دایرکتوری است: Feature و Unit . تست های واحد تست هایی هستند که بر روی بخش بسیار کوچک و جدا شده از کد شما تمرکز می کنند. در واقع، اکثر آزمون‌های واحد احتمالاً بر روی یک روش متمرکز هستند. تست‌های موجود در دایرکتوری آزمایشی "Unit" شما برنامه لاراول شما را بوت نمی‌کنند و بنابراین نمی‌توانند به پایگاه داده برنامه یا سایر خدمات فریمورک شما دسترسی داشته باشند.

آزمایش‌های ویژگی ممکن است بخش بزرگ‌تری از کد شما را آزمایش کنند، از جمله نحوه تعامل چندین شی با یکدیگر یا حتی یک درخواست HTTP کامل به نقطه پایانی JSON. به طور کلی، بیشتر تست های شما باید تست های ویژگی باشد. این نوع تست‌ها بیشترین اطمینان را به وجود می‌آورند که سیستم شما به‌عنوان یک کل آن‌طور که در نظر گرفته شده است کار می‌کند.

یک ExampleTest.php فایل در هر دو دایرکتوری Feature و Unit تست ارائه شده است. پس از نصب یک برنامه جدید لاراول، دستورات vendor/bin/pest ، vendor/bin/phpunit یا را php artisan test برای اجرای آزمایشات خود اجرا کنید.

محیط

هنگام اجرای تست ها، لاراول به دلیل متغیرهای محیطی که در فایل تعریف شده است، به طور خودکار محیط پیکربندی را تنظیم می کند . لاراول همچنین به طور خودکار Session و Cache را برای درایور پیکربندی می‌کند تا هیچ جلسه یا داده‌های حافظه پنهان در هنگام آزمایش حفظ نشود. testing phpunit.xml array

در صورت لزوم می توانید مقادیر پیکربندی محیط آزمایشی دیگر را تعریف کنید. متغیرهای testing محیط ممکن است در فایل برنامه شما پیکربندی شده باشند phpunit.xml ، اما مطمئن شوید که کش پیکربندی خود را با استفاده از config:clear دستور Artisan قبل از اجرای آزمایشات پاک کنید!

فایل .env.testing محیطی

علاوه بر این، می توانید یک .env.testing فایل در ریشه پروژه خود ایجاد کنید. .env هنگام اجرای تست های Pest و PHPUnit یا اجرای دستورات Artisan با گزینه ، از این فایل به جای فایل استفاده می شود --env=testing .

ایجاد تست

برای ایجاد یک تست جدید، از make:test دستور Artisan استفاده کنید. به طور پیش فرض، تست ها در فهرست قرار می گیرند tests/Feature :

php artisan make:test UserTest

اگر می خواهید یک تست در tests/Unit دایرکتوری ایجاد کنید، می توانید --unit هنگام اجرای make:test دستور از این گزینه استفاده کنید:

php artisan make:test UserTest --unit

هنگامی که تست تولید شد، می توانید تست را همانطور که معمولاً با استفاده از Pest یا PHPUnit تعریف می کنید، تعریف کنید. برای اجرای آزمایشات خود، دستور vendor/bin/pest ، vendor/bin/phpunit یا را php artisan test از ترمینال خود اجرا کنید:

<?php
 
test('basic', function () {
expect(true)->toBeTrue();
});
<?php
 
namespace Tests\Unit;
 
use PHPUnit\Framework\TestCase;
 
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_basic_test(): void
{
$this->assertTrue(true);
}
}

setUp اگر متدهای / خود را tearDown در یک کلاس آزمایشی تعریف می‌کنید، حتماً متدهای parent::setUp() / مربوطه parent::tearDown() را در کلاس والد فراخوانی کنید. به طور معمول، شما باید parent::setUp() در شروع setUp روش خود و parent::tearDown() در پایان tearDown متد خود فراخوانی کنید.

در حال اجرا تست ها

همانطور که قبلا ذکر شد، پس از نوشتن تست ها، می توانید آنها را با استفاده pest از یا اجرا کنید phpunit :

./vendor/bin/pest
./vendor/bin/phpunit

علاوه بر دستورات pest یا phpunit ، می توانید از test دستور Artisan برای اجرای تست های خود استفاده کنید. Artisan test runner برای سهولت توسعه و اشکال‌زدایی، گزارش‌های آزمایشی مفصل ارائه می‌کند:

php artisan test

هر آرگومان قابل انتقال به دستورات pest یا phpunit ممکن است به دستور Artisan نیز ارسال شود test :

php artisan test --testsuite=Feature --stop-on-failure

اجرای تست ها به صورت موازی

به طور پیش فرض، Laravel و Pest / PHPUnit تست های شما را به صورت متوالی در یک فرآیند واحد اجرا می کنند. با این حال، ممکن است با اجرای همزمان تست‌ها در چندین فرآیند، مدت زمان اجرای تست‌های خود را تا حد زیادی کاهش دهید. برای شروع، باید brianium/paratest بسته Composer را به عنوان یک وابستگی "dev" نصب کنید. سپس --parallel هنگام اجرای test دستور Artisan گزینه زیر را وارد کنید:

composer require brianium/paratest --dev
 
php artisan test --parallel

به‌طور پیش‌فرض، لاراول به تعداد هسته‌های CPU موجود در دستگاه شما، فرآیند ایجاد می‌کند. با این حال، می توانید تعداد فرآیندها را با استفاده از --processes گزینه تنظیم کنید:

php artisan test --parallel --processes=4

هنگام اجرای آزمایش‌ها به صورت موازی، برخی از گزینه‌های Pest / PHPUnit (مانند --do-not-cache-result ) ممکن است در دسترس نباشند.

تست موازی و پایگاه داده

تا زمانی که یک اتصال پایگاه داده اولیه را پیکربندی کرده باشید، لاراول به طور خودکار ایجاد و انتقال یک پایگاه داده آزمایشی را برای هر فرآیند موازی که آزمایش های شما را اجرا می کند، انجام می دهد. پایگاه‌های داده آزمایشی با یک رمز فرآیند که در هر فرآیند منحصربه‌فرد است، پسوند می‌شوند. به عنوان مثال، اگر دو فرآیند تست موازی داشته باشید، لاراول پایگاه داده ایجاد و استفاده your_db_test_1 و your_db_test_2 آزمایش می کند.

به‌طور پیش‌فرض، پایگاه‌های داده آزمایشی بین فراخوانی‌های test دستور Artisan باقی می‌مانند تا بتوان با test فراخوانی‌های بعدی دوباره از آنها استفاده کرد. با این حال، می توانید آنها را با استفاده از این گزینه دوباره ایجاد کنید --recreate-databases :

php artisan test --parallel --recreate-databases

قلاب های تست موازی

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

با استفاده از ParallelTesting نما، می‌توانید کدی را برای اجرا بر روی یک فرآیند یا مورد آزمایشی مشخص setUp کنید tearDown . بسته های داده شده به ترتیب، متغیرهای حاوی رمز فرآیند و مورد آزمایش فعلی را دریافت می $token کنند $testCase :

<?php
 
namespace App\Providers;
 
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
use PHPUnit\Framework\TestCase;
 
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
 
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
 
// Executed when a test database is created...
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
Artisan::call('db:seed');
});
 
ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
// ...
});
 
ParallelTesting::tearDownProcess(function (int $token) {
// ...
});
}
}

دسترسی به رمز تست موازی

اگر می‌خواهید از هر مکان دیگری در کد آزمایشی برنامه خود به «توکن» فرآیند موازی فعلی دسترسی داشته باشید، می‌توانید از این token روش استفاده کنید. این توکن یک شناسه رشته منحصر به فرد برای یک فرآیند آزمایشی فردی است و ممکن است برای تقسیم‌بندی منابع در فرآیندهای آزمایشی موازی استفاده شود. به عنوان مثال، لاراول به طور خودکار این نشانه را به انتهای پایگاه داده های آزمایشی ایجاد شده توسط هر فرآیند آزمایش موازی اضافه می کند:

$token = ParallelTesting::token();

گزارش پوشش آزمون

این ویژگی به Xdebug یا PCV نیاز دارد .

هنگام اجرای آزمون های برنامه کاربردی، ممکن است بخواهید تعیین کنید که آیا موارد آزمایشی شما واقعاً کد برنامه را پوشش می دهد و چه مقدار از کد برنامه کاربردی هنگام اجرای آزمون های شما استفاده می شود. برای انجام این کار، می‌توانید --coverage هنگام فراخوانی test دستور، این گزینه را ارائه دهید:

php artisan test --coverage

اجرای حداقل آستانه پوشش

می توانید از --min گزینه تعیین حداقل آستانه پوشش آزمون برای برنامه خود استفاده کنید. اگر این آستانه رعایت نشود، مجموعه آزمایشی با شکست مواجه خواهد شد:

php artisan test --coverage --min=80.3

تست های پروفایل

آزمون دونده Artisan همچنین دارای مکانیزمی مناسب برای فهرست کردن کندترین تست‌های برنامه شما است. test فرمان را با گزینه ای فراخوانی کنید --profile تا لیستی از ده تست کندتر شما ارائه شود، به شما این امکان را می دهد که به راحتی بررسی کنید که کدام تست می تواند برای افزایش سرعت مجموعه تست شما بهبود یابد:

php artisan test --profile