Junit 4 ، إطار اختبار وحدة Java الشهير ، قد خرج لفترة طويلة. في ذلك الوقت ، وجدت أن Junit 5 كان في نسخة تجريبية ، لذلك كنت سأكتب مقالًا لتقديم Junit 5. ومع ذلك ، لأنه لا يزال نسخة تجريبية ، وبعض الأجزاء ليست مثالية ، وأنا كسول قليلاً ولا أكتبها جيدًا. تذكرت فجأة هذا الحادث هذه الأيام. عندما راجعت ذلك على الموقع الرسمي ، وجدت أنه في 10 سبتمبر ، ظهرت النسخة الرسمية من Junit 5 أخيرًا! ثم صادفت أن أكتب المقال مرة أخرى وأقدم أحدث إطار عمل Junit لك.
هيكل الإطار
بالمقارنة مع JUNIT 4 ، فإن هيكل JUNIT 5 واضح للغاية ويوفر دعمًا جيدًا للوظائف الموسعة مثل المكونات الإضافية المخصصة ، وتنفيذ اختبار IDE ، وما إلى ذلك. يمكن رؤية ذلك من بنية المشروع.
منصة Junit
اسم حزمة هذه المجموعة هو org.junit.platform. كما ترون من الاسم ، فإن الوظيفة الرئيسية لهذه المجموعة هي العمل كمنصة أساسية لإطار الاختبار. تتضمن الوحدات الموجودة تحت هذه الحزمة واجهات برمجة التطبيقات الأساسية ومحركات التنفيذ والمنفذين ووظائف تنفيذ سطر الأوامر الأساسية وواجهات سطر الأوامر والمكونات الإضافية للاختبار Maven و Gradle وغيرها من الوظائف الأساسية.
جونيت كوكب المشتري
كوكب المشتري هو اسم رمز Junit 5. تحتوي الوحدات النمطية الموجودة أسفل هذه الحزمة على الوظائف الرئيسية لـ Junit 5. إذا كنا نريد استخدام Junit 5 ، فيجب أن ندرج هذه المجموعة من الوحدات النمطية.
جونيت خمر
Vintage هو اسم الكود للإصدار القديم من Junit. تتيح لنا الوحدات الموجودة تحت هذه الحزمة إجراء اختبارات لـ Old Junit 3 و 4 على منصة Junit الجديدة.
استيراد مكتبة فئة
في حين أن Junit 5 لا يزال في مرحلة الإصدار التجريبي ، هناك أمثلة على دمج Junit 5 في Maven و Gradle في الوثائق الرسمية. ولكن في الإصدار الرسمي ، اختفى محتوى هذا الجزء ، ولم يترك سوى رابطين لمشروع العينة ، دعنا نشير إليه (نسخ ولصق).
باستخدام مافن
Junit5-Maven-Consumer هو مثال Maven الرسمي. كنت سأقوم في الأصل بنشر تكوين POM ذي الصلة هنا ، لكن عندما رأيت أن تكوين Maven كان طويلًا جدًا ، من الأفضل أن أنسى ذلك. إذا كان لديك أي متطلبات ، فيرجى التحقق من تكوين POM لهذا المشروع بنفسك.
باستخدام Gradle
إذا كنت تستخدم Gradle ، فإن هذه المشكلة أبسط بكثير. هناك أيضًا أوصاف مفصلة في مشروع عينة Junit5-Pradle-Consumer.
بادئ ذي بدء ، لا يدعم Gradle Junit 5 افتراضيًا ، لذلك يجب تمكين المكون الإضافي لـ Junit Platform Gradle لدعمه.
BuildScript {repositories {mavencentral ()} التبعيات {classpath 'org.junit.platform: Junit-platform-rgrle-plugin: 1.0.0'}} تطبيق البرنامج المساعد: 'org.junit.platform.gradle.plugin'ثم هناك تكوين هذا البرنامج المساعد Gradle. بشكل افتراضي ، سيتم تنفيذ جميع المحركات والعلامات. إذا كنت ترغب في اختيار إجراء اختبارات لمحركات وعلامات معينة فقط ، فيمكنك إلغاء تحديد ما يلي وتعديلها وفقًا لاحتياجاتك الخاصة. بالطبع ، إذا لم يكن لديك هذه المتطلبات المتقدمة ، فيمكنك حذف هذا الجزء.
JUNITPLATFORM {// platformversion '1.0.0' filters {محركات {// تضمين 'JUNIT-JUPITER' ، 'JUNIT-VINTAGE'. ملف ('build/test-results/junit-platform') // هذا هو الافتراضي // logmanager 'org.apache.logging.log4j.jul.logmanager'}إذا كنت بحاجة فقط إلى إجراء اختبارات Junit 5 ، فما عليك سوى استيراد التبعيات التالية. يتم استيراد تبعيات Junit Platform تلقائيًا.
التبعيات {testCompile ("org.junit.jupiter: Junit-Jupiter-api: 5.0.0") testruntime ("org.junit.jupiter: Junit-Jupiter-engine: 5.0.0")}إذا كنت ترغب في إجراء اختبارات Old Junit 3 و 4 ضمن النظام الأساسي الجديد ، فأنت بحاجة إلى استيراد التبعيات التالية.
التبعيات {testCompile ("Junit: Junit: 4.12") TestRuntime ("org.junit.vintage: Junit-Vintage-Engine: 4.12.0")}اكتب الاختبارات
اختبار Junit 4
إذا اكتملت جميع التكوين السابق ، فيمكنك البدء في كتابة اختبارات الآن. أولاً ، دعنا نراجع اختبار Junit 4 القديم.
الفئة العامة junit4test {beforeclass public static static void init () {system.out.println ("قبل الفصل") ؛}@بعد الفراغ العام الفراغ العام clean () {system.out.println ("بعد الفئة") ؛}@قبل الفراغ العام قبل () {system.out.println (". {system.out.println ("بعد") ؛}@اختبار public void test1 () {system.out.println ("Test 1") ؛}@test public void test2 () {system.out.println ("test 2") ؛}}}}}}}}}}}}}}}}}استخدم اختبار Gradle والأوامر الأخرى لتنفيذ هذا الاختبار. والنتيجة مشابهة لهذا.
قبل classbeforetest 1test 2 بعد فئة
جونيت 5 اختبار
دعونا نلقي نظرة على كيفية كتابة اختبار Junit 5 المكافئ. يمكن رؤية التغيير الأكثر وضوحًا: أولاً وقبل كل شيء ، تم إعادة تسمية العديد من التعليقات التوضيحية إلى أسماء أكثر شهرة ؛ نقطة أخرى هي أن طريقة الاختبار لا يجب أن تكون طريقة عامة ، حتى نتمكن من كتابة لوحة المفاتيح عدة مرات.
الفئة العامة junit5test {beforeall static void beforeall () {system.out.println ("قبل الكل") ؛}@efrall static static void afterall () {system.out.println ("بعد كل شيء") ؛}@قبل void قبل () {system.out.println ("قبل") {system.out.println ("بعد") ؛}@test void test1 () {system.out.println ("test 1") ؛}@test void test2 () {system.out.println ("test 2") ؛}}اكتب التأكيدات
للتحقق من أن حالات الاختبار صحيحة ، نحتاج إلى كتابة بعض التأكيدات. يأتي Junit 5 مع العديد من التأكيدات التي يمكن أن تساعدنا في كتابة حالات الاختبار. علاوة على ذلك ، تأتي هذه التأكيدات مع إصدارات زائدة يمكنها قبول تعبيرات Lambda ، والتي هي مناسبة جدًا لاستخدام Java 8. بالطبع ، أنا شخصياً أعتقد أنه من المريح أكثر التأكيد.
استيراد org.junit.assert.assertrue AssertTrue (صحيح) ؛ Assertequals (100 ، 100 ، "اثنين من الأرقام متساوية") ؛ AsserTall ("number" ، () -> assertequals ("name" ، "name") ، () -> assertequals (500 ، 500)) ؛ AssertThrows (invalidparameterexception.class ، () -> {رمي جديد invalidparameterexception () ؛}) ؛ int result = assertTimeOut (mater.ofseconds (5) ، () -> {int i = 0 ، j = 0 ؛ بينما (i <= 100) {for (؛ j <= 100000 ؛ j ++) j ++ ؛ i ++ ؛} return i ؛}) ؛ Assertequals (100 ، نتيجة) ؛ }}حقن التبعية
الآن يمكن لكل من مُنشئ وطرق الاختبار لفئة الاختبار قبول المعلمات. تحدد واجهة parameterresolver كيفية حقن المعلمات في وقت التشغيل. يتيح لنا العديد من المدمج الحصول على معلومات حول وقت تشغيل حالة الاختبار.
الأول هو testinfoparameterresolver. إذا كان هناك مثيل من نوع testinfo على الطريقة ، فسيقوم إطار JUNIT 5 تلقائيًا بضخ المثيل. يمكن أن تسمح لنا عدة طرق من هذه المثيل بالحصول على اسم واسم العرض والتسمية والمعلومات الأخرى لفئة الاختبار وطريقة الاختبار.
الفئة العامة dependencleDembeMo {testDisPlayName ("حقن التبعية") tag ("test") void testDisplayName (testinfo testinfo) {assertequals ("حقن التبعية" ، testinfo.getDisplayName ()) ؛ Assertequals (collections.singleton ("test") ، testinfo.getTags ()) ؛ }}هناك أيضًا محلات معلمة مدمجة مثل TrepetitionInfoparameterresolver ، والتي سيتم تقديمها لاحقًا.
التعليقات التوضيحية المشتركة
اسم العرض
يمكننا إضافة أسماء مخصصة إلى الفئات وأساليب الاختبار ، والتي يتم عرضها بواسطة عداء الاختبار وتقارير الاختبار. لا يتم عرض اسم العرض مثل اسم متغير. يمكن أن تكون سلسلة طويلة تحتوي على مساحات ، أو حتى الرموز التعبيرية الرموز التعبيرية.
displayName ("يمكن لفئة الاختبار تحديد اسم العرض") الفئة العامة displayNamedEmo {testDisPlayName ("يمكن أن تحدد طريقة الاختبار أيضًا اسم العرض") void testWithLongDisplayName () {} @testplayname ( {}}تعطيل الاختبار
يمكن استخدام التعليق التوضيحي dixabled في فئات الاختبار أو طرق الاختبار ، ويمكن تعطيل الاختبار المقابل.
@disabledpublic class distabledTestDemo {test // @abuabled void testDisabled () {}}كرر الاختبار
إذا كنت بحاجة إلى تشغيل طريقة اختبار عدة مرات ، فاستخدم تعليق توضيحي repeatedTest.
الفئة العامة REFEREDTESTDEMO {REPEATEDTEST (10) void testRepeAted10times () {}}يمكنك أيضًا ضخ مثيل للتكرار للتحقق من العدد الحالي للتكرار وإجمالي عدد التكرارات.
الفئة العامة REFEREDTESTDEMO {BEFOREEACH void قبل (repetitionInfo info) {system.out.printf ("٪ d - ٪ d/n" ، info.getCurrentRepetition () ، info.getTotalRepetitions ()) ؛}@repertest (10) void testrepeaded10times () {}}يأتي مع العلامات
عندما قدمت تكوين Gradle ، قلت إنه يمكنك اختيار تصفية ملصقات معينة في التكوين. من السهل جدًا إعطاء علامات في الكود ، ما عليك سوى استخدام التعليق التوضيحي TAG.
tag ("taggedTest") public class tagDemo {testtag ("taggedTest1") void testWithTag1 () {} test @tag (اختبارات متداخلة
في بعض الأحيان ، قد تكون هناك حاجة إلى اختبارات متداخلة للإشارة إلى علاقة التضمين بين اختبارات معينة. الاختبارات المتداخلة تستخدم التعليق التوضيحي.
displayName ("الاختبار الخارجي") الفئة العامة nesteddemo {test void testouter () {} nesteddisplayname ("اختبار داخلي") class innertestdemo {test void testinner () {}}}تجدر الإشارة إلى أن الطبقات الداخلية الثابتة فقط يمكنها استخدام التعليقات التوضيحية المتداخلة. بالإضافة إلى ذلك ، نظرًا لأن Java لا تسمح للفصول الداخلية أن يكون لها طرق ثابتة ، فلا يمكن أن يكون لها التعليقات التوضيحية Beboreall و Afterall. إذا كنت ترغب في اختراق هذا القيد ، فأنت بحاجة إلى إضافة التعليق التوضيحي testinstance (Lifecycle.per_class) إلى الفصل الداخلي المتداخل. للحصول على التفاصيل ، يرجى الرجوع إلى دورة حياة مثيل Test.
دعم IDE
على الرغم من أن Junit 5 قد خرج الآن. ومع ذلك ، فإن دعم مجموعة الأدوات المختلفة لم يواكب. في الوقت الحالي ، أضاف Idea Idea و Eclipse 4.7 (الأكسجين) دعمًا لـ Junit 5. لذلك إذا كنت في وضع رسمي ، فمن المفيد استخدام Junit 4.
الأسئلة المتداولة
تمييز بين إصدارات مختلفة من التعليق التوضيحي test
تمامًا كما كنت أكتب هذا المقال ، واجهت مشكلة في مثال الاختبار الخاص بي. لا يمكن اجتياز الاختبار وعرض رسالة الخطأ أدناه.
الفشل (1): junit vintage: yitian.study.test.assertiondemo: initializationerror classSource [className = 'yitian.study.test.assertiondemo' ، fileposition = null] => java.lang.exception: method testertion () يجب أن تكون عامة
يجب أن يكون الطلاب الذين لديهم اللغة الإنجليزية الجيدة قادرين على التعرف عليها. تشير رسالة الخطأ هذه إلى أن طريقة الاختبار يجب أن تكون عامة. ولكن كما ذكرنا سابقًا ، ألغت Junit 5 هذا التقييد ، فلماذا لا يزال هذا الخطأ يحدث؟ نظرت بعناية ووجدت الخطأ. ربما يكون السبب في ذلك هو أن Junit 4 تم استخدامه كثيرًا في الماضي ، وبالتالي فإن IDE تخلف عن التعليق التوضيحي test ، والذي يتم إكماله تلقائيًا.
استيراد org.junit.test ؛
هذه الحزمة هي التعليق التوضيحي test تحت Junit 4. إذا أردنا استخدام Junit 5 ، فنحن بحاجة إلى التعليق التوضيحي التالي.
استيراد org.junit.jupiter.api.test ؛
بعد تعديله ، قم بإجراء الاختبار مرة أخرى ، ولم تكن هناك مشكلة بالفعل. بالطبع ، من أجل التعلم والاستخدام ، أشير أيضًا إلى حزمة Junit 4 ، لذلك يحدث هذا الصراع. إذا لم يكن لديك أي احتياجات خاصة ، فمن المستحسن استيراد حزم Junit 5 Jar فقط لمنع الارتباك. بالطبع ، فإن استيرادها جميعًا على ما يرام ، ولكن عليك أن تكون حريصًا على التمييز بينهم وعدم كتابة تعليقات Junit 4 إلى اختبارات Junit 5. أخيرًا ، سأعلق أمثلة الاختبار الخاصة بي. يمكن للمهتمين إلقاء نظرة.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول المحتوى المتعلق بـ JUNIT5 ، وآمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!