JUnit، 4، 5، Jupiter، Vintage

بعد إطلاق JUnit 5، قام الكثير من المطورين بإضافة هذه المكتبة الرائعة الجديدة إلى مشاريعهم، لأنه unlike الإصدارات الأخرى، في هذه النسخة الجديدة، ليس من الضروري الانتقال من JUnit 4 إلى 5، كل ما تحتاجه هو تضمين المكتبة الجديدة في مشروعك، وباستخدام محرك JUnit 5، يمكنك إجراء اختباراتك الجديدة باستخدام JUnit 5، وستظل الاختبارات القديمة باستخدام JUnit 4 أو 3، تعمل دون مشكلة.

لكن ماذا يمكن أن يحدث في مشروع كبير، مشروع تم بناؤه قبل 10 سنوات ويعمل ب侧 paralèlle مع إصدارين من JUnit؟

بدأ المطورون الجدد في العمل على المشروع، بعضهم لديهم خبرة في JUnit، والبعض الآخر لا. يتم إنشاء اختبارات جديدة باستخدام JUnit 5، واختبارات جديدة باستخدام JUnit 4، وفي某个时刻، عندما يcreate developer جديد بدون معرفة سيناريو جديد في اختبار JUnit 5 تم إنشاؤه بالفعل، يقوم فقط بتضمين تسمية JUnit 4، ويصبح الاختبار مزيجًا من بعض @Test من JUnit 4 وبعض @Test من JUnit 5، ويصبح من الصعب كل يوم إزالة مكتبة JUnit 4.

إذن، كيف تحل هذه المشكلة؟ أولاً، يجب عليك عرض ما هو من JUnit 5 وما هو من JUnit 4 على فريقك، حتى يتم إنشاء اختبارات جديدة باستخدام JUnit 5 بدلاً من JUnit 4. بعد ذلك، من الضروري اتباع قاعدة الفتى Scouts، يجب عليهم每当 يمرر اختبار JUnit 4، أن ينتقلوا إلى JUnit 5.

لنلقي نظرة على التغييرات الرئيسية التي تم إصدارها في JUnit 5. تبدأ كل شيء من الاسم، في JUnit 5، لا ترى حزم تُدعى org.junit5، بل org.junit.jupiter بدلاً من ذلك. لsummarize، كل ما تراه يحتوي على “Jupiter” يعني أنه من JUnit 5. اختاروا هذا الاسم لأن Jupiter يبدأ بـ “JU” و هو الكوكب الخامس من الشمس.

التغيير الآخر يتعلق بـ @Test، تم نقل هذه العلامة إلى حزمة جديدة: org.junit.jupiter.api و الآن لا يتم استخدام أي سمة مثل “expected” أو “timeout” بعد الآن، بل تستخدم التوسعات بدلاً من ذلك. على سبيل المثال، للtimeout، الآن لديك علامة لذلك:@Timeout(value = 100, unit = TimeUnit.MILLISECONDS). التغيير الآخر هو أن لا تحتاج إجراءات الاختبار ولا الفئات إلى أن تكون عامة.

الآن بدلاً من استخدام @Before و @After في إعدادات اختبارك، يجب أن تستخدم @BeforeEach و @AfterEach، و لديك أيضًا @BeforeAll و @AfterAll

ل تجاهل الاختبارات، الآن يجب أن تستخدم @Disable بدلاً من @Ignore

A great news that was released in JUnit 5 was the annotation @ParameterizedTest, with that is possible to run one test multiple times with different arguments. For example, if you want to test a method that creates some object and you want to validate if the fields are filled correctly, you just do the following:

Java

 

@ParameterizedTest
@MethodSource("getInvalidSources")
void shouldCheckInvalidFields(String name, String job, String expectedMessage) {
	Throwable exception = catchThrowable(() -> new Client(name, job));
  
  	assertThat(exception).isInstanceOf(IllegalArgumentException.class)
      .hasMessageContaining(expectedMessage);
}

static Stream<Arguments> getInvalidSources() {
	return Stream.of(Arguments.arguments("Jean Donato", "", "Job is empty"),
                     Arguments.arguments("", "Dev", "Name is empty"));
}

هناك العديد من الميزات الجميلة في JUnit 5، أنصحك بالاطلاع على دليل JUnit 5 دليل المستخدم، لتحليل ما هو مفيد لمشروعك.

الآن بعد أن يعرف جميع المطورون ما تم تغييره في JUnit 5، يمكنك بدء عملية إزالة JUnit 4 من مشروعك. لذا، إذا كنت لا تزال تستخدم JUnit 4 في عام 2024، ومشروعك مشروع كبير، فمن المحتمل أن يكون لديك بعض التبعيات التي تستخدم JUnit 4. أنصحك بتحليل مكتباتك للتحقق مما إذا كانت بعضها تستخدم JUnit 4.

في الصورة أدناه، أستخدم محلل التبعيات من IntelliJ.

Como puedes ver, jersey-test يستخدم JUnit 4، مما يعني أنني حتى لو أزلت JUnit 4 من مشروعي، سيكون JUnit 4 متاحًا للاستخدام بسبب Jersey. الطريقة الأكثر سهولة ستكون رفع إصدار jersey إلى 2.35 لأن JUnit 5 تم إدخاله في jersey-test 2.35، لكن لا أستطيع تحديث إطار jersey-test لأن مكتبات أخرى ستنكسر في مشروعي. إذن، في هذه الحالة، ماذا يمكنني أن أفعل؟

I can exclude JUnit from Jersey with Dependency Exclusions from Maven (like the image below). That way JUnit 4 will not be used anymore, but rather our JUnit 5. 

عندما تقوم ب تشغيل بعض الاختبارات التي تستخدم Jersey، لن يتم تحميلها، لأن هناك طرقًا في Jersey تستخدم تسميات JUnit 4، setUp و tearDown، باستخدام @Before و @After. لحل هذه المشكلة، يمكنك إنشاء فئة “Configuration Class” التي تُ扩展 JerseyTest وتطبق setUp و tearDown باستخدام @BeforeEach و @AfterEach وتقوم بنداء super.setUp() و super.TearDown().

Java

 

public class JerseyConfigToJUnit5 extends JerseyTest {

  @BeforeEach
  public void setUp() throws Exception {
  	super.setUp();
  }
  
  @AfterEach
  public void tearDown() throws Exception {
  	super.tearDown();
  }
}

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

هذا كل شيء يا شباب، الآن يمكنك أنت وفريقك الاستمتاع بـ JUnit 5 وتهدئة عقولكم علمًا بأن الاختبارات الجديدة ستُ created بـ JUnit 5 وWon’t يتحول المشروع إلى patchwork. لذا، تذكر، احتفظ بمشروعك محدثًا، لأن إذا نسيتهم مكتبتك، سيصبح من الصعب كل يوم تحديثها، دائمًا استخدم المواصفات والإطارات التي تتبع المواصفات، وامنح شفرة جيدة التصميم، هذا يسمح لك بالتغيير والتحرك بسهولة.

Source:
https://dzone.com/articles/junit-4-5-jupiter-vintage-how-to-deal