أفضل طريقة لاختبار وحدة موقع ويب يحتوي على أنواع متعددة من المستخدمين باستخدام PHPUnit

StackOverflow https://stackoverflow.com/questions/58969

  •  09-06-2019
  •  | 
  •  

سؤال

لقد بدأت في تعلم كيفية استخدام PHPUnit لاختبار موقع الويب الذي أعمل عليه.المشكلة التي أواجهها هي أن لدي خمسة أنواع مختلفة من المستخدمين محددة وأحتاج إلى أن أكون قادرًا على اختبار كل فئة بأنواع مختلفة.لدي حاليًا فئة مستخدم وأرغب في تمرير هذا إلى كل وظيفة ولكن لا يمكنني معرفة كيفية تمرير هذا أو اختبار الأخطاء المختلفة التي يمكن أن تعود إلى كونها صحيحة أم لا.

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

هل كانت مفيدة؟

المحلول

إذا كانت فئات المستخدم المختلفة لديك ترث من فئة مستخدم أصل، فإنني أوصيك باستخدام نفس بنية الوراثة لفئات حالة الاختبار الخاصة بك.

النظر في فئات العينة التالية:

class User
{
    public function commonFunctionality()
    {
        return 'Something';
    }

    public function modifiedFunctionality()
    {
        return 'One Thing';
    }
}

class SpecialUser extends User
{
    public function specialFunctionality()
    {
        return 'Nothing';
    }

    public function modifiedFunctionality()
    {
        return 'Another Thing';
    }
}

يمكنك القيام بما يلي مع فئات حالة الاختبار الخاصة بك:

class Test_User extends PHPUnit_Framework_TestCase
{
    public function create()
    {
        return new User();
    }

    public function testCommonFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Something', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('One Thing', $user->commonFunctionality);
    }
}

class Test_SpecialUser extends Test_User
{
    public function create() {
        return new SpecialUser();
    }

    public function testSpecialFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Nothing', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Another Thing', $user->commonFunctionality);
    }
}

نظرًا لأن كل اختبار يعتمد على طريقة إنشاء يمكنك تجاوزها، ولأن طرق الاختبار موروثة من فئة الاختبار الأصل، فسيتم تشغيل جميع اختبارات الفئة الأصل مقابل الفئة الفرعية، إلا إذا قمت بتجاوزها لتغيير السلوك المتوقع.

لقد نجح هذا بشكل رائع في تجربتي المحدودة.

نصائح أخرى

إذا كنت تتطلع إلى اختبار واجهة المستخدم الفعلية، فيمكنك تجربة استخدام شيء مثل السيلينيوم (www.openqa.org).يتيح لك كتابة الكود بلغة PHP (والذي أفترض أنه سيعمل مع phpUnit) لتشغيل المتصفح..

هناك طريقة أخرى تتمثل في الحصول على طريقة مشتركة يمكن استدعاؤها بواسطة كل اختبار لنوع المستخدم المختلف الخاص بك.على سبيل المثال، شيء مثل "ValidatePage"، والذي يمكنك بعد ذلك الاتصال به من TestAdminUser أو TestRegularUser والحصول على الطريقة التي تؤدي ببساطة نفس التحقق الأساسي لما تتوقعه.

فقط تأكد من أنك لا تواجه مكافحة النمط هنا.ربما كنت تفعل الكثير من العمل في المنشئ؟أو ربما ينبغي أن تكون هذه في الواقع فئات مختلفة؟غالبًا ما تعطيك الاختبارات أدلة حول تصميم الكود. استمع لهم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top