آموزش استفاده از PHPUnit در Laravel (قدم اول)

بدون دیدگاه

 

PHPUnit یکی از قدیمی ترین و معروف ترین بسته های Unit Test برای PHP است که در درجه اول برای UnitTest طراحی شده است، که به معنی تست کد شما در کوچکترین اجزای ممکن است، اما همچنین فوق العاده انعطاف پذیر است و می تواند کارهایی بیشتر از UnitTest انجام دهد.

انجام این تست ها برای مطمئن شدن از کارکرد صحیح برنامه ای که نوشته ایم انجام می شود.

PHPUnit شامل بسیاری از Assertion های ساده و انعطاف پذیر است که به شما اجازه می دهد به راحتی کد خود را تست کنید، مخصوصا وقتی در حال تست یک کامپوننت برنامه هستید. با این وجود، تست کد پیشرفته تر مانند Controller ها و ارسال فرم می تواند بسیار پیچیده تر باشد.

برای کمک به برنامه نویسان، فریم ورک Laravel به صورت توکار دارای Helper هایی برای انجام UnitTest است که به شما امکان می دهد تا تست های بسیار ساده ای را برای تست بخش های پیچیده برنامه خود بنویسید.

هدف از این آموزش این است که شما را به اصول اولیه تست PHPUnit، با استفاده از assertion های پیش فرض PHPUnit  و فانکشن های کمک کننده (Helper) در Laravel، آشنا کند. هدف این است که بتوانید تست های پایه برای برنامه های خود را در پایان این مقاله بنویسید.

پیش نیازها

این آموزش فرض می کند که شما قبلا با Laravel آشنا هستید و می دانید که چگونه دستورات را در دایرکتوری برنامه (مانند دستورات php artisan) اجرا کنید. ما برای یادگیری نحوه استفاده از ابزارهای مختلف تست، چند نمونه از کلاس های پایه را ایجاد خواهیم کرد برای همین توصیه می شود که یک لاراول تازه برای این آموزش نصب کنید.

در همین رابطه :   Hotel : ابزاری برای ایجاد Localhost مجزا برای هر پروژه

اگر نصاب Laravel را داشته باشید، می توانید یک برنامه آزمایشی جدید را با اجرای دستور زیر ایجاد کنید:

laravel new phpunit-tests

و یک راه دیگر اینکه از Composer استفاده کنید

composer create-project laravel/laravel --prefer-dist

جزئیات بیشتر در مورد نصب لاراول را می توانید اینجا و اینجا ببینید.

ایجاد یک تست جدید

اولین قدم هنگام استفاده از PHPUnit ایجاد یک کلاس تست جدید است. شمایل کلاس های تست در دایرکتوری برنامه در پوشه ./tests/ شما ذخیره می شوند. در داخل این پوشه، هر کلاس تست به نام <name> Test.php نامگذاری می شود. این فرمت اجازه می دهد تا PHPUnit هر کلاس تست را پیدا کند – پس هر چیزی که با Test.php پایان نیابد، نادیده گرفته خواهد شد.

در یک برنامه جدید Laravel شما دو فایل را در دایرکتوری ./tests/ خواهید دید: ExampleTest.php و TestCase.php. فایل TestCase.php یک فایل بوت استرپ برای تنظیم محیط Laravel در آزمایشهای ما است. این به ما اجازه می دهد از نمادهای(Facade) لاراول در آزمایشات استفاده کنیم و چارچوبی برای helper های تست فراهم کنیم. ExamplesTest.php نمونه یک کلاس تست است که شامل یک نمونه تست ساده با استفاده از helper های فریم ورک است – در حال حاضر آن را نادیده بگیرید.

برای ایجاد یک کلاس تست جدید، می توانیم یک فایل جدید را به صورت دستی ایجاد کنیم – یا دستور آرتیسن make:test را اجرا کنیم: این دستور توسط Laravel ارائه شده است.

برای ایجاد یک کلاس آزمون به نام BasicTest، ما فقط باید این دستور artisan را اجرا کنیم:

php artisan make:test BasicTest

لاراول بعد از این دستور یک کلاس تست شبیه این ایجاد خواهد کرد:

<?php
class BasicTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testExample()
{
$this->assertTrue(true);
}
}

مهمترین چیز در اینجا این است که پیشوند test در نام متد است. مانند پیشوند تست برای نام کلاس ها، این پیشوند test به PHPUnit می گوید چه متدهایی هنگام تست اجرا شوند. اگر شما پیشوند تست را فراموش کرده اید، PHPUnit متد را نادیده می گیرد.

در همین رابطه :   چگونه برای افزایش امنیت، ورود دو مرحله ای Google Authenticator را به Laravel اضافه کنیم؟

قبل از اینکه ما مجموعه تست را برای اولین بار اجرا کنیم، خوب است که به فایل پیش فرض phpunit.xml که Laravel فراهم می کند نگاهی بندازیم. PHPUnit به طور خودکار دنبال فایلی با اسم phpunit.xml یا phpunit.xml.dist در دایرکتوری فعلی هنگام اجرا می گردد. این جایی است که می توانید گزینه های خاصی را برای تست های خود پیکربندی کنید.

اطلاعات زیادی در این فایل وجود دارد، با این حال مهمترین بخش در حال حاضر تعریف دایرکتوری testsuite است:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit ... >

<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>

...
</phpunit>

این گزینه به PHPUnit می گوید که تست های موجود در دایرکتوری ./tests/ را اجرا کند،که همانطور که قبلا یاد گرفتیم، مسیر ذخیره سازی تست ها است.

اکنون ما یک آزمون پایه ای ایجاد کرده ایم و از پیکربندی PHPUnit هم آگاهی داریم، زمان اولین تست رسیده است.

شما می توانید تست های PHPUnit خود را با اجرای فرمان phpunit اجرا کنید:

./vendor/bin/phpunit

بعد باید چیزی شبیه این در نتیجه دستور ببینید:

PHPUnit 4.8.19 by Sebastian Bergmann and contributors.

..

Time: 103 ms, Memory: 12.75Mb

OK (2 tests, 3 assertions)

اکنون که ما یک PHPUnit درست کار کرده داریم، وقت آن است که سراغ نوشتن یک تست ساده برویم.

نوشتن یک Test ساده

برای دیدن assertions ساده PHPUnit ، اول یک کلاس ساده با کارکردهایی ابتدایی می سازیم.

یک فایل جدید در پوشه ./app/ بسازید و اسمش را Box.php بگذارید و کدهای زیر را داخلش آن کپی کنید:

<?php
namespace App;

class Box
{
/**
* @var array
*/
protected $items = [];

/**
* Construct the box with the given items.
*
* @param array $items
*/
public function __construct($items = [])
{
$this->items = $items;
}

/**
* Check if the specified item is in the box.
*
* @param string $item
* @return bool
*/
public function has($item)
{
return in_array($item, $this->items);
}

/**
* Remove an item from the box, or null if the box is empty.
*
* @return string
*/
public function takeOne()
{
return array_shift($this->items);
}

/**
* Retrieve all items from the box that start with the specified letter.
*
* @param string $letter
* @return array
*/
public function startsWith($letter)
{
return array_filter($this->items, function ($item) use ($letter) {
return stripos($item, $letter) === 0;
});
}
}

حالا، کلاس ./tests/BasicTest.php را باز کنید (که قبلا ساخته ایم) و متد testExample را پاک کنید. حالا باید این کلاس خالی بدون متد باشد.

در همین رابطه :   چگونه در فریم ورک لاراول sitemap ایجاد کنیم؟

حالا از ۷ assertion خود PHPUnit برای نوشتن تست کلاس Box استفاده کنیم که عبارتند از:

  • assertTrue()
  • assertFalse()
  • assertEquals()
  • assertNull()
  • assertContains()
  • assertCount()
  • assertEmpty()

 

assertTrue() و assertFalse()

با assertTrue() و assertFalse() می توانید مشخص کنید یک مقدار مساوی با true یا false است یا خیر. پس اینها برای متدهایی که مقدار Boolean بر می گردانند گزینه های مناسبی هستند. در کلاس Box، یک متد بنام has($item) هست، که وجود $item را در کلاس بررسی می کند و بعد true یا false بر می گرداند.

برای نوشتن یک تست برای این PHPUnit، می توانیم به این شکل عمل کنیم:

<?php
use App\Box;

class BasicTest extends TestCase
{
public function testHasItemInBox()
{
$box = new Box(['cat', 'toy', 'torch']);

$this->assertTrue($box->has('toy'));
$this->assertFalse($box->has('ball'));
}
}

حالا با اجرا کردن دستور ./vendor/bin/phpunit در خط فرمان، خروجی زیر را خواهید دید:

OK (2 tests, 4 assertions)

این به معنی پاس شدن تست ماست.

حالا اگر جای assertFalse() را با assertTrue() عوض کنید و دوباره دستور phpunit را اجرا کنید خروجی زیر را می بینید:

PHPUnit 4.8.19 by Sebastian Bergmann and contributors.

F.

Time: 93 ms, Memory: 13.00Mb

There was 1 failure:

۱) BasicTest::testHasItemInBox
Failed asserting that false is true.

./tests/BasicTest.php:12

FAILURES!
Tests: 2, Assertions: 4, Failures: 1.

ادامه دارد …

دسته بندی : Laravel

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *