در حال ارتباط با سرور...




لطفا نظرات و پيشنهادات خود را بمنظور ارتقاء کيفي هرچه بيشتر سايت با ما در ميان بگذاريد.

ویدیوها مقالات کتاب ها اخبار پرسش و پاسخ
برنامه‌های رومیزی مبتنی بر وب زبان های برنامه سازی پایگاه داده سیستم عامل شبکه 
مقاله بگذارید
توسط : hamedkh دسته بندی : مبتنی بر وب تاریخ : 1393-1-15 18:19:22

تست یکی از بخش های جدا نشدنی از پروسه تولید و توسعه نرم افزار می باشد. ما بطور آگاهانه یا غیر آگاهانه همواره تست را انجام می دهیم. بعنوان مثال وقتی کلاسی را می نویسیم در بخش های مختلف آن چیز هایی را die و یا var_dump می کنیم تا از کارکرد صحیح متد های داخل آن کلاس اطمینان حاصل نماییم. بعنوان مثالی دیگر هنگامی که یک فرم HTML را طراحی می کنیم سعی می کنیم با ورود داده های مختلف در آن عملکرد آن را مورد ارزیابی قرار دهیم. در کنار این روش های دستی، برخی از توسعه دهندگان نیز هستند که از متد  های پیشرفته تری جهت تست برنامه خود استفاده می کنند. بعنوان مثال کد هایی را می نویسند که بطور خودکار عمل تست را برای آنها انجام دهد و خروجی را به آنها نمایش دهد. در این حالت با فراخوانی آن کدها، سیستم بطور خودکار تمامی تست ها را برای ما انجام می دهد و اگر تستی با خطا مواجه شود به ما اطلاع می دهد. به این نوع تست، تست خودکار یا automated testing گفته می شود که در این بخش آموزشی قصد داریم به آن با تمرکز بر روی Yii Framework بپردازیم.

در Yii Framework از دو نوع تست پشتیبانی می شود که عبارتند از Unit Test و Functional Test.  در Unit Test هدف تست و ارزیابی عملکرد یک واحد (Unit) از برنامه است. از آنجایی که در برنامه نویسی شیء گرا (object oriented)  واحد های سازنده و اصلی برنامه کلاس ها (Class) می باشند، در اینجا مقصود ما از Unit Test، ارزیابی متد ها و واسط ها (interface)  در کلاس های برنامه می باشد. در تمامی تست هایی که ما انجام می دهیم، قصد داریم با فراهم کردن ورودی هایی برای متد های یک کلاس، مطمئن شویم که آن متد خروجی مورد انتظار ما را تولید خواهد کرد. این کار را معمولا برنامه نویسی که کلاس را می نویسد انجام می دهد که در عین ظاهر ساده ای که دارد، کاری بسیار دشوار است و نیاز به مهارت و تجربه کافی دارد.

در کنار Unit Test، تست دیگری وجود دارد که به آن Functional Test گفته می شود. در این نوع تست هدف تست و ارزیابی عمکرد چندین واحد برنامه در کنار یکدیگر است که منجر به ارائه یک ویژگی برنامه به کاربرمی شوند (بعنوان مثال سیستم مدیریت نظرات در یک برنامه). می توان گفت Functional Test در سطح بالاتری نسبت به Unit Test قرار دارد چراکه در در ان عملکرد یک بخش از سیستم که متشکل از چندین کلاس است ارزیابی می شود. توجه داشته باشید که این نوع از تست باید توسط توسعه دهنده ای نوشته شود که کاملا به نیازمندی های برنامه مسلط است.

 

Test-Driven Development

پیش از آنکه وارد مقوله تست در Yii Framework شویم، بهتر است با مراحل توسعه مبتنی بر تست یا Test-Driven Development آشنا شوید. در زیر این مراحل به ترتیب آورده شده اند :

  1. برای هر ویژگی و کارایی جدیدی که می خواهید پیاده سازی کرده و به برنامه اضافه کنید ابتدا تستی را بنویسید که آن را پوشش دهد. دقت داشته باشید از آنجایی که ویژگی مورد نظر شما هنوز پیاده سازی نشده است، این تست باید با شکست (fail) مواجه شود.
  2. پس از نوشتن تست مورد نظر خود، تمامی تست ها را اجرا کنید. دقت داشته باشید تمامی تست ها بجز تست جدید شما باید پاس شوند.
  3. در این مرحله شروع به پیاده سازی ویژگی مورد نظرتان کنید و کد هایی را بنویسید که منجر به پاس شدن تست جدید شما گردند.
  4. مجدد تست ها را اجرا کنید و اینبار از پاس شدن تمامی تست ها مطمئن شوید.
  5. کدهای خود را بازنویسی و اصلاح کنید (refactor) و پس از آن مجددا تست ها را اجرا کنید تا مطمئن شوید عمل refactoring باعث ایجاد خطایی در برنامه نشده باشد.

مراحل 1 تا 5 آنقدر ادامه پیدا خواهند کرد تتا عملکرد مورد انتظار پیاده سازی گردد.

 

آماده سازی محیط تست در Yii Framework

حال که با اصول اولیه توسعه مبتنی بر تست (Test-Driven Development)  آشنا شدید به سراغ پیاده سازی و بکارگیری آن در Yii Framework می رویم. انجام تست در Yii Framework نیاز به PHPUnit +3.5 و  Selenium  Remote  Control +1.5 دارد. پیشنهاد می شود اگر با این دو ابزار آشنایی نداریم ابتدا نگاهی به انها بیندازید و با طریق نصب و راه اندازی آنها آشنا شوید.

اگر تا بحال با ابزار yiic یک برنامه Yii Framework را ایجاد کرده اید حتما متوجه پوشه ای بنام tests در داخل شاخه protected برنامه شده اید. این پوشه همانجایی است که شما تست های Unit Test و Functional Test را در آن نوشته و مدیریت می کنید. در ادامه این شاخه با محتویات و جزئیاتش آورده شده است :

 

testdrive/
   protected/                containing protected application files
      tests/                 containing tests for the application
         fixtures/           containing database fixtures
         functional/         containing functional tests
         unit/               containing unit tests
         report/             containing coverage reports
         bootstrap.php       the script executed at the very beginning
         phpunit.xml         the PHPUnit configuration file
         WebTestCase.php     the base class for Web-based functional tests

در هنگام پیاده سازی تست عمدتا با پوشه های fixture، functional و unit سروکار داریم. البته شاخه report  هم بمنظور مشاهده گزارش کامل پوشش کدهای تست (code-coverage report)  ممکن است مورد استفاده قرار گیرد. التبه توجه داشته باشید  برای استفاده از این گزارشات باید حتما xdebug بر روی سیستم شما نصب شده باشد.

حال ببینیم نحوه اجرا تست ها چگونه است. برای آنکه تست های نوشته شده را اجرا نمایید به شاخه tests بروید و فرمان های زیر را اجرا نمایید : 

 

% cd testdrive/protected/tests
% phpunit functional/PostTest.php    // executes an individual test
% phpunit --verbose functional       // executes all tests under 'functional'
% phpunit --coverage-html ./report unit

به آخرین خط از فرمان های بالا توجه کنید. با اجرای این خط تمامی تست های نوشته شده در شاخه unit اجرا می شوند و گزارش آنها در قالب فایلی در شاخه report تولید می شود. همانطور گفته شد پیش از اجرای این فرمان حتما باید xdebug نصب شده باشد.

 

اسکریپت Bootstrap

در پوشه tests فایلی بنام bootstrap.php وجود دارد که همانطور که از نامش پیداست اسکریپت bootstrap تست می باشد. این فایل در واقع همانند اسکریپت آغازین برنامه می باشد و اولین دستوراتی است که در حین اجرای تست فراخوانی می شوند. در ادامه نگاهی به این فایل می اندازیم :

 

$yiit='path/to/yii/framework/yiit.php';
$config=dirname(__FILE__).'/../config/test.php';
require_once($yiit);
require_once(dirname(__FILE__).'/WebTestCase.php');
Yii::createWebApplication($config);

در اولین خط از این اسکریپت فایلی با نام yiit.php را در برنامه وارد می کنیم. این فایل برای ما کلاس های مورد نیاز برای تست را ایجاد می کند و همچنین یک سری  مقادیر ثابت مورد نیاز با برای تست مقدار دهی می نماید. پس از آن یک نمونه از شیء Web  Application  با استفاده از فایل پیکربندی تست ایجاد می شود. اگر نگاهی به این فایل پیکربندی بیاندازیم متوجه می شویم که این فایل از main.php که فایل پیکربندی اصلی برنامه است ارثبری دارد. آنچه فایل test.php به فایل اصلی پیکربندی اضافه می کند کامپوننتی با نام fixture است که شیئی از کلاس CDbFixtureManager می باشد که در ادامه با جزئیات برای شما توضیح داده خواهد شد.

 

return CMap::mergeArray(
    require(dirname(__FILE__).'/main.php'),
    array(
        'components'=>array(
            'fixture'=>array(
                'class'=>'system.test.CDbFixtureManager',
            ),
            /* uncomment the following to provide test database connection
            'db'=>array(
                'connectionString'=>'DSN for test database',
            ),
            */
        ),
    )
);

هنگامی که ما برنامه را بهمراه پایگاه داده می خواهیم تست کنیم، باید در کنار پایگاه داده اصلی یک پایگاه داده تست ایجاد نماییم. برای این منظور تنها کاری که نیاز است انجا شود اینست که خطوط مربوط به تعریف پایگاه داده تست را در فایل پیکربندی test.php از حالت کامنت خارج کنیم و در قسمت connectionString اطلاعات مربوط به اتصال به پایگاه داده تست را وارد کنیم.

عملکرد اسکریپت آغازین تست مانند اسکریپ آغازین اصلی برنامه است با این تفاوت که بجای استفاده از پایگاه داده اصلی، از پایگاه داده تست استفاده می کند و همچنین کامپوننت fixture نیز به آن اضافه شده است.

 

تعریف Fixture

معمولا در طول توسعه یک نرم افزار به روش Test-Driven Development، تست های خودکار را بار ها و بار ها اجرا می کنیم. برای آنکه بتوان تستی را مکررا تکرار کرد از fixture ها استفاده می کنیم. Fixture ها در واقع یک وضعیت (state) مشخص هستند که ما بعد از اجرای هر تست می خواهیم مجددا به آن وضعیت بازگردیم. بعنوان مثال در functional test می خواهیم سیستم درج کامنت برای یک post را تست کنیم. هر بار که تست را اجرا می کنیم داده هایی آزمایشی وارد جدول مربوط به کامنت ها در پایگاه داده می شوند و وضعیت پایگاه داده را تغییر می دهند. حال فرض کنید که این تست را بارها و بارها اجرا می کنیم. این کار باعث می شود رکورد های زیادی که همه آنها آزماشی هستند در پایگاه داده درج شوند و اصطلاحا پایگاه داده را کثیف کنند. بهمین دلیل مطلوب است بعد از اجرای هر بار تست تغییرات انجام شده بر روی پایگاه داده از بین برود و پایگاه داده به وضعیت دلخواه ما بازگردانده (restore) گردد. Fixture ها همان وضعیتی هستند که می خواهیم به آن بازگردیم و دوبار تست را از آن شروع کنیم. برای آشنایی بیشتر با fixture ها پیشنهاد می شود مستندات PHPUnit رامطالعه فرمایید.

حال ببینیم چگونه باید fixture ها را تعریف و راه اندازی کنیم. اگر بخواهید برنامه ای را تست نمایید که با پایگاه داده کار می کند، راه اندازی fixture ها یکی از زمانگیر ترین کار های شما خواهد بود. برای تسهیل این کار، Yii Framework کامپوننتی بنام CDbFixtureManager را معرفی کرده است. این کامپوننت کار های زیر را بترتیب و بطور خودکار برای شما انجام خواهد داد :

  • پیش از اجرای تست ها، جدال پایگاه داده شما را به وضعیتی که شما مشخص کرده اید باز می گرداند.
  • پیش از آنکه یک تست خاص اجرا گردد، جداول مربوط به آن تست را به وضعیتی که شما مشخص کرده اید باز می گرداند.
  • در طول اجرای تست امکان دسترسی به داده هایی که شما در fixture تعیین نموده اید را برای شما فراهم می کند.

برای آنکه بتوان از کامپوننت CDbFixtureManager استفاده نمود، باید آن را از طریق فایل پیکربندی برنامه بصورت زیر تعریف کنیم :

 

return array(
    'components'=>array(
        'fixture'=>array(
            'class'=>'system.test.CDbFixtureManager',
        ),
    ),
);

پس از این کار می بایست داده های مربوط به fixture را در پوشه مخصوص آن یعنی پوشه protected/tests/fixtures مشخص نماییم. البته این امکان وجود دارد که این پوشه را از طریق CDbFixtureManager::basePath  به پوشه دلخواه خود تغییر دهید. داده های fixture در قالب فایل های بنام فایل های fixture سازماندهی می شوند. هر کدام از این فایل ها، یک فایل PHP هستند  که آرایه ای را باز می گردانند. این آرایه رکورد هایی از پایگاه داده را مشخص می کنند که پیش از شروع هر تست باید در جدول یا جداول مروبط به آن تست وجود داشته باشند. به بیان دیگر این آرایه رکورد های اولیه پایگاه داده را مشخص می کند که همان وضعیت اولیه پایگاه داده می باشند. پس از جرای تست CDbFixtureManager تغییراتی که در پایگاه داده صورت گرفته است را از بین می برد و بر اساس فایل های fixture رکورد هایی را در جداول درج می نماید تا پایگاه داده مجددا به وضعیت اولیه بازگردانده شود. نام این فایل ها همان نام جدول مربوط به آنها می باشد. بعنوان مثال اگر برای جدول post می خواهید fixture تعریف نمایید فایل مربوط به آن می بایست post.php باشد. در زیر مثالی از یک فایل fixture برای شما آورده شده است :

همانطور که مشاهده می کنید، در fixture بالا، دو رکورد از جدول post مشخص شده است. هرکدام از این رکورد ها بصورت یک آرایه associative مشخص شده اند (sample1 و sample2). نام های sample1 و sample2 تنها برای دسترسی آسانتر به این رکورد ها در برنامه تست هستند. به آنها row alias نیز گفته می شود. در ادامه با چگونگی بکارگیری این نام ها بیشتر آشنا خواهید شد.

<?php
return array(
    'sample1'=>array(
        'title'=>'test post 1',
        'content'=>'test post content 1',
        'createTime'=>1230952187,
        'authorId'=>1,
    ),
    'sample2'=>array(
        'title'=>'test post 2',
        'content'=>'test post content 2',
        'createTime'=>1230952287,
        'authorId'=>1,
    ),
);

اگر به این fixture دقت کرده باشید، حتما متوجه شده اید که در بین فیلد های جدول post، id آورده نشده است. این مسئله این خاطر است که این فیلد بصورت auto-incremental در پایگاه داده تعریف شده است و بصورت خودکار مقدار دهی می شود.

هنگامی که CDbFixtureManager برای اولین مورد ارجاع قرار می گیرد، این کامپوننت تمامی فایل های fixture را مورد بررسی قرار می دهد و از آن ها بمنظور مقدار دهی مجدد جداول مربوطه استفاده می کند. این کامپوننت ابتدا جداول را خالی (truncate) می کند، مقادیر auto-incremental را مجددا مقدار دهی کرده و در نهایت بر اساس داده های مشخص شده در فایل های fixture رکورد هایی را در جداول درج می کند. بدین ترتیب پایگاه داده به وضعیت مطلوب ما خواهد رفت.

توجه داشته باشید که مقدار دهی مجدد (reset) تمامی جداول ممکن است بسیار زمانبر باشد، مخصوصا وقتی پایگاه داده ما بزرگ باشد. بهمین دلیل گاهی مطلوب است از مقدار دهی مجدد تمامی جداول جلوگیری نماییم. برای این منظور می توان اسکریپت هایی به زبان PHP نوشت که این عملیات را بصورتی سفارشی شده (customized) برای ما انجام دهد. این اسکریپت را باید در فایلی بنام init.php نوشت و در شاخه fixtures ذخیره نمود. در صورت وجود چنین فایلی CDbFixtureManager آن را اجرا خواهد کرد و از سایر فایل های fixture صرفه نظر می کند.

گاهی ممکن است برای برخی از جداول بخواهیم چنین اسکریپت هایی را داشته باشیم. در چنین شرایطی کافی است نام جدول را بعنوان پیشوند به نام فایل init.php اضافه نماییم و آن را ذخیره کنیم. بعنوان مثال اگر برای جدول post می خواهیم چنین اسکریپتی داشته باشیم، نام فایل مربوط به آن post.init.php خواهد شد. در این حالت CDbFixtureManager اگر چنین فایلی را پیدا نمود آن را بجای fixture استفاده می کند و در غیر این صورت فایل fixture را خوانده و تغییرات را در جداول مربوطه اعمال می کند.

دقت داشته باشید که نیازی نیست برای تمامی جداول fixture تعریف کنید. چرا که این کار باعث افزایش زمان تست خواهد شد. تنها برای آن جداولی تعریف کنید که در طول تست داده هایش تغییر خواهند نمود.

 

Unit Test

پیش از آنکه وارد جزئیات مربوط به پیاده سازی Unit Test در Yii Framework شویم، پیشنهاد می شود حتما ابتدا مستندات PHPUnit را مطالعه کنید. چراکه Unit Test در Yii Framework بر پایه PHPUnit پیاده سازی شده است. در ادامه اصول اولیه نوشتن Unit Test در Yii Framework آورده شده است :

·         Unit Test در قالب کلاسی با نام XyzTest نوشته می شود. این کلاس باید از CTestCase و یا CDbTestCase ارثبری داشته باشد. Xyz در نام این کلاس اشاره به کلاسی دارد که می خواهیم برای آن تست بنویسیم. بعنوان مثال اگر می خواهیم برای کلاس Post تست بنویسیمف نام کلاس تست متناظر با ان PostTest خواهد بود. دقت داشته باشید که رعایت این نحوه نامگذاری ضروری است. اگر قصد نوشتن تست برای Active Record ها را دارید پیشنهاد می شود از CDbTestCase ارثبری داشته باشید. در غیر این صورت کلاس پدر شما CTestCase خواهد بود که آن هم از کلاس PHPUnit_Framework_TestCase ارثبری دارد.

·         کلاس های Unit Test شما باید در فایل هایی با نام XyzTest.php ذخیره شود. عموما این فایل ها در شاخه protected/tests/unit ذخیره می شوند.

·         هر کدام از کلاس های تست متد هایی با نام abcTest دارد که abc نام متدی است که می خواهید برای آن تست بنویسید.

·         هر متد تست بطور معمول شامل مجموعه ای از عبارت های assert مانند assertTrue و یا assertEquals می باشد که در واقع همان نقاط تست عملکرد متد مورد نظر هستند.

اکنون می خواهیم نحوه نوشتن Unit Test را برای Active Record ها به شما نشان دهیم. همانطور که گفته شد کلاس تست ما بهتر است از کلاس CDbTestCase ارثبری داشته باشد چرا که این کلاس امکانات خوبی را در رابطه با تست پایگاه داده و کارکردن با fixture ها در اختیار ما قرار می دهد. فرض کنید مدلی بنام Comment داریم و می خواهیم برای متد های آن تست بنویسیم. اولین کاری که انجام می دهیم اینست که کلاسی با نام CommentTest در شاخه protected/tests/unit ایجاد کنیم. نام فایل مربوط به این کلاس را نیز CommentTest.php می گذاریم.

اولین کاری که در این کلاس باید انجام دهیم تعریف fixture های مربوط به آن است. همانطور که در اسکریپت زیر مشاهده می کنیم این fixture ها را از طریق آرایه ای بنام $fixtures مشخص می نماییم. کاری که این آرایه انجام می دهد اینست که نگاشتی یک به یک را بین fixture ها و کلاس های مربوطه بر قرار می کند. بعنوان مثال posts را به کلاس Post نگاشت می دهد.

 

class CommentTest extends CDbTestCase
{
    public $fixtures=array(
        'posts'=>'Post',
        'comments'=>'Comment',
    );
 
    ......
}

این امکان وجود دارد که بجای نام کلاس از نام جدول نیز استفاده استفاده شود. در این حالت کافی است پیش از نام جدول از پیشوند : استفاده نماییم. مثلا بجای کلاس Post می توان از نام جدول آن بصورت :post استفاده کرد. هنگامی که در این آرایه از نام کلاس استفاده می کنیم، جداول مشخص شده در مدل ها بعنوان جداول fixture ها در نظر گرفته می شوند.

نام هایی که برای fixture ها در آرایه $fixtures تعیین می کنیم، کمک می کند تا بتوانیم در متد های تست به داده های fixture ها دسترسی داشته باشیم. نمونه ای از روش دسترسی به fixture ها در زیر نشان داده شده است :

توجه داشته باشید هنگامی که بجای نام مدل از نام جدول در تعریف fixture ها استفاده می کنیم (یعنی :Comment بجای Comment) دیگر نمی توانیم از طریق روش سوم به fixture دسترسی پیدا نماییم. چرا که هیچ اطلاعی در مورد مدل مربوط به جدول در دسترسی نیست.

// return all rows in the 'Comment' fixture table
$comments = $this->comments;
// return the row whose alias is 'sample1' in the `Post` fixture table
$post = $this->posts['sample1'];
// return the AR instance representing the 'sample1' fixture data row
$post = $this->posts('sample1');

حال می خواهیم برای یکی از متد های مدل Comment بنام approve() تستی بنویسیم.  همانطور که گفته شد بر اساس قواعد نام گذاری نام متد تست را testApprove می گذاریم. در ادامه مثالی از این تابع آورده شده است :

public function testApprove()
{
    // insert a comment in pending status
    $comment=new Comment;
    $comment->setAttributes(array(
        'content'=>'comment 1',
        'status'=>Comment::STATUS_PENDING,
        'createTime'=>time(),
        'author'=>'me',
        'email'=>'me@example.com',
        'postId'=>$this->posts['sample1']['id'],
    ),false);
    $this->assertTrue($comment->save(false));
 
    // verify the comment is in pending status
    $comment=Comment::model()->findByPk($comment->id);
    $this->assertTrue($comment instanceof Comment);
    $this->assertEquals(Comment::STATUS_PENDING,$comment->status);
 
    // call approve() and verify the comment is in approved status
    $comment->approve();
    $this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
    $comment=Comment::model()->findByPk($comment->id);
    $this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
}

 

 

همانطور که مشاهده می کنید ابتدا درستی عمل درج را با عبارت assertTrue(($comment->save(false)) ارزیابی می کنیم. سپس در دومین عبارت assertTrue() صحت عملکرد متد findByPk() را تست می نماییم. پس از ان از طریق متد assertEquals چک می کنیم که رکوردی که درج کرده ایم در وضعیت pending می باشد یا خیر. پس از آن تابع approve() تست می شود. کاری که انجام شده است این است که پس از فراخوانی متد approve چک می کنیم که وضعیت کامنت به حالت approve رفته است یا خیر.  در انتها نیز برای اطمینان رکورد کامنت مورد نظر را از پایگاه داده بازیابی می کنیم و وضعیت آن را چک می کنیم تا مطمئن شویم که تغییرات در پایگاه داده نیز اعمال شده است. مثال بالا نمونه ساده از نوشتن تست برای متد ها بود. همانطور که گفته شد نوشتن تستی اثر بخش نیاز به مهارت و تجربه کافی دارد و کار آسانی نیست.

 

Functional Test

گفتیم Yii Framework علاوه بر Unit Test از Functional Test نیز پشتیبانی می کند. در این بخش می خواهیم به این نوع تست بپردازیم. پیش از شروع پیشنهاد می شود حتما نگاهی به مستندات Selenium و طریقه نصب و استفاده از آن بیاندازید.

در ابتدا اصول و قواعد نام گذاری را برای نوشتن functional test برای شما بیان می کنیم :

·         مشابه آنچه در مورد Unit Test گفته شد، تست های functional در قالب کلاس هایی با نام XyzTest سازماندهی می شوند. Xyz نام کلاسی است می خواهیم آن را تست کنیم. این کلاس ها باید از CWebTestCase ارثبری داشته باشند.

·         تست های fuctional در فایل هایی با نام XyzTest.php ذخیره می شوند. بطور قرار دادی این تست ها را در شاخه protected/tests/functional ذخیره می کنیم.

·         نام متد ها بصورت testAbc نامگذاری می شوند که Abc نام ویژگی ای است که قصد داریم آن را تست نماییم. بعنوان مثال اگر می خواهیم سیستم ورود برنامه را تست کنیم نام متد مربوط به آن باید چیزی شبیه به testLogin انتخاب شود.

·         در این نوع تست، علاوه بر assertion ها، مجموعه ای از فرمان های (commands) مربوط به Selenium را نیز داریم. این فرمان ها در واقع رفتار کاربر را در هنگام کار با مرورگر شبیه سازی می نمایند. بعنوان مثال صفحه ای را باز می کنند و یا بر روی دکمه ای کلیک می کنند.

پیش از آنکه به سراغ نوشتن functional test برویم، نگاهی به فایل WebTestCase.php می اندازیم. این فایل کلاس WebTestCase را برای ما پیاده سازی می کند که کلاس اصلی و پدر تمامی کلاس های تست های functional می باشد.

 

define('TEST_BASE_URL','http://localhost/yii/demos/blog/index-test.php/');
 
class WebTestCase extends CWebTestCase
{
    /**
     * Sets up before each test method runs.
     * This mainly sets the base URL for the test application.
     */
    protected function setUp()
    {
        parent::setUp();
        $this->setBrowserUrl(TEST_BASE_URL);
    }
 
    ......
}

همانطور که مشاهده می کنید، در این کلاس URL پایه برای تست ها مقدار دهی می شود. این کار به شما اجازه می دهد بتوانید در متد های تست آدرس هایی نسبی بر اساس این URL ایجاد نماییم.

دقت کنید که در آدرس پایه برای تست از فایل index-test.php استفاده شده است  (بجای استفاده از index.php). تنها تفاوت بین index.php و index-test.php اینست که فایل index-test.php از فایل test.php بعنوان فایل پیکربندی (config) استفاده می کند. این در حالی است که index.php از فایل اصلی پیکربندی (main.php) بهره می برد.

حال بیایید نگاهی به تست زیر بیاندازیم :

 

class PostTest extends WebTestCase
{
    public $fixtures=array(
        'posts'=>'Post',
    );
 
    public function testShow()
    {
        $this->open('post/1');
        // verify the sample post title exists
        $this->assertTextPresent($this->posts['sample1']['title']);
        // verify comment form exists
        $this->assertTextPresent('Leave a Comment');
    }
 
    ......
}

همانند آنچه در مورد Unit Test داشتیم، در اینجا نیز می توانیم از fixture استفاده نماییم. بهمین دلیل در ابتدای کلاس آرایه $fixtures تعریف شده است. بر اساس این آرایه تعیین شده است که fixture مورد استفاده در این کلاس Post می باشد. پس از تعریف fixture متد testShow را داریم که برای تست عملکرد نمایش یک post نوشته شده است. در اولین خط از این متد فرمان open() را داریم که یک URL نسبی را بعنوان آرگومان ورودی می گیرد. با این فرمان به Selenium RC گفته می شود که آدرس نسبی post/1 را باز کند. توجه داشته باشید که آدرس اصلی چیزی شبیه به http://localhost/yii/demos/blog/index-test.php/post/1 خواهد بود. پس از آنکه آدرس مورد نظر مورد ارجاع قرار گرفت، از طریق متد assertTestPresent چک می کنیم که آیا عنوان مربوط به sample1 در صفحه چاپ شده است یا خیر.  پس از آن وجود متن “Leave a comment” را نیز در صفحه بررسی می کنیم.

این یک مثال ساده از یک Functional Test در Yii Framework  بود. شما می توانید با استفاده از سایر assertion ها و دستورات Selenium تست های پیچیده تری بنویسید.

حال بر اساس آنچه در ابتدای این مطلب آموزشی گفته شد از طریق خط فرمان تست های خود را اجرا نمایید. البته برای اجرای تست های fuctional باید Selenium Server در حال اجرا باشد. برای این منظور به شاخه نصب Selenium Server بروید و فرمان زیر را اجرا نمایید:

 

java -jar selenium-server.jar

موفق و پیروز باشید

منبع : Testing in Yii Framewrok

 

hamedkh
5.8 k     1     17     69
نظرات

بسیار عالی خدا قوت

آموزش زبان برنامه نویسی C#
آموزش jquery

آموزش زبان جاوا Java
آموزش زبان انگلیسی
آموزش برنامه نویسی C
آموزش برنامه نویسی C++
آموزش جی کوئری jQuery
آموزش زبان سی شارپ C#
آموزش برنامه نویسی اندروید
آموزش برنامه نویسی اندروید
آموزش زبان اسمبلی Assembly
آموزش جاوا اسکریپت JavaScript
آموزش برنامه نویسی به زبان PHP