JUnit برنامج تعليمي للتعليقات التوضيحية مع مثال: ما هو @Test و@After

⚡ ملخص ذكي

JUnit التعليقات التوضيحية هي شكل من أشكال البيانات الوصفية النحوية التي تُضاف إلى Java شفرة المصدر حتى يعرف برنامج تشغيل الاختبار الطرق التي يجب تنفيذها، ومتى يتم تشغيلها، والمدة التي قد تستغرقها كل طريقة.

  • 🔘 @امتحان: يشير إلى دالة عامة فارغة JUnit يتم تنفيذه كحالة اختبار واحدة.
  • ☑️ دورة الحياة: @Before و @After يغلفان كل اختبار، بينما @BeforeClass و @AfterClass يغلفان الفئة.
  • مراقبة: @Ignore يتخطى اختبارًا، @Test(timeout) يحدد وقت التشغيل، @Test(expected) يؤكد حدوث استثناء تم طرحه.
  • 🧪 التأكيدات: توفر org.junit.Assert الدوال assertEquals و assertTrue و assertNull و assertSame و fail().
  • 🛠️ ميراث: ينتمي كل من TestCase و TestResult و TestSuite إلى حزمة junit.framework القديمة.
  • 📊 JUnit 5: يقوم جوبيتر بإعادة تسمية هذه إلى @BeforeEach و @AfterEach و @BeforeAll و @AfterAll و @Disabled.

JUnit شرحٌ للتعليقات التوضيحية يغطي @Test و @Before و @After

ما هي تفاصيل JUnit شروح؟

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

بمعرفة عملية لهذه الشروحات، يمكن للمرء بسهولة تعلم وتطبيق JUnit امتحان. أدناه هو المهم والمستخدم بشكل متكرر JUnit قائمة التعليقات التوضيحية، مع JUnit 5 (كوكب المشتري) ما يعادله بجانب كل واحد:

العدد التسلسلي الشروح الوصف JUnit ما يعادل 5
1. @اختبار هذا التعليق التوضيحي هو بديل لـ junit.framework.TestCase، ويشير إلى أنه يمكن تنفيذ طريقة void العامة المرفقة بها كحالة اختبار. @Test (org.junit.jupiter.api)
2. @قبل يتم استخدام هذا التعليق التوضيحي إذا كنت تريد تنفيذ بعض العبارات مثل الشروط المسبقة قبل كل حالة اختبار. @BeforeEach
3. @قبل الفصل تُستخدم هذه التعليقات التوضيحية إذا كنت ترغب في تنفيذ بعض العبارات قبل جميع حالات الاختبار، على سبيل المثال اتصال اختبار يجب فتحه قبل جميع حالات الاختبار. @BeforeAll
4. @بعد يمكن استخدام هذا التعليق التوضيحي إذا كنت تريد تنفيذ بعض العبارات بعد كل منها حالة الاختبارعلى سبيل المثال، إعادة ضبط المتغيرات أو حذف الملفات المؤقتة. @AfterEach
5. @بعد الفصل يمكن استخدام هذا التعليق التوضيحي إذا كنت ترغب في تنفيذ بعض العبارات بعد جميع حالات الاختبار، على سبيل المثال تحرير الموارد بعد تنفيذ جميع حالات الاختبار. @AfterAll
6. @يتجاهل يمكن استخدام هذا التعليق التوضيحي إذا كنت ترغب في تجاهل بعض العبارات أثناء تنفيذ الاختبار، على سبيل المثال تعطيل بعض حالات الاختبار أثناء تنفيذ الاختبار. @عاجز
7. @اختبار (المهلة = 500) يمكن استخدام هذا التعليق التوضيحي إذا كنت ترغب في تحديد مهلة زمنية أثناء تنفيذ الاختبار، على سبيل المثال إذا كنت تعمل بموجب اتفاقية مستوى الخدمة (SLA) ويجب إكمال الاختبارات في غضون وقت محدد. @Timeout أو assertTimeout
8. @Test(المتوقع=IllegalArgumentException.class) يمكن استخدام هذه الخاصية إذا كنت ترغب في معالجة استثناء ما أثناء تنفيذ الاختبار. على سبيل المثال، إذا كنت ترغب في التحقق مما إذا كانت دالة معينة تُطلق استثناءً محددًا أم لا. assertThrows

JUnit مثال التعليقات التوضيحية

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

الخطوة 1) انظر إلى ما يلي Java فئة تحتوي على طرق متنوعة مرتبطة بالتعليقات التوضيحية المذكورة أعلاه:

مثال على JunitAnnotations.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

الخطوة 2) لنقم بإنشاء فئة تشغيل الاختبار لتنفيذ الاختبار المذكور أعلاه:

TestRunner.java

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

نتيجة متوقعة

  • سيتم تنفيذ جميع حالات الاختبار واحدة تلو الأخرى، ويمكن رؤية جميع عبارات الطباعة على وحدة التحكم.
  • كما هو موضح في الجدول أعلاه، فإن @Before و @BeforeClass في JUnit سيتم تنفيذ [الطريقتين m2() و m1()] قبل كل حالة اختبار وقبل جميع حالات الاختبار على التوالي.
  • بنفس الطريقة التي اتبعتها @After و @AfterClass في JUnit سيتم تنفيذ الدالتين m4() و m3() بعد كل حالة اختبار وبعد جميع حالات الاختبار على التوالي. سيتم التعامل مع الدالة m6() (@Ignore) على أنها تتجاهل الاختبار.

لنقم بتحليل حالات الاختبار المستخدمة أعلاه Java شرح مفصل للدرس:

  1. ضع في اعتبارك الطريقة m5() كما هو موضح أدناه:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

في الطريقة المذكورة أعلاه، أثناء إضافة سلسلة نصية إلى المتغير "list":

  • القائمة فارغة() سيعود خطأ.
  • AssureFalse(list.isEmpty()) يجب أن يعود صحيحا.
  • ونتيجة لذلك، فإن حالة الاختبار سوف pass .

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

  • حجم القائمة () يجب أن تُرجع القيمة العددية "1".
  • So AssurEquals(1, list.size()) يجب أن يعود صحيحا.
  • ونتيجة لذلك، فإن حالة الاختبار سوف pass .
  1. ضع في اعتبارك الطريقة m7() كما هو موضح أدناه:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

كما نوقش أعلاه، @اختبار (المهلة = 10) يُستخدم هذا لفرض مهلة زمنية في حالة الاختبار. القيمة مُقاسة بالمللي ثانية، لذا يجب أن تنتهي الدالة m7() في غضون 10 مللي ثانية.

  1. ضع في اعتبارك الطريقة m8() كما هو موضح أدناه:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

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

ملاحظة بشأن الدقة: تقوم الدالة m8() بطباعة سطر واحد فقط، لذا فإن الاستثناء المعلن لا يتم طرحه فعلياً. JUnit 4. يُشير التقرير إلى فشل الاختبار. يجب مطابقة النوع المتوقع مع النوع الذي يُصدره الأسلوب فعليًا. JUnit يكتب 5 هذا باستخدام assertThrows.

عندما يتم اجتياز جميع حالات الاختبار، يؤدي ذلك إلى تنفيذ اختبار ناجح.

نتيجة فعلية

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

Eclipse مخرجات وحدة التحكم التي تعرض عبارات الطباعة @BeforeClass و @Before و @After و @AfterClass
مخرجات وحدة التحكم التي ينتجها JunitAnnotationsExample

انظر أدناه بيانات الطباعة التي يمكن رؤيتها على وحدة التحكم:

باستخدام @BeforeClass، يتم تنفيذه قبل جميع حالات الاختبار

استخدام التعليقات التوضيحية @Before، والتي يتم تنفيذها قبل كل حالات الاختبار

باستخدام @After، يتم تنفيذه بعد كل حالة اختبار

استخدام التعليقات التوضيحية @Before، والتي يتم تنفيذها قبل كل حالات الاختبار

باستخدام @Test(timeout)، يمكن استخدامه لفرض المهلة JUnit4 حالة اختبار

باستخدام @After، يتم تنفيذه بعد كل حالة اختبار

استخدام التعليقات التوضيحية @Before، والتي يتم تنفيذها قبل كل حالات الاختبار

باستخدام @Test(expected)، سيتم التحقق من الاستثناء المحدد أثناء تنفيذه

باستخدام @After، يتم تنفيذه بعد كل حالة اختبار

باستخدامAfterClass، يتم تنفيذه بعد كل حالات الاختبار

JUnit تأكيد الطبقة

تحدد التعليقات التوضيحية متى يتم تشغيل الطريقة؛ وتحدد طرق التأكيد ما إذا كانت ستنجح أم لا.

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

كما رأيتم سابقاً، يوضح الجدول أدناه طرق التأكيد المهمة ووصفها:

العدد التسلسلي الأسلوب الوصف
1. تأكيد باطل (منطقي متوقع، منطقي فعلي) يتحقق مما إذا كانت قيمتان متساويتين، على غرار طريقة equals الخاصة بفئة Object.
2. تأكيد باطلة (شرط منطقي) تتمثل الوظيفة في التحقق من أن الشرط خاطئ.
3. تأكيد باطلةNotNull (كائن كائن) وظيفة "assertNotNull" هي التحقق من أن الكائن ليس فارغًا.
4. تأكيد باطلة (كائن كائن) وظيفة "assertNull" هي التحقق من أن الكائن فارغ.
5. تأكيد باطلة (شرط منطقي) وظيفة "assertTrue" هي التحقق من صحة الشرط.
6. فشل باطل () إذا كنت ترغب في إظهار خطأ تأكيد، فإن fail() ينتج عنه دائمًا حكم بالفشل.
7. تأكيد باطلة ([رسالة سلسلة] وظيفة "assertSame" هي التحقق من أن الكائنين يشيران إلى نفس الكائن.
8. تأكيد باطلةNotSame([رسالة سلسلة] وظيفة "assertNotSame" هي التحقق من أن الكائنين لا يشيران إلى نفس الكائن.

JUnit فئة حالات الاختبار

لتشغيل اختبارات متعددة، تتوفر فئة TestCase في إطار عمل JUnit الحزمة. يشير التعليق التوضيحي @Test إلى JUnit أن هذه الطريقة العامة الفارغة (حالة اختبار هنا) التي تم إرفاقها بها يمكن تشغيلها كحالة اختبار.

ملاحظة حول الإصدار: حالة اختبار, نتيجة الفحص و حزمة اختبار ينتمي إلى الإرث إطار عمل JUnit الحزمة من JUnit 3. لا تزال تُشحن داخل عنصر junit 4.x، لكن الاختبارات القائمة على التعليقات التوضيحية لا تمتد إلى TestCase.

يوضح الجدول أدناه بعض الطرق المهمة المتاحة في junit.framework.TestCase صف دراسي:

العدد التسلسلي الأسلوب الوصف
1. عدد صحيحTestCases () تُستخدم هذه الطريقة لحساب عدد حالات الاختبار التي يتم تنفيذها بواسطة تشغيل (TestResult tr) الأسلوب.
2. نتيجة الاختبار createResult() يتم استخدام هذه الطريقة لإنشاء نتيجة الفحص موضوع.
3. سلسلة getName () تقوم هذه الطريقة بإرجاع سلسلة ليست سوى ملف حالة اختبار الاسم.
4. تشغيل نتيجة الاختبار () تُستخدم هذه الطريقة لتنفيذ اختبار، والذي يُعيد نتيجة الفحص موضوع.
5. تشغيل باطل (نتيجة TestResult) يتم استخدام هذه الطريقة لتنفيذ اختبار يحتوي على نتيجة الفحص كائن لا يُرجع أي شيء.
6. setName باطل (اسم السلسلة) تُستخدم هذه الطريقة لتعيين اسم لـ حالة اختبار.
7. الإعداد باطل() تُستخدم هذه الطريقة لكتابة رمز ربط الموارد، على سبيل المثال إنشاء اتصال بقاعدة البيانات.
8. تمزيق باطلة () تُستخدم هذه الطريقة لكتابة رمز تحرير الموارد، على سبيل المثال تحرير اتصال قاعدة البيانات بعد تنفيذ عملية معاملة.

JUnit فئة نتيجة الاختبار

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

انظر الجدول أدناه للاطلاع على الطرق المهمة المستخدمة في فئة junit.framework.TestResult:

العدد التسلسلي الأسلوب الوصف
1. خطأ addError (اختبار اختبار، قابل للرمي) تُستخدم هذه الطريقة إذا كنت ترغب في إضافة خطأ إلى الاختبار.
2. باطلة addFailure (اختبار اختبار، AssertionFailedError t) تُستخدم هذه الطريقة إذا كنت ترغب في إضافة عطل إلى قائمة الأعطال.
3. نهاية باطلة (اختبار اختبار) تُستخدم هذه الطريقة للإبلاغ عن إجراء الاختبار (اكتماله).
4. عدد الأخطاء int() تُستخدم هذه الطريقة للحصول على الأخطاء التي تم اكتشافها أثناء تنفيذ الاختبار.
5. تعداد أخطاء () تقوم هذه الطريقة ببساطة بإرجاع مجموعة (تعداد هنا) من الأخطاء.
6. عدد الفشل الدولي () تُستخدم هذه الطريقة للحصول على عدد حالات الفشل التي تم اكتشافها أثناء تنفيذ الاختبار.
7. تشغيل باطل (اختبار TestCase) يتم استخدام هذه الطريقة لتنفيذ حالة اختبار.
8. كثافة العمليات RunCount () تعتمد هذه الطريقة ببساطة على حساب عدد الاختبارات المنفذة.
9. بداية باطلةTest (اختبار اختبار) يتم استخدام هذه الطريقة للإخطار ببدء الاختبار.
10. توقف باطل () تُستخدم هذه الطريقة لإيقاف تشغيل الاختبار.

JUnit فئة جناح الاختبار

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

انظر الجدول أدناه للاطلاع على أهم الطرق المستخدمة في مجموعة اختبارات junit.framework.TestSuite صف دراسي:

العدد التسلسلي الأسلوب الوصف
1. باطلة addTest (اختبار اختبار) يتم استخدام هذه الطريقة إذا كنت تريد إضافة اختبار إلى المجموعة.
2. باطلة addTestSuite(Class فئة الاختبار) يتم استخدام هذه الطريقة إذا كنت تريد تحديد الفصل أثناء إضافة اختبار إلى المجموعة.
3. عدد صحيحTestCases () يتم استخدام هذه الطريقة إذا كنت تريد حساب عدد حالات الاختبار.
4. سلسلة getName () تُستخدم هذه الطريقة للحصول على اسم مجموعة الاختبار.
5. تشغيل باطل (نتيجة TestResult) تُستخدم هذه الطريقة لتنفيذ اختبار وجمع نتائج الاختبار في نتيجة الفحص موضوع.
6. setName باطل (اسم السلسلة) تُستخدم هذه الطريقة لتعيين اسم حزمة اختبار.
7. اختبار الاختبار في (فهرس كثافة العمليات) تُستخدم هذه الطريقة إذا كنت ترغب في إرجاع الاختبار عند فهرس معين.
8. كثافة العمليات اختبار الكونت () تُستخدم هذه الطريقة إذا كنت ترغب في إرجاع عدد الاختبارات في المجموعة.
9. تحذير اختبار ثابت (رسالة سلسلة) تقوم هذه الطريقة بإرجاع اختبار سيفشل وتسجيل رسالة تحذير.

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

نعم. عادةً ما تتضمن الدالة @Test مع @Ignore، أو @Test مع كلٍ من مهلة زمنية واستثناء متوقع. لا يمكنك دمج تعليقين توضيحيين لدورة حياة الدالة، مثل @Before و@After، في دالة واحدة.

@Ignore لا يقوم إلا بإلغاء طريقة JUnit يتعرف عليه النظام بالفعل كاختبار. بدون علامة @Test بجانبه، لا يقوم المُشغِّل بتجميع الدالة، لذا لا يتم تشغيلها ولا يتم إدراجها على أنها متجاوزة.

JUnit يُشغّل هذا الأسلوب في سلسلة عمليات منفصلة، ​​ويفشل عند انتهاء المهلة المحددة بظهور استثناء TestTimedOutException. يتم مقاطعة سلسلة العمليات، وليس إنهاؤها، لذا قد يستمر استدعاء الدالة المُعطِّلة في العمل.

فقط من خلال محرك Vintage. إضافة junit-vintage-engine تسمح بـ JUnit تُشغّل المنصة اختبارات org.junit الحالية دون تغيير، ولكن يجب على اختبارات Jupiter استيراد org.junit.jupiter.api. يؤدي دمج مجموعتي الاستيراد في فئة واحدة إلى فشل العملية.

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

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

تقوم مساعدات الذكاء الاصطناعي بقراءة الدالة قيد الاختبار، وتقترح ما إذا كان الإعداد يجب أن يكون ضمن @Before أو @BeforeClass، وما إذا كان مسار الفشل يحتاج إلى @Test(expected) أو assertThrows. تعامل مع كل اقتراح كمسودة.

مساعد الطيار جيثب عادةً ما يضع الإعداد والتفكيك بشكل صحيح، ولكنه غالباً ما يخلط بينهما. JUnit يتم استيراد الملفات 4 و Jupiter في ملف واحد. تحقق من قسم الاستيراد قبل تشغيل البرنامج.

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