يعتبر JUnit 5 إطار اختبار برامج يستخدمه المطورون لاختبار وحدات الشفرة الخاصة بهم. إنه إطار مبني على لغة Java يتيح كتابة الاختبارات وتشغيلها على منصة Java، بما في ذلك مراسل متكامل يعرض نتائج الاختبار.
JUnit يمكن استخدامه لاختبار الأتمتة لغرضين رئيسيين:
- اختبار أن البرنامج يعمل كما هو متوقع
- العثور على الأخطاء في الشفرة وإصلاحها بأسرع وقت ممكن
في هذه المدونة، سنركز على التعلم والتعرف على الإعداد والتكوين والطرق الأساسية المستخدمة في JUnit 5.
ما هو JUnit 5؟
JUnit 5 هو أحدث إصدار من إطار اختبار JUnit. يدعم Java 8 والإصدارات الأحدث، ويستوعب أنماط اختبار مختلفة، ويقدم أساسًا حديثًا للاختبار من جانب المطور على JVM.
الفائدة الرئيسية من استخدام JUnit هي تعددية الوحدات، حيث يحتوي على وحدات متعددة تسمح للمطورين باختبار مكونات مختلفة من البرنامج بسهولة. يمكن أيضًا استخدامه لاختبار فئات فردية من التطبيق بدلاً من البرنامج بأكمله.
ميزات JUnit 5
فيما يلي بعض الميزات الشهيرة والهامة لـ JUnit 5 التي تميزه عن إطارات اختبار الوحدات الأخرى.
Feature | Description | Annotations/Method |
---|---|---|
مجموعة الاختبارات |
مجموعة الاختبارات هي في الأساس مجموعة من الاختبارات، مثل Smoke، Sanity، أو مجموعة من الاختبارات المتعلقة بميزة معينة. يتيح JUnit 5 إنشاء مجموعات اختبار يمكن تشغيلها معًا. |
لاستخدام مجموعات الاختبارات، نحتاج إلى إضافة اعتماد JUnit Platform Suite واستخدام التعليقات التوضيحية التالية.@SelectPackages ،@SelectClasses ، @Suite |
التحققات | تُستخدم التحققات للتحقق من السلوك المتوقع للبرنامج. يوفر JUnit 5 طرق تحقق مدمجة يمكن أن تساعد في إجراء التحققات بسهولة. | توجد طرق تحقق متعددة متاحة في import org.junit.jupiter.api.Assertions; فئة.بعض الطرق مدرجة أدناه: assertTrue() ، assertFalse() ،assertEquals() ، assertAll() ، assertNotEquals() |
ترتيب تنفيذ الاختبارات | يخصص ترتيب تنفيذ الاختبارات. يسمح للمطور بالتحكم في تنفيذ الاختبارات وتشغيلها بترتيب محدد حسب الحاجة. | @TestMethodOrder ، @Order ،@TestClassOrder |
اختبار الاستثناءات | ينفذ اختبار الاستثناءات الذي يتحقق من أن الاستثناء المطلوب يتم إلقاؤه في الاختبار. | يتم استخدام الطريقة التالية منimport org.junit.jupiter.api.Assertions; الفئة: assertThrows() |
تبعيات الاختبار | تسمح تبعيات الاختبار بالاختبار التسلسلي عن طريق توفير وسيلة للسماح لطرق الاختبار بالاعتماد على بعضها البعض. وهذا يعني أن الطريقة الاختبارية التالية، التي تعتمد على الطريقة الاختبارية السابقة، لن تتم تنفيذها ما لم تنجح السابقة. هذه ميزة مفيدة أثناء كتابة اختبارات التكامل. | @TestInstance |
تعطيل الاختبارات | تعطيل الاختبارات أو فئات الاختبار. | @Disabled |
الحد الزمني | يفشل الاختبار إذا تجاوزت مدة تنفيذه المحددة. | @Timeout |
التقارير | توفر مراسل مدمج لتحليل نتائج الاختبار وعرض معلومات مفصلة. تولد ملف .html بنتائج تنفيذ الاختبار. |
N/A |
JUnit 4 مقابل JUnit 5
مع إصدار أحدث نسخة من JUnit، أي JUnit 5، تمت إضافة تغييرات متعددة وميزات جديدة إلى الإطار. تم إدراج الفروقات بين النسختين في الجدول أدناه:
criteria | JUNIT4 | JUNIT5 |
---|---|---|
الهندسة المعمارية | كان كل شيء معبأ معًا في ملف JAR واحد. | مقسم إلى 3 مشاريع فرعية: – منصة JUnit – JUnit جوبيتر – JUnit فينتاج |
متطلبات إصدار JDK | يتطلب Java 5 أو أعلى | يتطلب Java 8 أو أعلى |
تكامل الطرف الثالث | لا يوجد دعم لتكامل الطرف الثالث للإضافات وواجهات الاستخدام | مشروع فرعي مخصص (منصة JUnit) لتكاملات الطرف الثالث |
دعم للاختبارات المتداخلة | لا توجد تعليقات متاحة لكتابة اختبارات متداخلة | يوفر تعليق @Nested لكتابة اختبارات متداخلة |
دعم لتسجيل الإضافات المخصصة | لا يوجد دعم للإضافات المخصصة | يوفر تعليق @ExtendWith لتسجيل الإضافات المخصصة |
التغييرات التي أجريت على التعليقات المستخدمة بشكل شائع | – @BeforeClass – @AfterClass – @Before – @After – @Ignore |
– @BeforeAll – @AfterAll – @BeforeEach – @AfterEach – @Disabled |
تغييرات التعليقات لتصنيف وتصفية | @Category يتم استخدامه |
@Tag يتم استخدامه |
مجموعة الاختبارات | @RunWith و @Suite تم استخدام التعليقات |
تُستخدم تعليقات @Suite و@SelectPackages و@SelectClasses |
البدء مع JUnit 5
في هذا القسم، سنتعلم كيفية كتابة حالات اختبار JUnit 5 باستخدام بيئة IntelliJ. حيث تأتي مدمجة بـ JUnit 5 بالفعل، لذا لا داعي لتثبيت أي شيء إضافي لاستخدامها.
نحتاج إلى إنشاء مشروع Maven جديد، إضافة تبعيات JUnit 5، وبدء كتابة الاختبارات على الفور.
إضافة تبعيات JUnit في مشروع Maven
يجب إضافة التبعيات الخاصة بـ JUnit 5 التالية في ملف pom.xml:
- JUnit Jupiter Engine
- JUnit Jupiter API
- JUnit Platform Suite(Aggregator)
- JUnit Jupiter Params
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
ها هو ملف pom.xml كاملاً
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.mfaisalkhatri</groupId>
<artifactId>junit-basic</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>junit-basic</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
بعد إضافة التبعيات، نكون جاهزين لكتابة الاختبار. ولكن قبل أن ننتقل إلى كتابة الاختبارات باستخدام JUnit 5، دعونا نفهم أولاً التعليقات الأساسية التي يمكن أن تساعدنا في إعداد الحزمة الاختبارية بكفاءة وتشغيل الاختبارات كما نريد.
التعليقات الأساسية المستخدمة في JUnit 5
التالي هي التعليقات الأساسية التي يستخدمها المطورون بشكل شائع أثناء كتابة الاختبارات باستخدام JUnit 5.
@BeforeAll Annotation
التعليق @BeforeAll
يشير إلى أن الطريقة المُحددة يجب تنفيذها قبل أي طرق @Test
، , @RepeatedTest
, @ParameterizedTest
, أو @TestFactory
في الصنف الحالي. يجب أن تكون الطريقة ثابتة في صنف الاختبارات.
@BeforeAll
يعمل كبديل لتعليق @BeforeClass
المستخدم في JUnit 4.x
الصيغة:
public class BasicTest {
public static void beforeAllTest() {
System.out.println("Before All method called!!");
}
//..
}
تعليق @BeforeEach
التعليق @BeforeEach
يشير إلى أن الطريقة المُحددة يجب تنفيذها قبل كل استدعاء للطرق @Test
، , @RepeatedTest
, @ParameterizedTest
, أو @TestFactory
في الصنف الحالي.
يعد جزءًا من طرق دورة حياة الاختبار ويحل محل التعليق @Before
المستخدم في JUnit 4.
الصيغة:
public class BasicTest {
public void beforeEachTest() {
System.out.println("Before Each method called!!");
}
//...
}
تعليق @AfterAll
التعليق @AfterAll
يشير إلى أن الطريقة المُحددة يجب أن تُدعى بعد تنفيذ جميع الاختبارات في الصنف الحالي. يجب أن تكون الطريقة ثابتة وتُستخدم كطريقة للتنظيف في صنف الاختبارات.
تعليق @AfterAll هو بديل لتعليق @AfterClass
في JUnit 4.
الصيغة:
public class BasicTest {
//...
public static void afterAllMethod() {
System.out.println("After All method called!!");
}
}
تعليق @AfterEach
التعليق @AfterEach
يشير إلى أن الطريقة المُحددة يجب تنفيذها بعد كل طريق @Test
، , @RepeatedTest
, @ParameterizedTest
, أو @TestFactory
في الصنف الحالي.
إنه بديل JUnit 5 لتعليق @After
المستخدم في JUnit 4.
الصيغة:
public class BasicTest {
//...
public void afterEachMethod() {
System.out.println("After Each method called!!");
}
}
تعليق @Test
تعليق @Test
يشير إلى أن الطريقة المحددة هي طريقة اختبار. يجب ألا تكون الطريقة اختبار خاصة أو ثابتة ويجب ألا تعيد قيمة.
الصيغة:
public class BasicTest {
//..
public void testMethod() {
System.out.println("Test Method Called!!");
}
}
تعليق @DisplayName
تعليق @DisplayName
يستخدم لتحديد اسم مخصص لفئة الاختبار أو الطريقة المحددة. يمكن أن تتضمن هذه الأسماء المخصصة مسافات ورموز خاصة وحتى رموز تعبيرية وغالبًا ما يتم استخدامها في التقارير الخاصة بالاختبارات التي تولدها بيئات التطوير المتكاملة وأدوات البناء.
الصيغة:
"Demo Test class") (
public class BasicTest {
//...
"This is a demo test") (
public void testMethod() {
System.out.println("Test Method Called!!");
}
}
تعليق @Disabled
تعليق @Disabled
في JUnit 5 يستخدم لاستبعاد طريقة الاختبار أو فئة الاختبار من مجموعة الاختبارات للتنفيذ.
عند تطبيقه على فئة اختبار، يُعتبر جميع الطرق داخل فئة الاختبار معطلة تلقائيًا. يحتوي هذا التعليق على معلمة اختيارية تسمح بتحديد السبب في تعطيل الاختبار.
الصيغة:
public class BasicTest {
"Test method disabled") (
public void testMethod() {
System.out.println("Test Method Called!!");
}
//...
}
كيفية كتابة حالات اختبار آلية باستخدام JUnit 5
حان الوقت للانتقال إلى الشفرة والبدء في العمل مع JUnit 5. سنقوم بإنشاء فئة Java جديدة، BasicTest.
public class BasicTest {
//..
}

سنغطي جميع التعليقات الأساسية التي ناقشناها كجزء من العرض.
لنقوم بإضافة الأساليب في فئة BasicTest لتوضيح استخدام تعليقات @BeforeAll
, @BeforeEach
, @AfterAll
, @AfterEach
, @Test
, @DisplayName
و @Disabled
المتوفرة في JUnit 5.
"Demo Test class") (
public class BasicTest {
public static void beforeAllTest() {
System.out.println("Before All method called!!");
}
public void beforeEachTest() {
System.out.println("Before Each method called!!");
}
"This is a demo test") (
public void testMethodOne() {
System.out.println("Test Method One Called!!");
}
"This test is disabled to demo disable annotation") (
public void disabledTest() {
System.out.println("This is a disabled test!!");
}
public void testMethodTwo() {
System.out.println("Test Method Two Called!!");
}
public void afterEachMethod() {
System.out.println("After Each method called!!");
}
public static void afterAllMethod() {
System.out.println("After All method called!!");
}
}
شرح الكود
التعليق @DisplayName
على فئة الاختبارات سيعرض اسم الاختبار كـ “فئة الاختبار التجريبي” في النتائج عند تنفيذ الاختبار.
الأسلوب beforeAllTest()
سيتم تنفيذه قبل تشغيل أي اختبار وسيقوم بطباعة النص "تم استدعاء الطريقة قبل الكل!!"
. بعد ذلك، سيتم تنفيذ الأسلوب beforeEachTest()
قبل كل اختبار وسيقوم بطباعة النص "تم استدعاء الطريقة قبل كل اختبار!!"
.
هناك ثلاثة أساليب اختبار في هذه الفئة، هي، testMethodOne()
, testMethodTwo()
و disabledTest()
. جميع الأساليب الثلاثة للاختبارات لديها تعليق @Test
فوقها، مما يشير إلى أنها أساليب اختبار.
الأسلوب disabledTest()
لن يتم تنفيذه لأنه يحتوي على @Disabled
تعليق موضوع فوقه.
بعد اكتمال تنفيذ كل اختبار، سيتم تنفيذ الأسلوب afterEachTestMethod()
لأنه يحتوي على تعليق @AfterEach
فوقه.
وأخيرًا، بعد تشغيل جميع الاختبارات، سيتم تنفيذ الأسلوب afterAllMethod()
لأنه يحتوي على @AfterAll
تعليق فوقه.
تنفيذ الاختبارات
يمكن تنفيذ الاختبارات عن طريق النقر بزر الماوس الأيمن على فئة الاختبار واختيار تشغيل ‘<اسم فئة الاختبار>’(“BasicTest” في حالتنا).

طريقة أخرى هي النقر على رمز التشغيل باللون الأخضر بجانب إعلان فئة الاختبار، كما هو موضح في لقطة الشاشة أدناه:

تظهر لقطة الشاشة التالية من IntelliJ IDE أن الاختبارات تم تنفيذها بنجاح.

يمكن رؤية في لقطة الشاشة أعلاه أن الاسم المعروض لفئة الاختبار قد تم طباعته، كما يمكن رؤية الاختبار المعطل أيضًا وسبب تعطيل الاختبار قد تم طباعته في وحدة التحكم.
تم تنفيذ جميع طرق الاختبار الأخرى، بما في ذلك beforetest و aftertest بنجاح، وتم طباعة النتائج المعنية على وحدة التحكم.
ملخص
JUnit 5 هو إطار اختبار قوي يستخدمه المطورون لإجراء الاختبار الوحدوي للكود. كما يستخدمه مهندسو أتمتة الاختبارات لكتابة وتشغيل نصوص أتمتة الاختبارات. يحتوي على ميزات غنية تتيح للمطورين والمختبرين كتابة نصوص الاختبار وإجراء الاختبار الوحدوي للكود.
كما يوفر طرقًا متعددة لإجراء التأكيد والتحقق التي تكون مفيدة أثناء كتابة الاختبارات الآلية. بالإضافة إلى كتابة وتشغيل نصوص الاختبار، فإنه يوفر أيضًا تقرير اختبار يمكن استخدامه لعرض نتائج تنفيذ الاختبارات للمساهمين لعرض تغطية الاختبار.
سعيد بالاختبار!
Source:
https://dzone.com/articles/beginners-guide-to-junit-5