JUnit ErrorCollectorRule مع المثال

⚡ ملخص ذكي

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

  • 🔘 الغرض: استمر في الاختبار بعد فشل عملية التحقق من التأكيد أو الشبكة أو واجهة المستخدم الرسومية، ثم قم بالإبلاغ عن كل خطأ تم جمعه دفعة واحدة.
  • ☑️ إعلان: @Rule على حقل ErrorCollector عام غير ثابت يُشير إلى JUnit لربط القاعدة بكل اختبار.
  • جمع: تقوم الدالة addError(Throwable) بتخزين أي خطأ أو استثناء، لأن Throwable هو الأصل لكليهما.
  • 🧪 تدقيق: تقوم الدالة checkThat() بتقييم أداة المطابقة وتسجيل عدم التطابق دون إلغاء العبارات المتبقية.
  • 🛠️ التقرير: الفشل tracيسرد البرنامج كل عنصر قابل للرمي تم جمعه مع رقم السطر الخاص به في JUnit رأي.
  • 📌 JUnit 5: لقد اختفت القواعد من جوبيتر، لذا فإن assertAll() أو AssertJ SoftAssertions تلعب نفس الدور.

JUnit قاعدة تجميع الأخطاء التي تجمع أخطاء متعددة في تشغيل اختبار واحد

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

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

لماذا نستخدم أداة تجميع الأخطاء؟

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

لهذا، JUnit يستخدم @ القاعدة التوضيحية، والتي تُستخدم لإنشاء كائن جامع الأخطاء. بمجرد إنشاء كائن جامع الأخطاء، يمكنك بسهولة إضافة جميع الأخطاء إلى الكائن باستخدام الطريقة addError (خطأ قابل للرمي). وانت عارف، رمي هي الطبقة العليا من استثناء و خطأ دروس في Javaعند إضافة الأخطاء بهذه الطريقة، سيتم تسجيل هذه الأخطاء في JUnit نتيجة الاختبار.

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

ملاحظات: في حالة استخدام تأكيد بسيط أو كتلة try/catch، لن يكون استخدام طريقة جامع الأخطاء ممكنًا.

عينة من الرموز

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

package guru99.junit;		

import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							
    collector.checkThat(getResults(),			
                not(containsString("here is an error")));			
    // all lines of code will execute and at the end a combined failure will		
    be logged in.		
    }		
}	

ملاحظة: هذا مثال توضيحيtracالملف t غير قابل للتجميع. ينتقل التعليق الأخير إلى سطر ثانٍ بدون علامة // في البداية، ولا تظهر دالة getResults() بالإضافة إلى مُطابقات Hamcrest. يُمكنك الاطلاع على النسخة الكاملة القابلة للتنفيذ أدناه. مثال باستخدام ErrorCollector.

ما هي قاعدة @Rule؟ JUnit?

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

توجد عدة قواعد مدمجة يوفرها... JUnit واجهة برمجة تطبيقات (API) يمكن للمختبِر استخدامها، ويمكنك أيضًا كتابة قواعدك الخاصة. يجب أن يكون حقل القاعدة عامًا وغير ثابت ومن نوع يُطبّق واجهة TestRule.

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

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit ملاحظة 5: استبدلت جوبيتر القواعد بواجهة برمجة التطبيقات الإضافية (Extension API)، لذا فإن @Rule و ErrorCollector غير موجودتين في org.junit.jupiter. أقرب ما يكافئهما هما Assertions.assertAll() و AssertJ SoftAssertions. JUnit لا يزال الكود رقم 4 الموضح هنا يعمل عبر المحرك القديم. انظر إلى JUnit الشروح شرح مفصل للخريطة الكاملةping.

مثال باستخدام ErrorCollector

لفهم آلية عمل جامع الأخطاء، لنقم بإنشاء فئة وقاعدة لجمع جميع الأخطاء. ستضيف جميع الأخطاء باستخدام الدالة addError(throwable) هنا.

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

ErrorCollectorExample.java

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							

        System.out.println("Hello");					
        try {			
            Assert.assertTrue("A " == "B");					
        } catch (Throwable t) {					
            collector.addError(t);					
        }		
        System.out.println("World!!!!");					
    }		
}		

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(ErrorCollectorExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      

الإخراج:

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

Eclipse JUnit فشل tracيُدرج هذا المثال خطأين من نوع Throwable وخطأ واحد من نوع AssertionError تم جمعهما في عملية تشغيل واحدة.

فوائد JUnit جامع الأخطاء

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

  1. assertEquals(String message, Object expected, Object actual), التي تقارن بين كائنين للتأكد من أنهما متساويان.
  2. وبالمثل، يؤكد AcceptTrue(Boolean condition) على أن الشرط صحيح.

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

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

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

تقوم الدالة addError(Throwable) بتسجيل خطأ سبق لك رصده أو إنشائه. أما الدالة checkThat(value, matcher) فتقوم بتقييم مُطابق Hamcrest وتسجيل عدم التطابق تلقائيًا، بحيث تبدو كأنها تأكيد مع السماح في الوقت نفسه بتنفيذ العبارات المتبقية.

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

JUnit يقوم بفحص فئة الاختبار بحثًا عن حقول النسخ العامة المُعلَّمة بـ @Rule، ويُطبِّق كل حقل منها على كل طريقة اختبار. يتم تجاهل الحقول الخاصة أو الثابتة، و JUnit يُثير خطأ في التهيئة بدلاً من تشغيل الاختبار.

لا. لقد أسقطت جوبيتر آلية القواعد، لذا فإن org.junit.rules.ErrorCollector موجود فقط في JUnit 4. استخدم Assertions.assertAll() للتأكيدات المجمعة، أو أضف AssertJ SoftAssertions عند الحاجة إلى مطابقة أكثر ثراءً.

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

يؤجل كلاهما الإبلاغ، لكن SoftAssert يتطلب استدعاء assertAll() صراحةً في نهاية الاختبار، بينما يقوم ErrorCollector بالإبلاغ تلقائيًا عند انتهاء الدالة. نسيان assertAll() في TestNG يخفي الإخفاقات بصمت.

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

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

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