إنشاء JUnit مجموعة الاختبار مع مثال: @RunWith @SuiteClasses
⚡ ملخص ذكي
JUnit تقوم مجموعات الاختبار بتجميع حالات الاختبار من عدة فئات بحيث يتم تشغيلها معًا في تمريرة واحدة، مدفوعة بالتعليقات التوضيحية @RunWith(Suite.class) و @SuiteClasses ويتم تشغيلها من خلال فئة تشغيل اختبار عادية.
In JUnitتتيح لنا مجموعة الاختبارات تجميع كل شيء حالات تجريبية من عدة فئات في مكان واحد وتشغيلها معًا.
لتشغيل اختبار المجموعة، تحتاج إلى إضافة تعليقات توضيحية إلى فئة باستخدام التعليقات التوضيحية المذكورة أدناه:
- @RunWith(Suite.class)
- @SuiteClasses(test1.class, test2.class…) or @Suite.SuiteClasses({test1.class, test2.class…})
مع إضافة التعليقات التوضيحية المذكورة أعلاه، ستبدأ جميع فئات الاختبار في المجموعة بالتنفيذ واحدة تلو الأخرى. وتبقى فئة المجموعة نفسها فارغة: فهي مجرد حاوية للتعليقات التوضيحية، ويقرأ المُشغِّل هذه التعليقات لتحديد ما سيتم تنفيذه.
خطوات إنشاء مجموعة الاختبار وعداء الاختبار
الخطوات الأربع التالية تبني أصغر مجموعة اختبار يتم تشغيلها فعليًا: فئتان اختبار عاديتان، وفئة مجموعة اختبار تسميهما، ومشغل يبدأ تشغيل المجموعة من طريقة رئيسية.
الخطوة 1) أنشئ فئة اختبار بسيطة (مثل MyFirstClassTest) وأضف إليها دالة مُعلَّمة بـ @اختبار.
تحتوي الفئة الأولى على طريقة اختبار فارغة واحدة، وهو ما يكفي لإثبات أن مجموعة الاختبارات تكتشفها:
الخطوة 2) قم بإنشاء فئة اختبار أخرى لإضافتها (على سبيل المثال MySecondClassTest) وقم بإنشاء طريقة مع تعليق توضيحي باستخدام @Test.
يتبع الصنف الثاني نفس الشكل تمامًا، لذا فإن المجموعة تحتوي على صنفين منفصلين للتجميع:
الخطوة 3) لإنشاء مجموعة اختبار، تحتاج أولاً إلى إضافة التعليقات التوضيحية إلى الفئة باستخدام @RunWith(Suite.class) و @SuiteClasses(class1.class, class2.class…).
لاحظ أن فئة المجموعة TestSuiteExample لا تُعلن عن أي طريقة اختبار خاصة بها - فالتعليقان التوضيحيان يحملان جميع المعلومات:
الخطوة 4) أنشئ فئة Test Runner لتشغيل مجموعة الاختبارات الخاصة بنا كما هو موضح أدناه:
العداء عادي Java فئة تحتوي على دالة رئيسية تُمرر فئة المجموعة إلى JUnitالجذع:
Code التفسير:
- Code خط 8: تعريف الدالة الرئيسية للفئة Test التي ستشغل برنامجنا JUnit الاختبار.
- Code خط 9: تنفيذ حالات الاختبار باستخدام JUnitCore.runClasses الذي يأخذ اسم فئة الاختبار كمعامل (في المثال أعلاه، أنت تستخدم TestSuiteExample.class الموضح في الخطوة 3).
- Code خط 11: معالجة النتيجة باستخدام حلقة تكرارية وطباعة النتيجة الفاشلة.
- Code خط 13: طباعة النتيجة الناجحة.
الإخراج: هذه هي النتيجة التي تُظهر نجاح الاختبار دون أي فشل. trace كما هو موضح أدناه:
يؤكد الشريط الأخضر الغرض من المجموعة: تشغيل واحد، وعرض نتائج واحد، ويتم الإبلاغ عن كلا الفئتين أسفل عقدة المجموعة بدلاً من تشغيلهما في عمليتي تشغيل منفصلتين.
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ستحصل على المخرجات الموضحة أدناه. تقوم وحدة التحكم بطباعة الرسائل التي تنتجها كلتا الفئتين:
استخدم JUnit يعرض السجل نفس عملية التشغيل كثلاث طرق اختبار ناجحة مجمعة تحت فئة المجموعة:
ملاحظة: في هذا المثال، تتداخل تسميات وحدة التحكم - فالسلسلة التي يطبعها 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 مطلقًا، وهو أحد أكثر أنماط الفشل هدوءًا في اختبار البرمجيات.







