לאחר ש-JUnit 5 יוצא לאור, הרבה מפתחים פשוט הוסיפו את הספרייה החדשה ונפלאה הזו לפרויקטים שלהם, כי בניגוד לגרסיות אחרות, בגרסה החדשה זה לא נדרש להעביר מ-JUnit 4 ל-5, אתה רק צריך לכלול את הספרייה החדשה בפרויקט שלך, ועם כל המנוע של JUnit 5 אתה יכול לבצע את בדיקות החדשות שלך באמצעות JUnit 5, והישנות עם JUnit 4 או 3, ימשיכו לרוץ ללא בעיה.
אבל מה יכול לקרות בפרויקט גדול, פרויקט שנבנה לפני 10 שנים עם שתי גרסיות של JUnit רצות במקביל?
מפתחים חדשים התחילו לעבוד על הפרויקט, חלקם עם ניסיון ב-JUnit, אחרים לא. בדיקות חדשות נוצרו באמצעות JUnit 5, בדיקות חדשות נוצרו באמצעות JUnit 4, ובנקודה מסוימת מפתח ללא ידע, כאשר הוא יוצר סצנריו חדש בבדיקת JUnit 5 שכבר נוצרה, הוא פשוט מוסיף אנוטציה של JUnit 4, והבדיקה הופכת למיקס של @Test
של JUnit 4 ו-@Test
של JUnit 5, ובכל יום זה יותר קשה להסיר את ספריית JUnit 4.
אז איך אתה פותר את הבעיה הזו? ראשית כל, אתה צריך להראות לצוות שלך, מה הוא של JUnit 5 ומה של JUnit 4, כדי שבדיקות חדשות יוכלו להיות מוקמות באמצעות JUnit 5 במקום JUnit 4. אחר כך זה נחוץ להתבונן בחוק של השומר הטוב, בכל פעם שהם עוברים בדיקת JUnit 4, הם חייבים להעביר ל-JUnit 5.
בואו נראה את השינויים העיקריים ששוחררו ב-JUnit 5. הכל מתחיל מהשם, ב-JUnit 5 אתם לא רואים חבילות הנקראות org.junit5, אלא יותר נכון org.junit.jupiter. לסיכום, כל מה שאתם רואים עם "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:
@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.
כפי שאתם רואים, 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
. כדי לפתור זאת, אתם יכולים ליצור "כיתת תצורה" אחת שמתרשמת מ-JerseyTest
ומיישמת setUp
ו-tearDown
עם @BeforeEach
ו-@AfterEach
שקוראים ל-super.setUp()
ו-super.tearDown()
.
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 ולהרגע את הנפש כשיודעים שמבחנים חדשים יווצרו עם JUnit 5 והפרויקט לא יהפוך לפרוקסטרון. אז, זיכרו, שמרו את הפרויקט שלכם מעודכן, מכיוון שאם תשכחו את הספריות שלכם, כל יום יהיה קשה יותר לעדכן, תשתמשו תמיד בספציפיקציות ומערכות שמתאימות לספציפיקציות, ותשימו לב לתכנון טוב בקוד שלכם, זה מאפשר לכם לשנות ולנוע בקלות.
Source:
https://dzone.com/articles/junit-4-5-jupiter-vintage-how-to-deal