إنشاء JUnit مجموعة الاختبار مع مثال: @RunWith @SuiteClasses

⚡ ملخص ذكي

JUnit تقوم مجموعات الاختبار بتجميع حالات الاختبار من عدة فئات بحيث يتم تشغيلها معًا في تمريرة واحدة، مدفوعة بالتعليقات التوضيحية @RunWith(Suite.class) و @SuiteClasses ويتم تشغيلها من خلال فئة تشغيل اختبار عادية.

  • 🔘 الغرض: قم بتجميع الاختبارات من العديد من الفئات في وحدة واحدة قابلة للتنفيذ بدلاً من تشغيل كل فئة اختبار على حدة.
  • ☑️ شروح: يقوم @RunWith(Suite.class) بتفويض التنفيذ، بينما يقوم @SuiteClasses بإدراج كل فئة يجب تشغيلها بواسطة المجموعة.
  • ✅ الخطوات التالية: اكتب فئات الاختبار، وأضف فئة حاملة تحمل كلا التعليقين التوضيحيين، ثم قم بتشغيلها من JUnitعداء أساسي.
  • 🧪 على سبيل المثال: يقوم ملف JunitTest.java بتجميع SuiteTest1 و SuiteTest2، ويشير جهاز التحكم إلى نجاح ثلاثة اختبارات.
  • 🛠️ JUnit 5: يستبدل Jupiter العداء بـ @Suite بالإضافة إلى @SelectClasses أو @SelectPackages على محرك مجموعة النظام الأساسي.
  • 📌 المزالق: تتسبب المجموعات الفارغة، والواردات المفقودة، وفئة المجموعة التي تحتوي على طرق @Test الخاصة بها في معظم حالات الفشل.

خلق JUnit مجموعة اختبار مع تعليقات توضيحية @RunWith و @SuiteClasses

In JUnitتتيح لنا مجموعة الاختبارات تجميع كل شيء حالات تجريبية من عدة فئات في مكان واحد وتشغيلها معًا.

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

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) or @Suite.SuiteClasses({test1.class, test2.class…})

مع إضافة التعليقات التوضيحية المذكورة أعلاه، ستبدأ جميع فئات الاختبار في المجموعة بالتنفيذ واحدة تلو الأخرى. وتبقى فئة المجموعة نفسها فارغة: فهي مجرد حاوية للتعليقات التوضيحية، ويقرأ المُشغِّل هذه التعليقات لتحديد ما سيتم تنفيذه.

خطوات إنشاء مجموعة الاختبار وعداء الاختبار

الخطوات الأربع التالية تبني أصغر مجموعة اختبار يتم تشغيلها فعليًا: فئتان اختبار عاديتان، وفئة مجموعة اختبار تسميهما، ومشغل يبدأ تشغيل المجموعة من طريقة رئيسية.

الخطوة 1) أنشئ فئة اختبار بسيطة (مثل MyFirstClassTest) وأضف إليها دالة مُعلَّمة بـ @اختبار.

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

فئة MyFirstClassTest في Eclipse تعريف دالة myFirstMethod مع التعليق التوضيحي @Test

الخطوة 2) قم بإنشاء فئة اختبار أخرى لإضافتها (على سبيل المثال MySecondClassTest) وقم بإنشاء طريقة مع تعليق توضيحي باستخدام @Test.

يتبع الصنف الثاني نفس الشكل تمامًا، لذا فإن المجموعة تحتوي على صنفين منفصلين للتجميع:

فئة MySecondClassTest في Eclipse تعريف دالة mySecondMethod مع التعليق التوضيحي @Test

الخطوة 3) لإنشاء مجموعة اختبار، تحتاج أولاً إلى إضافة التعليقات التوضيحية إلى الفئة باستخدام @RunWith(Suite.class) و @SuiteClasses(class1.class, class2.class…).

لاحظ أن فئة المجموعة TestSuiteExample لا تُعلن عن أي طريقة اختبار خاصة بها - فالتعليقان التوضيحيان يحملان جميع المعلومات:

TestSuiteExample مُعَلَّم بـ @RunWith(Suite.class) و @SuiteClasses، ويُسمي MyFirstClassTest و MySecondClassTest

الخطوة 4) أنشئ فئة Test Runner لتشغيل مجموعة الاختبارات الخاصة بنا كما هو موضح أدناه:

العداء عادي Java فئة تحتوي على دالة رئيسية تُمرر فئة المجموعة إلى JUnitالجذع:

استدعاء فئة مُشغّل الاختبار JUnitCore.runClasses على TestSuiteExample وطباعة قائمة الأخطاء

Code التفسير:

  • Code خط 8: تعريف الدالة الرئيسية للفئة Test التي ستشغل برنامجنا JUnit الاختبار.
  • Code خط 9: تنفيذ حالات الاختبار باستخدام JUnitCore.runClasses الذي يأخذ اسم فئة الاختبار كمعامل (في المثال أعلاه، أنت تستخدم TestSuiteExample.class الموضح في الخطوة 3).
  • Code خط 11: معالجة النتيجة باستخدام حلقة تكرارية وطباعة النتيجة الفاشلة.
  • Code خط 13: طباعة النتيجة الناجحة.

الإخراج: هذه هي النتيجة التي تُظهر نجاح الاختبار دون أي فشل. trace كما هو موضح أدناه:

Eclipse JUnit عرض تقرير التشغيل: تم تشغيل 2/2 بدون أخطاء أو حالات فشل لمجموعة الاختبار TestSuiteExample

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

JUnit مثال على مجموعة الاختبار

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

برنامج JunitTest.java

JunitTest.java عبارة عن فئة بسيطة مُعلَّقة بـ @إركض مع و @جناح التعليقات التوضيحية. يمكنك إدراج أي عدد من الفئات في المجموعة كمعلمات، كما هو موضح أدناه:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java هي فئة اختبار تحتوي على طرق اختبار تطبع رسالة، كما هو موضح أدناه. ستستخدم هذه الفئة كعضو في مجموعة الاختبار في الفئة المذكورة أعلاه. وهي تعتمد على فئة مساعدة تُسمى JUnitالرسالة، التي تم تعريفها في مكان آخر في نفس الحزمة ولم يتم إعادة إنتاجها هنا.

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java وهي فئة اختبار أخرى، مشابهة لـ SuiteTest1.javaيتضمن هذا البرنامج دالة اختبار لطباعة رسالة كما هو موضح أدناه. ستستخدم هذه الفئة كعضو في مجموعة البرامج. برنامج JunitTest.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

الناتج

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

Eclipse وحدة التحكم تعرض الرسائل المطبوعة من كلا مجموعتي الاختبارات بعد انتهاء اختبار JUnit

استخدم JUnit يعرض السجل نفس عملية التشغيل كثلاث طرق اختبار ناجحة مجمعة تحت فئة المجموعة:

Eclipse JUnit عرض التقارير: تم تشغيل 3/3 بنجاح لاختبار JUnit مع توسيع SuiteTest1 و SuiteTest2

ملاحظة: في هذا المثال، تتداخل تسميات وحدة التحكم - فالسلسلة التي يطبعها SuiteTest1 هي "Suite Test 2"، بينما السلسلة التي يطبعها SuiteTest2 هي "Suite Test 1". تمت إعادة إنتاج القوائم الأصلية دون تغيير، لذا تبقى التسميات كما كتبها المؤلف؛ اقرأ اسم الفئة في JUnit اعرض الملصق بدلاً من الملصق المطبوع عند مطابقة المخرجات مع المصدر.

كيفية إنشاء مجموعة اختبار في JUnit 5

JUnit الإصدار 5 يُزيل المُشغّلات بالكامل، لذا فإنّ @RunWith(Suite.class) غير موجود في حزم org.junit.jupiter. تمّ نقل المجموعات إلى JUnit المنصة، التي تشحنها في قطعة أثرية منفصلة تسمى محرك مجموعة منصات جونيتأضف تلك التبعية، ثم قم بتعليق فئة باستخدام @Suite وأحد تعليقات المحدد.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

تستبدل التعليقات التوضيحية للمحدد قائمة @SuiteClasses المفردة بمجموعة صغيرة من الخيارات:

حاشية ما الذي يختاره
@SelectClasses تم تسمية فئات الاختبار الفردية واحدة تلو الأخرى، وهي البديل المباشر لـ @SuiteClasses.
@SelectPackages كل فئة اختبار في الحزمة المسماة وفي جميع حزمها الفرعية.
@IncludeClassNamePatterns تم تطبيق مرشح التعبير النمطي على الجزء المحدد.
@SuiteDisplayName اسم قابل للقراءة يظهر في التقرير بدلاً من اسم الفئة.

هناك فرقان آخران مهمان من الناحية العملية. أ. JUnit قد يُعلن صنف المجموعة 5 عن طريقتي @BeforeSuite و @AfterSuite، اللتين تُنفذان مرة واحدة على المجموعة بأكملها، و JUnit لا يزال المثال الرابع أعلاه يعمل على JUnit يتم تشغيل المنصة من خلال محرك قديم، لذلك لا يلزم إعادة كتابة الكود الأصلي الموجود في هذه الصفحة لكي يستمر في العمل.

مزايا وقيود JUnit أجنحة الاختبار

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

المزايا

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

القيود

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

الأخطاء الشائعة عند إنشاء JUnit حزمة اختبار

تُنتج معظم مشاكل البرامج النصية رسالة قصيرة وغير مفيدة. يوضح الجدول الرسائل التي من المحتمل أن تواجهها وأسبابها وحلولها.

رسالة أو عرض سبب حل
خطأ في التهيئة: لا توجد طرق قابلة للتنفيذ يتم تشغيل الفئة كفئة اختبار عادية، ولكنها لا تحتوي إلا على التعليقات التوضيحية. أضف @RunWith(Suite.class) حتى يتولى مشغل المجموعة زمام الأمور بدلاً من المشغل الافتراضي.
تعذر العثور على الرمز: فئة Suite ملف استيراد المجموعة مفقود. قم باستيراد org.junit.runners.Suite جنبًا إلى جنب مع org.junit.runner.RunWith.
يتم تشغيل البرنامج، ولكن يتم تخطي فصل دراسي. لم تتم إضافة الفئة إلى قائمة @SuiteClasses. أضف الفئة بشكل صريح، أو انتقل إلى @SelectPackages في JUnit 5.
اسم الفئة غير مقبول من قبل المترجم تم كتابة @Runwith أو @suiteClasses بأحرف كبيرة وصغيرة خاطئة. Java التعليقات التوضيحية حساسة لحالة الأحرف: اكتب @RunWith و @SuiteClasses بالضبط.
لا يتم تشغيل الاختبارات في فئة المجموعة نفسها تمت إضافة طريقة @Test إلى حامل المجموعة. أبقِ الحامل فارغًا وانقل طريقة الاختبار إلى فئة عضو.

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

الأسئلة الشائعة

تقوم المجموعة بتنفيذ الفئات بالترتيب المذكور، ولكن JUnit لا يضمن هذا الترتيب ترتيب تنفيذ الدوال داخل كل فئة. الاختبارات التي تعتمد على تنفيذ اختبار سابق تكون هشة، ويجب إعادة كتابتها لتكون مستقلة.

نعم. تُعتبر فئة المجموعة فئة عادية بالنسبة للمُشغِّل، لذا فإن تسميتها داخل قائمة @SuiteClasses أخرى يُضمِّن المجموعات. يُعدّ التداخل مفيدًا لمجموعة اختبارات الانحدار الرئيسية المُكوَّنة من مجموعات وحدات أصغر.

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

مساعد طيار يكتب زوج التعليقات التوضيحية بسرعة، لكنه يخلط بينهما في كثير من الأحيان. JUnit و4 JUnit خمسة استيرادات في نفس الملف. تأكد من عدم ظهور org.junit.runners.Suite و org.junit.platform.suite.api.Suite معًا، لأن أحدهما فقط يطابق برنامج التشغيل الخاص بك.

أضف junit-platform-suite-engine إلى نطاق الاختبار. توجد التعليقات التوضيحية @Suite و@SelectClasses في junit-platform-suite-api، والتي يستدعيها هذا العنصر من المحرك بشكل غير مباشر، لذا فإن تبعية واحدة تكفي عادةً.

ليس عادةً. شركة Surefire و Gradle تكتشف مهمة الاختبار بالفعل فئات الاختبار من خلال نمط التسمية وتُشغّلها جميعًا. من المفيد كتابة مجموعة اختبارات عندما تريد مجموعة فرعية مُسماة، مثل مجموعة اختبارات الدخان، تكون أصغر من التشغيل الكامل.

يُبلغ المُشغّل عن خطأ في تهيئة هذا العضو، مُشيرًا إلى عدم العثور على أي دوال قابلة للتنفيذ، ويتم وضع علامة "فشل" على المجموعة بأكملها. قم بإزالة الإدخال أو أضف دالة @Test إلى الفئة.

ليس داخل قائمة مُحدِّد واحدة. احتفظ بـ JUnit أربع فئات على محرك كلاسيكي، ويمكنك اختيارها من بين JUnit خمس مجموعات حسب الحزمة، لذا يعمل كلا المحركين بنفس الطريقة JUnit إطلاق المنصة دون خلط عائلات التعليقات التوضيحية.

تلخيص هذه التدوينة بـ: