تعداد بازدید: 3732

تست نویسی با 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% عملگر های نرم افزار را مورد تست قرار دهید.

مطالب مشابه

هدر های Http در درخواست و پاسخ

Http Headers (قسمت دوم)

http headers حاوی اطلاعاتی در رابطه با نوع درخواست ما می باشند. همچنین یک نوع رابط میان درخواست کلاینت و پاسخ سرور در...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای تست نویسی با PHPUnit (قسمت اول)

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

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