آشنایی با روش توسعه TDD و شروع کار با PHPUnit در لاراول

TDD (مخفف Test-driven development) یک روش تکامل یافته در توسعه نرم‌افزاره که هدف اصلی در اون حذف کدهای اضافی و پیاده‌سازی نرم‌ افزار در کمترین زمان ممکن هستش. در این مقاله قصد داریم تا با استفاده از محبوب‌ترین و قدیمی‌ترین فریم‌ورک تست یعنی PHPUnit نشان بدیم چرا توسعه مبتنی بر تست در برنامه‌نویسی اهمیت داره و نحوه راه‌اندازی عملیات تست‌ در پروژه‌های لاراول به چه صورت می‌باشد.


یه جمله معروف هست از جیمز گرنینگ یکی از پیشتازان توسعه مبتنی بر TDD و روش توسعه چابک که می‌گه:

اگر توسعه مبتنی بر TDD را انجام نمی‌دهید، در حال توسعه به روش اشکال زدایی در آینده هستید... 

معمولا در پروژه‌های واقعی شیوه کار به این صورت هست که پروژه بصورت تیمی و گروهی انجام میشه و معمولا از شما بعنوان بک‌اند خواسته میشه که کوئری‌ها و فرآیند سیستم رو طراحی کنید. در اینجا شما باید بتوانید در یک زمان معقول نیازمند‌ی‌ها رو طراحی کنید و از صحت اجرای اون هم اطمینان داشته باشید لذا روشی که در اینجا پیشنهاد میشه روش TDD هست.

در این روش شما بدون درگیر شدن با فرانت و با حذف کدهای اضافی می‌تونید پروژه رو پیش ببرید. روش TDD که در سال 2003 توسط کنت بک ارائه شد، به این صورته که قبل از شروع به طراحی و پیاده‌سازی بخشی از پرژه ابتدا یک تست برای آن قسمت تعریف می‌کنید و بعد با توجه به ورودی و خروجی‌های تست، با کمترین کد بخش مربوطه رو پیاده‌سازی می‌کنید.

در فریم‌ورک لاراول هم این امکان بصورت پیش‌فرض وجود داره که شما بتوانید از روش توسعه TDD استفاده کنید، برای این منظور از یک فریم ورک قدرتمند دیگری به نام PHPUnit استفاده می‌شه.

Image for post
Image for post

PHPUnit یک فریم‌ورکه که بر اساس معماری xUnit ساخته شده و برای آزمایش برنامه‌هایی که با PHP توسعه داده‌ شدند مورد استفاده قرار می‌گیره. بطور پیش‌فرض PHPUnit بعنوان یک ابزار آزمایشی در هر پروژه لاراولی گنجانده شده و نیاز نیست شما کار خاصی برای راه‌اندازی یک محیط آزمایشی انجام بدید! تنها کاری که باید انجام داد اینه که مطمئن بشیم مقادیر پیش‌فرض (که معمولاً مناسب هستند) مطابق با نیاز ما تنظیم شدند.


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

در این فایل تنظیمات زیادی می‌تونه نوشته بشه داک مربوط به این تنظمات رو می‌تونید از اینجا مطالعه کنید. اما مهم‌ترین قسمت این تنظیمات ‍testsuite هست:

<testsuites>
    <testsuite name="Unit">
        <directory suffix="Test.php">./tests/Unit</directory>
    </testsuite>
    <testsuite name="Feature">
        <directory suffix="Test.php">./tests/Feature</directory>
    </testsuite>
</testsuites>

این قسمت برای PHPUnit دایرکتوری‌هایی که در آنجا عملیات تست تعریف میشه رو تعیین می‌کنه! با توجه به چیزی که در داک خود لاراول توضیح داده شده، معمولا Unit برای تست‌های جزیی و از Feature برای تست‌های اصلی استفاده میشه ما هم معمولا از دایرکتوری Feature استفاده می‌کنیم. نکته‌ای که اینجا وجود داره اینه که هر کلاس تستی که ایجاد می‌کنید باید به کلمه Test ختم بشه!

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

 <server name="DB_CONNECTION" value="sqlite"/> 
 <server name="DB_DATABASE" value=":memory:"/>

البته شما آزاد هستید که هر تغییری که لازم داشتید انجام بدید اما همین‌ تنظیمات برای شروع عملیات تست کافیه. اگر مورد دیگری بود حتما در ادامه به اون اشاره خواهم کرد.

 

اجرای تست‌

برای اجرای تست‌هامون کافیه دستور زیر رو وارد کنید. این دستور تمامی کلاس‌ها و توابع آن‌ها رو در دایرکتوری‌هایی که در testsuites تعریف کردید (در اینجا همون Unit و Feature ) رو اجرا خواهد کرد.

php artisan test

اگر خواستیم تنها تست‌های درون یک دایرکتوری که در testsuites تعریف کردید رو اجرا کنید دستور زیر رو وارد می‌کنیم:

php artisan test --testsuite=Feature

همچنین این امکان رو هم دارید که از طریق فایل اسکریپتی که در مسیر vendor وجود داره برای اجرای تست‌ها استفاده کنید برای اینکار هم کافیه مسیر vendor/bin/phpunit/  داخل ترمینال صدا بزنید. البته میشه این دستور رو هم برای سادگی بیشتر داخل composer هم مانند تصویر زیر تعریف کرد که بجای وارد کردن آدرس از دستور composer test استفاده کنید:

Image for post
Image for post

یه روش دیگه هم استفاده مستقیم از خود PHPUnit هست که برای این کار می‌تونید این فریم‌ورک رو بصورت مجزا در سیستم خودتون نصب داشته باشید. برای نصب هم کافیه با استفاده از composer اینکار رو انجام بدید:

composer require --dev phpunit/phpunit

خوبی استفاده از PHPUnit بصورت مستقیم اینه که اگر کلاس یا تابعی که annotation مربوط به تست رو داشته باشه دقیقا همون تابع رو اجرا می‌کنه جلوتر در مورد نحوه انجام اینکار توضیح خواهم داد.

 

برای تولید یک کلاس test کافیه که دستور artisan زیر رو وارد کنید:

php artisan make:test <name>Test

اگر دستور تست رو در ترمینال اجرا کنید چیزی مشابه خروجی زیر رو دریافت خواهید کرد که نشون میده دستورات تست (که در اینجا بصورت پیش فرض وجود داره) بدون مشکل هستند:

Image for post
Image for post

فعلا تا همینجا کافیه!‌ در این آموزش سعی کردم مفاهیم و اهمیت روش توسعه مبتنی بر تست یا همون TDD و نحوه شروع بکار با PHPUnit در لاراول رو توضیح بدم در مقاله بعدی یک پروژه تعریف خواهیم کرد و این روش توسعه رو تجربه می‌کنیم.