استبعاد طرق اختبار Junit الفردية دون تعديل فئة الاختبار؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

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

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

هل هناك طريقة لاستبعاد الاختبارات الفردية دون تعديل مصدر الاختبار؟ هذا ما نظرت إليه حتى الآن:

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

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

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

  • الخيار الآخر الوحيد الذي يمكنني التفكير فيه هو إجراء الاختبارات السيئة على أي حال وتجاهل الإخفاقات. ومع ذلك ، فإن هذه الاختبارات تستغرق بعض الوقت للتشغيل (وفشل!) لذلك أفضل عدم تشغيلها على الإطلاق. بالإضافة إلى ذلك ، لا يمكنني رؤية طريقة لإخبار مهمة ANT بتجاهل الفشل على طرق اختبار محددة (مرة أخرى - أرى كيف يمكنك القيام بذلك لفئات الاختبار الفردية ، ولكن ليس الطرق).

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

المحلول

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

قم ببناء اختبارات ANT باستثناء الفصول الدراسية الفائقة ، بحيث لا تعرف الفصول الإضافية التي لا تعرفها عن GET.

يمكنك استخدام التعليق التوضيحي @Rule (جديد على Junit 4.7) لمعرفة الاختبار الذي يجري تشغيله وإحباطه (من خلال إرجاع تنفيذ بيان فارغ) بدلاً من تجاوز طرق محددة ، مما يتيح لك المزيد من المرونة في معرفة ما إذا كنت ستتجنب الاختبار أم لا. . المشكلة الوحيدة في هذه الطريقة هي أنه لا يمكنك إيقاف طرق التشغيل من التشغيل باستخدام هذه الطريقة ، والتي قد تكون بطيئة. إذا كانت هذه مشكلة (ولا يمكنك حقًا لمس الاختبارات) ، فإن ignore في طريقة تجاوزها هو الشيء الوحيد الذي يمكنني التفكير فيه.

ومع ذلك ، إذا يمكنك لمس هذه الاختبارات ، فإن بعض الخيارات الإضافية تفتح:

يمكنك تشغيلها مع عداء مخصص من خلال تحديد علامة Runwith على الفصل. سوف ينتقل هذا العداء إلى التنفيذ إلى العداء القياسي (Junit4.Class) في هذا المشروع ، ولكن في مشروعك (عبر خاصية النظام أو بعض الآلية الأخرى) من شأنه أن يفحص اسم الاختبار ولا يقوم بإجراء اختبار. هذا يتمتع بميزة كونه الأقل تدخلاً ، ولكن الأكثر صعوبة في تنفيذها (العدائين هم الوحوش المشعر ، أحد الأهداف المعلنة لـ @Rule هو القضاء على معظم الحاجة إلى صنعها).

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

نصائح أخرى

لا يساعدك الآن ، لكن TestNG يدعم هذا النوع من القدرة.

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

جوهر Junit4 هو org.junit.runner.Runner الطبقة ، وعلى فئات فرعية مختلفة ، والأهم من ذلك org.junit.runners.Suite. يحدد هؤلاء المتسابقون ما هي الاختبارات لفئة اختبار معينة ، باستخدام أشياء مثل test و ignore.

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

ومع ذلك ، من الناحية النظرية ، يمكنك كتابة مهمة ANT الخاصة بك ، ربما بناءً على مهمة Ant Junit القياسية ، والتي تأخذ عداء الاختبار المخصص الخاص بك ويستخدمها مباشرة ، ويمرر كل فئة اختبار بدورها. يمكن أن يستخدم تطبيق Runner الخاص بك ملف تكوين خارجي يحدد طرق الاختبار التي يجب تجاهلها.

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

إنه لأمر مخز أن مهمة Junit Ant لا توفر آلية لتحديد عداء الاختبار ، وهذا سيكون مثاليًا.

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

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

مكتبة مثل بسيل يمكن استخدامها لتعديل الفئات عند تحميلها.

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

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

إذا كانت الاختبارات غير المرغوب فيها في فئات/حزم محددة ، فيمكنك استخدام مجموعة ملفات مستبعدة في ANT لاستبعادها أثناء الاستيراد.

خيارين

  1. اعمل مع مالك الاختبارات المستعارة لاستخراجهم في فئة منفصلة يمكنك مشاركتها.
  2. قم بإنشاء فئة الاختبار الخاصة بك والتي تتوافق مع فئة الاختبار التي تريد استخدامها. لكل طريقة تريد تضمينها لديك طريقة في فصلك. ستحتاج إلى إنشاء مثيل لفئة الاختبار التي تتصل بها وتفعلها قبل وبعد الأساليب أيضًا إذا كانت في الأصل.
  3. قم بإنشاء عداء Junit مخصص استنادًا إلى blockjunitrunner واستخدمه لتصفية أو في الاختبارات التي تريدها.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top