وحدة مشتركة
JUnit هو إطار عمل لأتمتة الاختبارات للغة البرمجة Java . يُستخدم JUnit غالبًا لاختبار الوحدات ، وهو أحد أطر عمل xUnit .
يتم ربط JUnit كملف JAR أثناء عملية الترجمة. يوجد أحدث إصدار من إطار العمل، JUnit 6، ضمن الحزمة [ 3 ]org.junit.jupiter . أما الإصدارات السابقة JUnit 4 [ 3 ] وJUnit 3 فكانت موجودة ضمن الحزمتين [3] و [4] على التوالي.org.junitjunit.framework
أظهرت دراسة استقصائية أجريت عام 2013 على 10000 مشروع جافا مُستضاف على منصة GitHub أن JUnit (بالتساوي مع slf4j-api ) كانت المكتبة الخارجية الأكثر استخدامًا. وقد استُخدمت كل مكتبة في 30.7% من المشاريع. [ 4 ]
دورة حياة JUnit
تحتوي كل فئة اختبار JUnit عادةً على عدة حالات اختبار. تخضع حالات الاختبار هذه لدورة حياة الاختبار. تتكون دورة حياة JUnit الكاملة من ثلاث مراحل رئيسية: [ 5 ]
- مرحلة الإعداد - في هذه المرحلة، يتم تجهيز بنية الاختبار. يتوفر مستويان من الإعداد. النوع الأول هو إعداد على مستوى الفئة، حيث يتم إنشاء كائن ذي تكلفة حسابية عالية، مثل اتصال قاعدة البيانات، وإعادة استخدامه بأقل قدر من الآثار الجانبية. يتم تنفيذ إعداد مستوى الفئة باستخدام
@BeforeAllالتعليق التوضيحي. أما النوع الآخر، فيتم إعداده قبل تشغيل كل حالة اختبار، ويستخدم التعليق@BeforeEachالتوضيحي. [ 5 ] - تنفيذ الاختبار - تتولى هذه المرحلة مسؤولية تشغيل الاختبار والتحقق من النتيجة. ستشير نتيجة الاختبار إلى ما إذا كان ناجحًا أم فاشلًا.
@Testيُستخدم التعليق التوضيحي هنا. [ 5 ] - مرحلة التنظيف - بعد الانتهاء من جميع عمليات تنفيذ الاختبارات اللاحقة، قد يحتاج النظام إلى إجراء عملية تنظيف. وكما هو الحال في إعداد مستوى الفئة، توجد عملية تنظيف مماثلة على مستوى الفئة.
@AfterAllتُستخدم هذه الخاصية لدعم عملية التنظيف على مستوى الفئة،@AfterEachحيث تسمح بإجراء التنظيف بعد تنفيذ الاختبار. [ 5 ]
التكامل مع الأدوات الأخرى
يدمج JUnit 6 عددًا من الأدوات، مثل أدوات البناء ، وبيئات التطوير المتكاملة (IDE)، وأدوات التكامل المستمر (CI)، وغيرها الكثير. [ 6 ]
أدوات البناء
يدعم JUnit أدوات بناء Apache Ant و Apache Maven و Gradle ، وهي من أكثر أدوات بناء المشاريع استخدامًا. [ 7 ] تُعد أدوات البناء ضرورية لأتمتة عملية بناء المشروع. [ 6 ]
امتداد النمل
يُعدّ Apache Ant، المعروف أيضًا باسم Ant، أحد أدوات البناء الأكثر تنوعًا، وله تاريخٌ عريقٌ بين أدوات البناء الثلاث المذكورة أعلاه. [ 8 ] يتمحور Ant حول build.xmlملف `.js`، المُستخدم لتهيئة المهام اللازمة لتشغيل المشروع. [ 8 ] كما يمتلك Ant إضافةً تُسمى Apache Ivy ، تُساعد في حلّ التبعيات. يُمكن تعريف تبعيات المشروع في ivy.xmlملف `.js`. يُمكن دمج Ant مع JUnit 5 والإصدارات الأحدث من خلال تهيئة أدوات تغطية كود Java (JaCoCo) لهذا ivy.xmlالملف. [ 8 ] بعد ذلك ، يُمكن ivy.xmlتهيئة ملف `.js` مع التبعيات java-platform-consoleاللازمة junit-platform-runnerللتكامل مع JUnit 5 والإصدارات الأحدث. [ 9 ]
إضافة مافن
على عكس Ant، يستخدم Apache Maven، المعروف أيضًا باسم Maven، منهجًا موحدًا ومعياريًا لعملية البناء. [ 10 ] يتبع Maven مبدأ "الاتفاقيات بدلًا من التكوين" لإدارة تبعياته. [ 11 ] يمكن العثور على كود مصدر Java (أو "src") في الدليل src/main/java، وملفات الاختبار في src/test/javaالدليل. [ 11 ] يمكن استخدام Maven لأي مشروع Java. [ 10 ] يستخدم نموذج كائن المشروع (POM)، وهو منهج قائم على XML لتكوين خطوات بناء المشروع. [ 10 ] يجب أن يحتوي ملف البناء الأساسي لـ Maven pom.xmlعلى قائمة بالتبعيات ومعرّف فريد للمشروع. [ 10 ] يجب أن يكون Maven متاحًا في مسار البناء لكي يعمل. [ 10 ] يمكن دمج Maven مع JUnit 5 والإصدارات الأحدث باستخدام jacoco-maven-pluginالملحق الذي يدعم وظائف جاهزة لاختبارات JUnit. [ 12 ] يمكن تحديد أهداف Maven مختلفة لتحقيق هذه المهام. [ 12 ]
امتداد Gradle
Gradle هي أداة بناء تستعير العديد من المفاهيم من سابقتيها، Ant وMaven. [ 11 ] تستخدم build.gradleملفًا لتحديد الخطوات المطلوبة لبناء المشروع. [ 11 ] على عكس Ant وMaven، اللتين تعتمدان على XML، تتطلب Gradle استخدام Apache Groovy ، وهي لغة برمجة مبنية على Java. [ 11 ] على عكس Ant وMaven، لا تتطلب Gradle استخدام XML. [ 11 ] لا تزال Gradle ملتزمة بنهج Maven "الاعتماد على الاتفاقية بدلاً من التكوين"، وتتبع نفس بنية src/main/javaالمجلدات src/test/java. [ 11 ] يمكن دمج Gradle مع JUnit 5 والإصدارات الأحدث من خلال تكوين إضافة jacocoبجانب إضافة junit-platform التي يوفرها فريق JUnit في ملف البناء. [ 13 ]
نموذج امتداد JUnit
يتبع JUnit نموذجًا يُفضّل نقاط التوسعة على الميزات. [ 14 ] قرر فريق JUnit عدم تضمين جميع الميزات ضمن نواة JUnit، وبدلًا من ذلك، قرر توفير طريقة قابلة للتوسيع للمطورين لمعالجة مخاوفهم. [ 14 ]
في JUnit 4، توجد آليتان للتوسيع: واجهة برمجة تطبيقات Runner وواجهة برمجة تطبيقات Rule. [ 15 ] كانت هناك بعض العيوب لكل من واجهة برمجة تطبيقات Runner وواجهة برمجة تطبيقات Rule.
من أبرز عيوب واجهة برمجة تطبيقات Runner API هو إلزام المطورين بتنفيذ دورة حياة الاختبار كاملةً، حتى لو اقتصرت المتطلبات على مرحلة محددة. [ 15 ] وهذا يُعدّ معقدًا ومُرهقًا للغاية بالنسبة لمعظم حالات الاستخدام. [ 15 ] ومن العيوب الرئيسية الأخرى أنه لا يُمكن استخدام سوى فئة Runner واحدة لكل حالة اختبار، مما يجعل استخدام Runners غير قابل للتركيب. [ 15 ] فعلى سبيل المثال، لا يُمكن استخدام Mockito وParameterized Runners معًا ضمن فئة الاختبار نفسها. [ 15 ]
من أبرز عيوب واجهة برمجة تطبيقات القواعد (Rule API) أنها لا تستطيع التحكم في دورة حياة الاختبار بأكملها، وبالتالي فهي غير مناسبة لبعض حالات الاستخدام. [ 15 ] تُناسب القواعد العمليات التي يجب تنفيذها قبل أو بعد تنفيذ الاختبار فقط. [ 15 ] ومن العيوب الأخرى ضرورة تعريف القواعد على مستوى الفئة والقواعد على مستوى الأسلوب بشكل منفصل. [ 15 ]
في JUnit 5 والإصدارات الأحدث، توجد واجهة برمجة تطبيقات الإضافات ضمن محرك JUnit Jupiter. [ 16 ] يهدف فريق JUnit إلى تمكين المطور من الربط بمراحل مختلفة من دورة حياة الاختبار من خلال توفير واجهة برمجة تطبيقات موحدة للإضافات. [ 16 ] عند الوصول إلى مرحلة معينة من دورة الحياة، يستدعي محرك Jupiter جميع الإضافات المسجلة لتلك المرحلة. [ 16 ] يمكن للمطور الربط بخمس نقاط إضافة رئيسية: [ 16 ]
- تتيح وظائف الاستدعاء لدورة حياة الاختبار للمطورين تنفيذ التعليمات البرمجية في مراحل محددة من دورة حياة الاختبار. [ 17 ]
- معالجة ما بعد إنشاء مثيل الاختبار – تُمكّن المطورين من الربط بمرحلة إنشاء مثيل الاختبار باستخدام
TestInstancePostProcessorالواجهة. [ 18 ] - تنفيذ الاختبارات المشروطة – يسمح بتشغيل الاختبارات فقط في حالة استيفاء شروط معينة. [ 19 ]
- حل المعلمات - يسمح بإدخال المعلمات في أساليب الاختبار أو المنشئات.
- معالجة الاستثناءات – تسمح للمطورين بتعديل سلوك الاختبار استجابةً للاستثناءات بدلاً من فشل الاختبار بشكل مباشر. [ 20 ]
مثال على تجهيزات اختبار JUnit
وحدة اختبار JUnit هي كائن جافا. يجب إضافة التعليق @Testالتوضيحي `<T>` إلى دوال الاختبار . إذا اقتضت الحالة ذلك، [ 21 ] فمن الممكن أيضًا تعريف دالة لتنفيذها قبل (أو بعد) كل (أو جميع) دوال الاختبار باستخدام التعليقات التوضيحية @BeforeEach`<T> @AfterEach` و` @BeforeAll<T @AfterAll>`. [ 22 ] [ 23 ]
استيراد org.junit.jupiter.api.* ;class FoobarTests { @BeforeAll static void setUpClass () throws Exception { // يتم تنفيذ الكود قبل طريقة الاختبار الأولى }@BeforeEach void setUp () throws Exception { // الكود الذي يتم تنفيذه قبل كل اختبار } @Test void oneThing () { // الكود الذي يختبر شيئًا واحدًا }@Test void anotherThing () { // كود لاختبار شيء آخر }@Test void somethingElse () { // كود لاختبار شيء آخر }@AfterEach void tearDown () throws Exception { // الكود الذي يتم تنفيذه بعد كل اختبار } @AfterAll static void tearDownClass () throws Exception { // الكود الذي يتم تنفيذه بعد آخر طريقة اختبار } }الإصدارات السابقة من JUnit
وفقًا لمارتن فاولر، أحد أوائل مستخدمي JUnit: [ 24 ]
وُلدت JUnit على متن رحلة جوية من زيورخ إلى مؤتمر OOPSLA عام 1997 في أتلانتا. كان كينت مسافرًا مع إريك غاما، وماذا عساهما يفعلان في رحلة طويلة سوى البرمجة؟ بُنيت النسخة الأولى من JUnit هناك، وبرمجها ثنائيًا، واعتمدت على اختبارها أولًا (وهو شكل مُرضٍ من أشكال البرمجة الدائرية).
نتيجةً لاستخدامه الواسع، لا تزال الإصدارات السابقة من JUnit تحظى بشعبية كبيرة، حيث تم استخدام JUnit 4 أكثر من 100000 مرة من قبل مكونات برمجية أخرى في مستودع Maven Central. [ 25 ]
في JUnit 4، كانت التعليقات التوضيحية لردود استدعاء تنفيذ الاختبار هي @BeforeClass، @Before، @After، و @AfterClass، على عكس JUnit 5 التي كانت @BeforeAll، @BeforeEach، @AfterEach، و @AfterAll. [ 22 ] [ 23 ]
في JUnit 3، كان يجب أن ترث تجهيزات الاختبار من junit.framework.TestCase. [ 26 ] بالإضافة إلى ذلك، كان يجب أن تُسبق طرق الاختبار بـ 'test'. [ 27 ]
انظر أيضاً
- xUnit ، الاسم العائلي الذي يُطلق على أطر الاختبار بما في ذلك JUnit
- SUnit ، النسخة الأصلية من Smalltalk التي كتبها كينت بيك والتي استندت إليها JUnit
- TestNG ، إطار اختبار آخر للغة جافا
- الكائن الوهمي ، وهو أسلوب يُستخدم أثناء اختبار الوحدة
- Mockito ، مكتبة محاكاة تساعد في كتابة الاختبارات
- EvoSuite ، أداة لإنشاء اختبارات JUnit تلقائيًا
- قائمة أطر عمل جافا
الاقتباسات
- ↑ "إصدارات JUnit" . github.com . تم الاطلاع عليه بتاريخ 30-12-2025 .
- ↑ "تغيير الترخيص إلى EPL v2.0" . github.com . 7 سبتمبر 2017. تم الاطلاع عليه بتاريخ 4 فبراير 2021 .
- 1 2 Gulati & Sharma 2017 ، ص. 144 ، الفصل 8 الاختبارات الديناميكية والهجرة من Junit 4.
- ↑ «حللنا 30,000 مشروعًا على GitHub - إليكم أفضل 100 مكتبة في Java وJS وRuby» . مؤرشف من الأصل بتاريخ 9 يوليو 2014. تم الاطلاع عليه بتاريخ 9 فبراير 2014 .
- 1 2 3 4 Gulati & Sharma 2017 ، ص 37-40 ، الفصل §2 JUnit LifeCycle API.
- 1 2 Gulati & Sharma 2017 ، ص. 99 ، الفصل §6 دمج الأدوات.
- ↑ Gulati & Sharma 2017 ، ص 99-117 ، الفصل §6 أدوات البناء.
- 1 2 3 جولاتي وشارما 2017 ، الصفحات 108-112، الفصل §6 أدوات التكامل - أدوات البناء - Ant.
- ↑ Gulati & Sharma 2017 ، ص 116-117 ، الفصل §6 أدوات التكامل - أدوات البناء - امتداد Ant.
- 1 2 3 4 5 Gulati & Sharma 2017 ، ص 104–108 ، الفصل §6 أدوات التكامل - أدوات البناء - Maven.
- 1 2 3 4 5 6 7 Gulati & Sharma 2017 ، ص 99-103 ، الفصل §6 أدوات التكامل - أدوات البناء - Gradle.
- 1 2 Gulati & Sharma 2017 ، ص. 115 ، الفصل §6 أدوات التكامل - أدوات البناء - ملحق Maven.
- ↑ Gulati & Sharma 2017 ، ص 113-114 ، الفصل §6 أدوات التكامل - أدوات البناء - امتداد Gradle.
- 1 2 Gulati & Sharma 2017 ، ص. 121 ، الفصل §7 JUnit 5 نموذج التمديد.
- 1 2 3 4 5 6 7 8 Gulati & Sharma 2017 ، ص 121-122 ، الفصل §7 JUnit 4 نموذج التمديد.
- 1 2 3 4 Gulati & Sharma 2017 ، ص 122-124 ، الفصل §7 نموذج امتداد JUnit 5 - نموذج امتداد JUnit 5.
- ↑ Gulati & Sharma 2017 ، ص 124-126 ، الفصل §7 JUnit 5 نموذج الامتداد - استدعاءات دورة حياة الاختبار.
- ↑ Gulati & Sharma 2017 ، ص 126-127 ، الفصل §7 JUnit 5 نموذج الامتداد - معالجة ما بعد الاختبار.
- ↑ Gulati & Sharma 2017 ، ص. 127 ، الفصل §7 JUnit 5 نموذج الامتداد - تنفيذ الاختبار الشرطي.
- ↑ Gulati & Sharma 2017 ، ص. 129 ، الفصل §7 JUnit 5 نموذج الامتداد - معالجة الاستثناءات.
- ↑ كينت بيك . "رائحة الإعداد المكلف" . ويكي C2 . تم الاسترجاع في 28-11-2011 .
- 1 2 "اختبارات الكتابة" . junit.org . تم الاطلاع عليه بتاريخ 2021-02-04 .
- 1 2 Gulati & Sharma 2017 ، ص 37-40 ، الفصل §2 فهم الوحدة الأساسية 5.
- ^ "بليكي: زونيت" . martinfowler.com . تم الاسترجاع بتاريخ 2022-03-07 .
- ↑ "JUnit" . mvnrepository.com . تم الاطلاع عليه بتاريخ 29 أكتوبر 2021 .
- ↑ كينت بيك ؛ إريك غاما . "دليل استخدام JUnit" . junit.sourceforge.net. مؤرشف من الأصل بتاريخ 15 يونيو 2020. تم الاطلاع عليه بتاريخ 21 مايو 2011 .
- ↑ تشارلز أ. شارب (أغسطس 2007). "الانتقال من JUnit 3 إلى JUnit 4: أخبار سارة فقط" . شركة أوبجكتيف كومبيوتينج . تم الاسترجاع في 4 فبراير 2021 .
مراجع
- جولاتي، شيخار؛ شارما، راهول (2017). اختبار الوحدات في جافا باستخدام JUnit 5. بيركلي، كاليفورنيا: Apress . doi : 10.1007/978-1-4842-3015-2 . ISBN 978-1-4842-3014-5.
روابط خارجية
- الموقع الرسمي
- إيريجر، أكسل. "JUnit - أداة اختبار وحدات جافا مفتوحة المصدر" . الأساليب والأدوات .
- "JUnit" . لم يتم العثور على الذاكرة . دروس تعليمية. مؤرشف من الأصل في 28 يناير 2015.
- برامج متعددة المنصات
- البرمجة المتطرفة
- برنامج مجاني مكتوب بلغة جافا
- أدوات تطوير جافا
- جافا (منصة برمجية)
- أطر اختبار الوحدات
- برنامج يستخدم رخصة إكليبس العامة
