מעבר מ- JUnit 4 ל- JUnit 5
1. סקירה כללית
במאמר זה נראה כיצד נוכל לעבור מ- JUnit 4 למהדורה האחרונה של JUnit 5 - עם סקירה על ההבדלים בין שתי הגרסאות של הספרייה.
להנחיות הכלליות לשימוש ב- JUnit 5, עיין במאמר שלנו כאן.
2. יתרונות JUnit 5
נתחיל עם הגרסה הקודמת - ל- JUnit 4 יש מגבלות ברורות:
- המסגרת כולה נכללה בספריית צנצנות אחת. יש לייבא את כל הספרייה גם כאשר נדרשת רק תכונה מסוימת. ב- JUnit 5 אנו מקבלים יותר פירוט ויכולים לייבא רק את הדרוש
- רץ מבחן אחד יכול לבצע רק בדיקות ב- JUnit 4 בכל פעם (למשל. SpringJUnit4ClassRunner אוֹ פרמטרים ). JUnit 5 מאפשר לרצים מרובים לעבוד בו זמנית
- JUnit 4 מעולם לא התקדם מעבר ל- Java 7, והחמיץ הרבה תכונות מ- Java 8. JUnit 5 עושה שימוש טוב בתכונות Java 8
הרעיון מאחורי JUnit 5 היה לשכתב לחלוטין את JUnit 4 כדי לפתור את רוב החסרונות הללו.
3. הבדלים
JUnit 4 חולק למודולים הכוללים את JUnit 5:
- פלטפורמת JUnit - מודול זה סוקר את כל מסגרות ההרחבות שאולי אנו מעוניינים בביצוע, גילוי ודיווח על הבדיקה
- JUnit Vintage - מודול זה מאפשר תאימות לאחור עם JUnit 4 או אפילו JUnit 3
3.1. ביאורים
JUnit 5 מגיע עם שינויים חשובים במסגרת ההערות שלו. החשוב ביותר הוא שאנחנו כבר לא יכולים להשתמש בו @מִבְחָן ביאור לציון ציפיות.
ה צָפוּי פרמטר ב- JUnit 4:
@Test (צפוי = Exception.class) בטל ציבורי צריךRaiseAnException () זורק Exception {// ...}
כעת אנו יכולים להשתמש בשיטה טוען זורק:
חלל ציבורי צריךRaiseAnException () זורק חריג {Assertions.assertThrows (Exception.class, () -> {// ...}); }
ה פסק זמן תכונה ב- JUnit 4:
@Test (פסק זמן = 1) בטל ציבורי shouldFailBecauseTimeout () זורק InterruptedException {Thread.sleep (10); }
עכשיו ה assertTimeout שיטה ב- JUnit 5:
@Test הציבורי בטל shouldFailBecauseTimeout () זורק InterruptedException {Assertions.assertTimeout (Duration.ofMillis (1), () -> Thread.sleep (10)); }
הערות אחרות ששונו בתוך יוני 5:
- @לפני ההערה שונה לשם @ לפני כל אחד
- @לאחר ההערה שונה לשם @אחרי כל אחד
- @לפני השיעור ההערה שונה לשם @ לפני כל
- @אחרי השיעור ההערה שונה לשם @אחרי הכל
- @להתעלם ההערה שונה לשם @נָכֶה
3.2. קביעות
כעת אנו יכולים לכתוב הודעות קביעה במבדה ב- JUnit 5, מה שמאפשר להערכה העצלה לדלג על בניית מסרים מורכבת עד הצורך:
@Test public void shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation () {Assertions.assertTrue (2 == 3, () -> "מספרים" + 2 + "ו-" + 3 + "אינם שווים!"); }
אנו יכולים גם לקבץ קביעות ב- JUnit 5:
@Test ציבורי בטל shouldAssertAllTheGroup () {List list = Arrays.asList (1, 2, 4); Assertions.assertAll ("הרשימה אינה מצטברת", () -> Assertions.assertEquals (list.get (0) .intValue (), 1), () -> Assertions.assertEquals (list.get (1) .intValue ( ), 2), () -> Assertions.assertEquals (list.get (2) .intValue (), 3)); }
3.3. הנחות
החדש הנחות השיעור נמצא כעת org.junit.jupiter.api.Anisations. JUnit 5 תומך באופן מלא בשיטות ההנחות הקיימות ב- JUnit 4 ומוסיף קבוצה של שיטות חדשות כדי לאפשר הפעלת קביעות מסוימות רק בתרחישים ספציפיים בלבד:
@ מבחן ציבורי בטל כאשר סביבהIsWeb_thenUrlsShouldStartWithHttp () {assumingThat ("WEB" .equals (System.getenv ("ENV")), () -> {assertTrue ("http" .startsWith (address));}); }
3.4. תיוג וסינון
ב- JUnit 4 נוכל לקבץ מבחנים באמצעות ה- @קטגוריה ביאור. עם JUnit 5, ה- @קטגוריה ההערה מוחלפת ב- @תָג ביאור:
@Tag ("הערות") @Tag ("junit5") @RunWith (JUnitPlatform.class) בכיתה ציבורית AnnotationTestExampleTest {/*...*/}
אנו יכולים לכלול / לא לכלול תגים מסוימים באמצעות תוסף maven-surefire:
maven-surefire-plugin junit5
3.5. הערות חדשות למבחני ריצה
ה @לרוץ עם שימש לשילוב הקשר ההבדל עם מסגרות אחרות או לשינוי זרימת הביצוע הכוללת במקרי הבדיקה ב- JUnit 4.
עם JUnit 5, כעת אנו יכולים להשתמש ב- @ExtendWith ביאור לספק פונקציונליות דומה.
כדוגמה, לשימוש בתכונות האביב ב- JUnit 4:
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) כיתה ציבורית SpringExtensionTest {/*...*/}
עכשיו, ב- JUnit 5 זו סיומת פשוטה:
@ExtendWith (SpringExtension.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) SpringExtensionTest הציבורית בכיתה ציבורית {/*...*/}
3.6. הערות על כללי בדיקה חדשים
ב- JUnit 4, @כְּלָל ו- @ClassRule הערות שימשו כדי להוסיף פונקציונליות מיוחדת למבחנים.
ב- JUnit 5. אנו יכולים לשחזר את אותו ההיגיון באמצעות ה- @ExtendWith ביאור.
לדוגמה, נניח שיש לנו כלל מותאם אישית ב- JUnit 4 לכתוב עקבות יומן לפני ואחרי בדיקה:
מחלקה ציבורית TraceUnitTestRule מיישמת את TestRule {@Override הצהרה ציבורית חלה (בסיס הצהרה, תיאור תיאור) {החזר הצהרה חדשה () {@Override public void evalu () זורק Throwable {// לפני ואחרי הערכת מעקב כאן ...}} }}
ואנחנו מיישמים את זה בחבילת בדיקה:
@Rule ציבורי TraceUnitTestRule traceRuleTests = TraceUnitTestRule חדש ();
ב- JUnit 5 נוכל לכתוב את אותו הדבר בצורה הרבה יותר אינטואיטיבית:
מחלקה ציבורית TraceUnitExtension מיישמת AfterEachCallback, BeforeEachCallback {@Override public void eachEach (TestExtensionContext context) זורק חריג {// ...} @Override public void afterEach (TestExtensionContext context) זורק חריג {// ...}}
שימוש ב- JUnit 5 AfterEachCallback ו BeforeEachCallback ממשקים זמינים בחבילה org.junit.jupiter.api.extension, אנו מיישמים כלל זה בקלות בחבילת הבדיקה:
@RunWith (JUnitPlatform.class) @ExtendWith (TraceUnitExtension.class) מחלקה ציבורית RuleExampleTest {@Test public בטל whenTracingTests () {/*...*/}}
3.7. JUnit 5 בציר
JUnit Vintage מסייע בהעברת מבחני JUnit על ידי הפעלת מבחני JUnit 3 או JUnit 4 בהקשר JUnit 5.
אנו יכולים להשתמש בו על ידי ייבוא מנוע JUnit Vintage:
org.junit.vintage junit-vintage-engine $ {junit5.vintage.version} מבחן
4. מסקנה
כפי שראינו במאמר זה, JUnit 5 הוא מודולרי ומודרני של מסגרת JUnit 4. הצגנו את ההבדלים העיקריים בין שתי הגרסאות הללו ורמזנו כיצד לעבור מאחד לשני.
ניתן למצוא את היישום המלא של מדריך זה ב- GitHub.