اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

هناك نوعين من التست في لارافيل إما unit test او integration test

ال unit test نقوم بإختبار كل فنكشن على حده وبطريقه منفصله للتأكد هل تعمل بشكل صحيح أم لا 

أما بالنسبه لل integration test فأنت تقوم يعمل استورى كامله للتست 

مثال :

اليوزر قام بعمل تسجيل دخول ثم ذهب إلي صفحه البروفايل وعدل بياناته تلك الطريقه تسمي integration test وهذا بيتم عن طريق Browser tests في لارافيل

  • 0
نشر

توفر لارافل العديد من الوسائل التي تمكنك من اختبار مشروعك والتي تم تحسينها في النسخ الحديثة من لارافل لتشمل جميع جوانب المشروع وهي:

  • HTTP Tests: والتي تمكنك من اختبار ارسال الطلبات إلى الخادم واستقبالها من طرف الزبون ومحاكاة هذه الآلية ضمن مشروعك
  • Console Tests: وهي مشابهة لطلبات http ولكن تمنحك إمكانية إجراء التعليمات بكتابتها بشكل يدوي عبر ال console
  • Browser Tests: الاختبارات على مستوى المتصفح، والتي تم دمجها مع Laravel Dusk، والتي  تمكنك من اختبار جميع الخصائص ضمن المتصفح من ملفات تعريف الارتباط، الأزرار، التحقق والتوثيق، استخدام لوحة المفاتيح والفأرة، والعديد من الخصائص..
  • Database: ويتم فيها تنفيذ الاختبارات على مستوى قواعد البيانات، بما تحويه من معالجة البيانات والعلاقات فيما بينها وعلى مستوى models أيضاً عن طريق استخدام factories دون أن تحتاج لإضافة البيانات إلى الجداول بشكل يدوي وإشغال مساحة دون الحاجة لها.
  • Mocking: والتي تمنح القدرة على اختبار وحدة برمجية بشكل مستقل في حال أردت اختبار عمليات برمجية مرتبطة مع بعضها البعض أو مع أحداث أخرى، بما تحويه من mocking objects ، mocking facades، ....

جميع هذه الجوانب تحوي العديد من الطرق والتفاصيل التي يصعب جمعها في مكان واحد، لكن لسهولة البدء يمكنك التوجه إلى التوثيق الرسمي في لارافل واختيار موضوع محدد حسب حاجتك للاختبار والاطلاع على كامل التفاصيل عن هذا النوع الذي اخترته من الاختبار والذي يلبي حاجتك.

  • 0
نشر

كشيء جميل في اللارافل فإنه تم تم بناءه مع وضع الاختبارات في الاعتبار على عكس أطر عمل أخرى (مثال : الcodegniter) , فقد تم تضمين دعم الاختبارات باستخدام الphp Unit و يأتي كل Fresh Laravel Application مع ملف اعداد phpunit.xml و مجلد tests .

بحيث يحتوي المجلد tests افتراضيًّا على مجلّدين : Feature (تعبر عن مجموعة اختبارات كل منها هو اختبار جزء من الشيفرة) و Unit (تعبر عن مجموعة اختبارات الوحدة). 

يتم تشغيل الاختبارات التي قمت بإنشاءها عن طريق طباعة الأمر في التارمنل : 

phpunit

أو : 

vendor/bin/phpunit

أي أن الاختبارات التي يتم عملها ببيئة عمل الphpunit في اللارافل هي أحد الخيارين :

  1. اختبار وحدة unit test : و يقصد بها اختبارات مكتوبة من منظور المبرمجين. وهي مصممة للتأكد من أن طريقة معينة (أو وحدة) للclass تؤدي مجموعة من المهام المحددة. 
  2.  اختبار ميزة feature test: و يقصد بها اختبار جزء أكبر من التعليمات البرمجية الخاصة بك ، بما في ذلك كيفية تفاعل العديد من الكائنات مع بعضها البعض أو حتى طلب HTTP إلى نقطة نهاية من الاي بي اي الخاص بك . 

أما عن الأشياء التي تحتاج إختبارها فلارافل توفر أغلب ذلك , خصوصا و قد تم تحسينها في النسخ الأخيرة . فكما ذكر @Sam Ahwيمكنك إختبار كل جانب من التطبيق :

  1. جانب الHTTP :  بحيث يوفر اللارافل مجموعة من الmethods لمحاكاة طلب الى الخادم و التحقق من تفاصيله . مثال : 
    <?php
    
    class TasksTest extends TestCase
    {
       /**@test */ // هكذا يتم تعريف الاختبار
       public function a_task_can_be_retrieved()
       {
           $response = $this->json('GET', '/api/v1/task/12'); // محاكاة الطلب
    
           $response->assertStatus(200); // التحقق من ان كود الحالة هو كما متوقع
       }
        /**
        * يمكن تعريفه هكذا ايضا
        *
        */
       public function test_a_task_can_be_updated()
       {
           $response = $this->json('PATCH', '/api/v1/task/12' ,$some_data); // محاكاة الطلب
    
           $response->assertStatus(200); // التأكد من كود الحالة
       }
      
       /**@test */ 
       public function a_task_name_is_required()
       {
           $response = $this->json('POST', '/api/v1/task' ,$some_data_that_has_not_a_name); // محاكاة الطلب
    
           $response->assertStatus(422); // التأكد من كود الحالة 
       }
      
    }

     

  2. اختبارات المتصفح . Browser Tests أو كما هو شائع : Laravel Dusk . بحيث يمكنك إختبار كل ما يخص الواجهات . (التفاعل مع الواجهة , ضغط أزرار , نقر على روابط , التعامل مع القوائم المنسدلة , إرفاق الملفات عن طريق مدخلات الملفات .. و غيرها ) غير أن هاته الإختبارات تحتاج تسطيب حزمة laravel/dusk  . و ستتلقى عنك عناء اختبار التطبيق بنفسك . مثال من ويكي حسوب

<?php 
namespace Tests\Browser;

use App\User;
use Tests\DuskTestCase;
use Laravel\Dusk\Chrome;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends DuskTestCase
{
   use DatabaseMigrations;

   /**
    * مثال عن اختبار متصفح بسيط.
    *
    * @return void
    */
   public function testBasicExample()
   {
       $user = factory(User::class)->create([
           'email' => 'taylor@laravel.com',
       ]);

       $this->browse(function ($browser) use ($user) {
           $browser->visit('/login')
                   ->type('email', $user->email)
                   ->type('password', 'secret')
                   ->press('Login')
                   ->assertPathIs('/home');
       });
   }
}

3 . اختبارات قواعد البيانات : عن طريق الmodel factories و الdatabase seeders يمكنك ملئ قواعد البيانات الخاصة بك ببيانات مزيفة عن طريق مكتبة faker  و من ثم اختبارها عن طريق مجموعة من التوكيدات . 

4 . اختبارات تزييف الأحداث أو الـ Mocking : ويقصد بالأحداث أشياء مثل أحداث إرسال الايميلات App\Mails أو الأحداث داخل App\Events أو الإشعارات داخل App\Notifications أو تزييف الJobs داخل App\Jobs بل و حتى تزييف التخزين و التوكيد على عمله بشكل صحيح . فلارافل يمكنك من محاكاة ذلك و التوكيد على عمله دون عمله فعليا .  

إنشاء الاختبارات :

  1.  يكون عن طريق الterminal : 
php artisan make:test UserTest

     2.  و من ثم التعديل على ملف الtest المنشئ بإضافة اختبارات بشكل methods معرفة بشكل صحيح (كما تم ذكر ذلك) . 

<?php

class UserTest extends TestCase
{
   /**@test*/
   public function a_user_can_be_banned()
   {
       
   }
}

       3 . و من ثم محاكاة العملية التي تنوي إجراء الإختبار عليها  :

<?php

class UserTest extends TestCase
{
   /**@test*/
   public function a_user_can_be_banned()
   {
       $response = $this->json('PATCH', '/users/34', ['is_banned' => true]);

       //

   }
}

        4 . و أخيرا استعمال التوكيد الصحيح : 

<?php

class UserTest extends TestCase
{
   /**@test*/
   public function a_user_can_be_banned()
   {
       $response = $this->json('PATCH', '/users/34', ['is_banned' => true]);

       $response->assertStatus(200)->assertExactJson(['is_banned' => true,]);
   }
}

 

.. التوغل في كتابة الإختبارات و إختبار كل صغيرة و كبيرة بجوانب موقعك سيأخذ بك و تطبيقاتك إلى مستوى اخر من التطوير و يجعلك تمارس أحد مبادئ التطوير المتقدمة و هو الTDD أو الـ Test Driven Development و لن تضطر للعمل بطرق الإختبار التقليدية و ستكتفي بطباعة أمر واحد في التارمينل لإختبار تطبيقك ككل , في مرة واحدة. 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...