أقل من زوجين. طريقة أخرى لتقليل عدد الاختبارات

يعرف أي ضمان جودة طريقة لتقليل حالات الاختبار مثل الاختبار الزوجي - الاختبار الزوجي. الطريقة ممتازة وبسيطة للغاية ومثبتة من قبل العديد من الفرق. ولكن ماذا لو بقيت العديد من الحالات بعد استخدامه؟



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



صورة



كائن الاختبار



أولاً ، سأخبرك قليلاً عن المنتج. في Tinkoff ، طور فريقنا الكتل - هذه مكونات React تتكون من التنفيذ والتكوين. التنفيذ هو المكون نفسه الذي قمنا بتطويره والذي يراه المستخدم في المتصفح. التكوين هو JSON الذي يحدد معاملات ومحتوى هذا الكائن.



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

على سبيل المثال ، يمكن أن تكون الكتلة على هذا النحو - بدون خلفية ، مع وجود زر وصورة على اليمين:



صورة



أو مثل هذا - بخلفية ، بدون زر وصورة على اليسار:



صورة



أو بشكل عام ، مثل هذا - مع ارتباط بدلاً من زر وبدون قائمة في النص:



صورة



جميع الأمثلة المذكورة أعلاه هي نفس الكتلة التي تحتوي على إصدار واحد من التكوين (بنية JSON التي يمكن لمكون React هذا التعامل معها) ، ولكن محتواها مختلف.



الدائرة نفسها:



{
  components: {
    background: color,

    panel: {
      panelProps: {
        color: {
          style: ['outline', 'color', 'shadow', 'custom'],

          background: color
        },

        size: ['s', 'm', 'l'],

        imagePosition: ['left', 'right']
      },

      title: {
        text: text,

        size: ['s', 'l'],

        htmlTag: ['div', 'b', 'strong', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']
      },

      description: {
        text: html,

        htmlTag: ['div', 'b', 'strong', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']
      },

      image: {
        alt: text,

        title: text,

        image: {
          src: image,

          srcset: [{
            src: image,

            condition: ['2x', '3x']
          }],

          webpSrcset: [{
            src: image,

            condition: ['1x', '2x', '3x']
          }]
        },

        imageAlign: ['top', 'center', 'bottom']
      },

      button: {
        active: boolean,

        text: text,

        color: {
          style: ['primary', 'secondary', 'outline', 'outlineDark', 'outlineLight', 'textLink', 'custom'],

          backgroundColor: color
        },

        onClick: {
          action: ['goToLink', 'goToBlock', 'showBlock', 'crossSale', 'callFormEvent'],

          nofollow: boolean,

          url: url,

          targetBlank: boolean,

          title: text,

          noindex: boolean,

          guid: guid,

          guidList: [{
            guid: guid
          }],

          formId: guid,

          crossSaleUrl: url,

          eventName: text
        },

        htmlTag: ['div', 'b', 'strong', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']
      },

      href: url
    }
  }
}


في هذه الحالة ، سيكون للكتلة التي تحتوي على الصورة على اليمين قيمة components.panel.imagePosition = right. والكتلة التي بها الصورة على اليسار بها components.panel.imagePosition = left. لكتلة مع زر - components.button.active = trueوهلم جرا. آمل أن يكون المبدأ واضحًا. هذه هي الطريقة التي يتم بها تعيين جميع معلمات الكتلة.



حالات من مجموعة من المعلمات



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



صورة



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



دعونا نقدر عدد حالات الاختبار التي سنحصل عليها عند تطبيقه. لدينا أكثر من 25 معلمة ، وبعضها يأخذ ما يصل إلى 7 و 9 متغيرات من القيم. نعم ، يمكنك إهمال شيء ما: على سبيل المثال ، إذا كنت تتحقق من التخطيط ، فإن الدليل الإرشادي غير مهم بالنسبة لك. ولكن باستخدام اختبار الأزواج ، ستستمر في الحصول على أكثر من 80 حالة اختبار. وهذا ، كما كتبت بالفعل ، ليس هو الكتلة الأكثر تعقيدًا ودون مراعاة التوافق عبر المستعرضات. لدينا الآن أكثر من 150 مجموعة ، وعددها آخذ في الازدياد ، لذلك لا يمكننا تحمل الكثير من الحالات إذا أردنا الحفاظ على سرعة اختبار الإصدارات الجديدة وإصدارها.



حالات من معلمة واحدة



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



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



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



 button: {
        active: boolean,

        text: text,

        color: {
          style: ['primary', 'secondary', 'outline', 'custom'],

          backgroundColor: color
        }


لتبسيط المثال ، قمت بتقليل طول القائمة إلى button.color.style.



الخطوة 1. قم بتكوين خيارات المحتوى لكل حقل



كل شيء هنا يشبه الاختبار الزوجي: تحتاج إلى فهم القيم التي يمكن أن يتخذها كل حقل. على سبيل المثال ، button.activeفي حالتنا ، قد توجد قيمتان فقط: trueأو false. من الناحية النظرية ، قد تظهر المزيد من الخيارات ، على سبيل المثال ، undefinedعدم وجود المفتاح نفسه.



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



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



لذلك ، حددنا خيارات المحتوى لكل حقل وقمنا بعمل الجدول التالي:



صورة



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



هذه هي فئات القيمة في حالتنا ، الفئات:



  • text_s - سلسلة قصيرة ؛
  • text_m - سلسلة أطول ؛
  • no_color - لا لون ؛
  • rnd_color هو أي لون.


الخطوة الثانية. إثراء الجدول بالبيانات



نظرًا لأن كل كتلة تحمل التكوين الكامل ، نحتاج إلى إضافة بعض البيانات ذات الصلة إلى الخلايا الفارغة:



صورة



الآن كل عمود هو حالة واحدة.



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



في المثال أعلاه ، يمكنك أيضًا الانتباه إلى الحالات "المسقطة" - الحالات التي لا يتم فيها التحقق من بعض المعلمات على الإطلاق ، على الرغم من وجودها في الجدول. في هذه الحالة ، button.color.style: secondaryلن يتم التحقق من ظهوره ، لأنه لا يهم النمط الذي يمتلكه الزر المعطل.



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



الحل الأكثر عمومية هو تقسيم كل القيم إلى مجموعتين:



  1. القيم غير الآمنة (تلك التي يمكن أن تؤدي إلى "فقدان" القضايا) ؛
  2. آمنة (والتي لا يمكن أن تؤدي إلى "السقوط").


يتم فحص كل قيمة غير آمنة في حالة الاختبار الخاصة بها ، ويمكنك إثراء الحالة بأي بيانات آمنة. للقيم الآمنة ، يتم تجميع الجدول وفقًا للإرشادات أعلاه.



الخطوة 3. توضيح القيم



الآن كل ما تبقى هو إنشاء قيم ملموسة بدلاً من فئات التكافؤ.



صورة



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



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



  • علامة html (أي واحد) ؛
  • حلقة الوصل؛
  • قائمة غير مرقمة.


هذه المجموعة من الحالات تنبع مباشرة من تنفيذ الكتلة لدينا. على سبيل المثال ، يتم تضمين جميع علامات html معًا ، لذلك لا فائدة من اختبار كل منها. في هذه الحالة ، يتم التحقق من الرابط والقائمة بشكل منفصل ، لأن لديهم معالجة مرئية منفصلة (تسليط الضوء على التمرير والتصويب).



اتضح أنه لكل مشروع تحتاج إلى تكوين مجموعة المحتوى الفعلية الخاصة بك بناءً على تنفيذ الكائن الذي تم اختباره.



الخوارزمية



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



الخطوة 1. أضف جميع القيم الممكنة إلى جدول المعلمات:



صورة



الخطوة 2. قم بتكرار القيم في خلايا فارغة:



صورة



الخطوة 3. حول القيم المجردة إلى قيم محددة واحصل على الحالات:



صورة



كل عمود في الجدول يمثل حالة واحدة.



مزايا النهج



تتميز طريقة توليد حالات الاختبار هذه بالعديد من المزايا المهمة.



صورة



حالات أقل



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



كلما زاد عدد المعلمات الموجودة في الكائن الذي تم اختباره ، زادت أهمية توفير الحالة. على سبيل المثال ، بالنسبة للكتلة الكاملة المقدمة في بداية المقالة ، نحصل على 11 حالة ، وبمساعدة الزوج - 260.



لا يتضخم عدد الحالات عندما تصبح الوظيفة أكثر تعقيدًا



الإضافة الثانية هي أنه عند أخذ المعلمات الجديدة في الاعتبار أثناء الاختبار ، لا يزداد عدد الحالات دائمًا.



على سبيل المثال ، افترض وجود معلمة button.color.textColorبفئات تكافؤ القيمة no_colorوتم إضافتها إلى زرنا rnd_color. ثم ستبقى 4 حالات ، ستتم إضافة معلمة واحدة فقط إلى كل منها:



صورة



سيزداد عدد الحالات فقط إذا كان لبعض المعلمات قيمًا أكثر من الحالات.



يمكنك التحقق من المهم في كثير من الأحيان



من خلال إثراء القيم (الخطوة 2 في الخوارزمية) ، يمكن التحقق أكثر من القيم ذات الأولوية الأعلى أو الأكثر خطورة.



على سبيل المثال ، إذا علمنا أن المستخدمين السابقين استخدموا نصًا أقصر في كثير من الأحيان ، والآن يستخدمون نصًا أطول ، فيمكننا إثراء الحالات بنص أطول وغالبًا ما ندخل في حالات مستخدم حقيقية.



يمكن أن تكون مؤتمتة



الخوارزمية المذكورة أعلاه قابلة تمامًا للأتمتة. بالطبع ، ستبدو الحالات التي تم إنشاؤها بواسطة الخوارزمية أقل شبهاً بالحالات الحقيقية من الحالات التي يولدها الإنسان. على الأقل عن طريق مطابقة الألوان واقتصاص النص.



ولكن من ناحية أخرى ، في عملية التطوير بالفعل دون مشاركة أحد المختبرين ، تظهر الحالات ، مما يقلل بشكل كبير من حلقة التغذية الراجعة.



صورة



سلبيات



وبطبيعة الحال ، فإن إنشاء مثل هذه الحالات بعيد كل البعد عن الحل الفضي وله عيوبه.



صعوبة تحليل النتيجة



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



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



قد يتم تفويت الأخطاء



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



من أجل عدم تفويت الأخطاء مرتين ، قدمنا سياسة Zero Bug وبدأنا في إغلاق كل خطأ فائت بحالة اختبار إضافية - لم يعد يتم إنشاؤها تلقائيًا ، ولكن مكتوبة بخط اليد. أعطى هذا نتائج ممتازة: لدينا الآن أكثر من 150 قالبًا (كائنات مختبرة) ، والعديد من الإصدارات يوميًا ومن 0 إلى 3 أخطاء غير خطيرة مفقودة في الشهر.



الاستنتاجات



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



في رأيي ، إنه مثالي لمكونات الواجهة الأمامية: يمكنك تقليل الوقت بأكثر من ثلاث مرات ، على سبيل المثال ، للتحقق من المظهر من خلال اختبار لقطة الشاشة. وسيجري التطور بشكل أسرع بسبب ظهور الحالات في المراحل الأولى.



بالطبع ، إذا كنت تختبر الطيار الآلي لـ Tesla الجديدة ، فلا يمكنك إهمال حتى الاحتمال الضئيل لخطأ ما. لكن في معظم الحالات ، لا تنس أن السرعة في العالم الحديث هي معيار جودة مهم للغاية. وتعطي الزيادة في السرعة نتائج إيجابية أكثر من مشكلتين بسيطتين.



صورة



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



All Articles