JUnit ErrorCollectorRule مع المثال
⚡ ملخص ذكي
JUnit ErrorCollector هي قاعدة تسمح للاختبار بالاستمرار في العمل بعد حدوث فشل، حيث تجمع كل كائنات الخطأ وتبلغ عنها معًا بمجرد انتهاء طريقة الاختبار بدلاً من إيقافها.ping في المشكلة الأولى.
في السيناريو العادي، عندما تحدد أي خطأ أثناء تنفيذ الاختبار، يجب عليك إيقاف الاختبار وإصلاح الخطأ وإعادة تشغيل الاختبار.
لكن 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 يعرض البرنامج عملية تشغيل واحدة، لكنه يُبلغ عن خطأين وفشل واحد، كل منهما برقم سطر خاص به:
فوائد JUnit جامع الأخطاء
يمكنك استخدام JUnit التأكيد لأغراض التحقق الوظيفي أو التحقق من واجهة المستخدم الرسومية، على سبيل المثال:
- assertEquals(String message, Object expected, Object actual), التي تقارن بين كائنين للتأكد من أنهما متساويان.
- وبالمثل، يؤكد AcceptTrue(Boolean condition) على أن الشرط صحيح.
باستخدام التأكيدات، يصبح اختبار التحقق سهلاً. لكن إحدى المشكلات الرئيسية هي أن تنفيذ الاختبار سيتوقف حتى لو فشل تأكيد واحد.
يُعد استمرار الاختبار ومعالجة التعافي أمرًا بالغ الأهمية لنجاح أتمتة الاختبار، وهو ذو أهمية قصوى على المدى الطويل. Selenium في حالات العمليات التي يكون فيها إعادة تشغيل المتصفح بعد كل فحص فاشل مكلفاً، يُعدّ جامع الأخطاء أفضل طريقة للتعامل مع هذه السيناريوهات.

