PHPUnit یکی از قدیمی ترین و معروف ترین بسته های Unit Test برای PHP است که در درجه اول برای UnitTest طراحی شده است، که به معنی تست کد شما در کوچکترین اجزای ممکن است، اما همچنین فوق العاده انعطاف پذیر است و می تواند کارهایی بیشتر از UnitTest انجام دهد.
انجام این تست ها برای مطمئن شدن از کارکرد صحیح برنامه ای که نوشته ایم انجام می شود.
PHPUnit شامل بسیاری از Assertion های ساده و انعطاف پذیر است که به شما اجازه می دهد به راحتی کد خود را تست کنید، مخصوصا وقتی در حال تست یک کامپوننت برنامه هستید. با این وجود، تست کد پیشرفته تر مانند Controller ها و ارسال فرم می تواند بسیار پیچیده تر باشد.
برای کمک به برنامه نویسان، فریم ورک Laravel به صورت توکار دارای Helper هایی برای انجام UnitTest است که به شما امکان می دهد تا تست های بسیار ساده ای را برای تست بخش های پیچیده برنامه خود بنویسید.
هدف از این آموزش این است که شما را به اصول اولیه تست PHPUnit، با استفاده از assertion های پیش فرض PHPUnit و فانکشن های کمک کننده (Helper) در Laravel، آشنا کند. هدف این است که بتوانید تست های پایه برای برنامه های خود را در پایان این مقاله بنویسید.
پیش نیازها
این آموزش فرض می کند که شما قبلا با Laravel آشنا هستید و می دانید که چگونه دستورات را در دایرکتوری برنامه (مانند دستورات php artisan
) اجرا کنید. ما برای یادگیری نحوه استفاده از ابزارهای مختلف تست، چند نمونه از کلاس های پایه را ایجاد خواهیم کرد برای همین توصیه می شود که یک لاراول تازه برای این آموزش نصب کنید.
اگر نصاب 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 متد را نادیده می گیرد.
قبل از اینکه ما مجموعه تست را برای اولین بار اجرا کنیم، خوب است که به فایل پیش فرض 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
را پاک کنید. حالا باید این کلاس خالی بدون متد باشد.
حالا از ۷ 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.
ادامه دارد …