تست نویسی با PHPUnit (قسمت اول)
یکی از ابزار های تست در پروژه های مبتنی بر PHP استفاده از PHPUnit می باشد. ویژگی های PHPUnit به شرح زیر است :
- یک پکیج PHP می باشد . لذا در Packagist است و با composer نصب می شود.
- ابزاری برای محیط development می باشد.(
require --dev
) - دارای command line interface می باشد. یعنی به ازای هر پروژه باید phpunit همان را اجرا کرد.
چه زمانی ما تست نیاز داریم ؟ هر زمان که کدی برای اجرا باشد تست هم باید باشد.اما این بسته به بزرگ یا کوچک بودن پروژه لزوم خود را نشان می دهد. در پروژه های بزرگ داشتن تست هزینه پروژه را پایین می آورد.
Unit testing با مفهوم Software Flow متفاوت است. این که یک کاربر چگونه از اپلیکیشن شما استفاده می کند Software flow می باشد. اما Unit testing یعنی تست واحد یا method test که با اجرای phpunit نتیجه حاصل می گردد.
unit به معنی واحد یا یک است . به معنی این که هر متد یک عمل را تست می کند.به طور مثال شما یک متد برای چک کردن مقدار یک عدد می نویسید. تست بر اساس نحوه عملکرد یک متد می باشد ، تست را هم برای آن می نویسید. منطق متد خود را عوض می کنید. با اجرای تستی که از قبل نوشته اید می توانید نحوه عملکرد متد را نیز بررسی کنید.
Each Part of program work fine as Isolated Program
install PHPUnit in Project
install PHPUnit : برای نصب PHPUnit بر روی پروژه فرمان زیر را در composer اجرا کنید.
composer require --dev phpunit/phpunit
روال کار به این گونه است که ما PHPUnit را به ازای هر پروژه نصب و پیکره بندی می کنیم(Locally).
PHPUnit Configuration : پس از نصب phpunit باید تنظیمات آن را پیاده سازی کنیم. تنظیمات یک فایل xml است که از ساختار زیر پیروی می کند.
<?xml version="1.0" encoding="utf-8" ?> <phpunit bootstrap="./vendor/autoload.php" colors="true" verbose="true" stopOnFailure="true" > <testsuites> <testsuite name="Prdocut controller"> <directory>./tests/Controllers</directory> <file>./tests/Controllers/ProductTest.php</file> </testsuite> <testsuite name="User controller"> <directory>./tests/Controllers</directory> <file>./test/Controllers/UserTest.php</file> </testsuite> </testsuites> </phpunit>
تگ phpunit ویژگی هایی دارد که همان تنظیمات اجرای تست ها می باشد. مثلا stopOnFailure یعنی اگر تستی fail شد برنامه تست را متوقف کند.
bootstrap باید مسیر شروع تست را مشخص کند یعنی ایجاد دسترسی به نرم افزار یا همان bootstrap نرم افزار شما. در بسیاری از موارد مسیر autoload می باشد. مثلا می توان مسیر شروع را خودمان با توجه به فایل های مورد نیاز برای تست خودمان تعیین کنیم.
testsuites ها دسته بندی ای از هر تست می باشد. مثلا یه سری تست در رابطه با کنترلر product (کلاس Product و کلاس تست TestProduct).
Run PHPUnit : فرمان زیر تست های دایرکتوری test را بر اساس تنظیمات phpunit.xml در روت پروژه اجرا می کند.
vendor/bin/phpunit
Directory mapping PHPUnit : ساختار دایرکتوری های مهم در پروژه پس از پیاده سازی unit testing در آن به شکل زیر است :
/tests FirstTest.php /vendor /bin phpunit phpunit.xml
vendor/bin/phpunit که ممکن است که در پروژه شما که مسیر phpunit اجرایی را نمایش می دهد. دایرکتوری tests که مسیر کلاس های تست شما می باشد. فایل phpunit.xml که مربوط به phpunit configuration است.
Writing Tests for PHPUnit
کلاس های تست باید از کلاس testCase
ارث بری کند. این کلاس در مسیر PHPUnit\Framework\TestCase
می باشد.
use PHPUnit\Framework\TestCase; class Example extends TestCase { public function testOne(){ $this->assertTrue(true); } /** @test */ public function tow(){ $this->assertTrue(true); } }
هر کلاس test می تواند تعدادی تست در خود داشته باشد. اگر ابتدای نام آن test باشد یا annotation @test را در ابتدای متد بیاوریم به عنوان تست آن را می شناسد.
پس از اجرای تست در محیط ترمینال به ازای هر تست یک علامت نمایش داده می شود که به شرح زیر است :
.
: که به معنی موفقیت آمیز بودن تست می باشد.
F
: به معنی خطا در تست می باشد.
....
چهار نقطه در کنار هم یعنی هر 4 تست successfull بوده اند. ..F.
یعنی دو تست success و یک تست fail شده و سپس یک تست دیگر success شده است.
Assertions
در پایان هر تست باید نتیجه تست را با استفاد از Assertion تعیین کنید. بر اساس همین نتیجه که می تواند true , false باشد ادعا (assertion) می کنیم که متد درست بوده یا خیر.
به صورت کلی تست که اجرا می شود تنها Assertion را به عنوان خطا می شناسد و در console نمایش می دهد . خطاهای موجود در نحوه رفتار نرم افزار را بررسی نمی کند.
لیست Assertions را در زیر مشاهده می کنید :
- assertTrue , assertFalse : ورودی آن true , false می باشد که به معنی نتیجه success , fail می باشد.
- assertArrayHasKey , assertArrayNotHasKey : اگر المان داده شده در آرایه موجود باشد success در غیر این صورت fail است.
- assertNotSame , assertSame : اگر نتیجه برابر با پاسخ باشد. مقایسه دو پارامتر ورودی .
- assertGreaterThan , assertEquals , assertGreaterThanOrEqual : مقایسه دو مقدار.
- assertIsBool , assertIsArray , assertInstanceOf , assertIsFloat : بررسی نوع داده ورودی.
- arrayEmpty : خالی بودن پارامتر ورودی.
فرض کنید که می خواهید یک معادله ریاضی برای امتحان طراحی کنید. برای طرح سوال باید از پاسخ شروع کنید تا به صورت معادله برسید.دانشجویان باید در امتحان صورت معادله را حل کنند تا به پاسخ برسند. برگه سوالات معادل کنترلر و معادله ها همه متد و tester می شود طراح سوال. برای ساخت تست باید مثل ساخت یک معادله عمل کنید . داده های همیشه درست باید در method شما درست عمل کنند.
در پایان سعی بر این داشته باشید که 100% عملگر های نرم افزار را مورد تست قرار دهید.
دیدگاهتان را بنویسید