מדריך ל- JUnit 5

1. סקירה כללית

JUnit היא אחת ממסגרות בדיקות היחידות הפופולריות ביותר במערכת האקולוגית של ג'אווה. גרסת JUnit 5 מכילה מספר חידושים מרגשים, עם המטרה לתמוך בתכונות חדשות ב- Java 8 ומעלה, כמו גם אפשרות לסגנונות בדיקות רבים ושונים.

2. תלות Maven

הגדרת JUnit 5.x.0 היא די פשוטה, עלינו להוסיף את התלות הבאה שלנו pom.xml:

 org.junit.jupiter junit-jupiter-engine 5.1.0 test 

חשוב לציין כי גרסה זו דורש Java 8 לעבוד.

יתרה מכך, יש כעת תמיכה ישירה להפעלת בדיקות יחידות בפלטפורמת JUnit באקליפס כמו גם ב- IntelliJ. אתה יכול, כמובן, גם לבצע בדיקות באמצעות מטרת מבחן Maven.

מצד שני, IntelliJ תומכת כברירת מחדל ב- JUnit 5. לכן הפעלת JUnit 5 ב- IntelliJ היא די פשוטה, פשוט לחץ לחיצה ימנית -> הפעל, או Ctrl-Shift-F10.

3. אדריכלות

JUnit 5 מורכב ממספר מודולים שונים משלושה פרויקטים שונים:

3.1. פלטפורמת JUnit

הפלטפורמה אחראית על השקת מסגרות בדיקה ב- JVM. הוא מגדיר ממשק יציב וחזק בין JUnit ללקוח שלה כגון כלי בנייה.

המטרה הסופית היא כיצד לקוחותיה משתלבים בקלות עם JUnit בגילוי וביצוע הבדיקות.

זה גם מגדיר את ה- API של TestEngine לפיתוח מסגרת בדיקות הפועלת על פלטפורמת JUnit. על ידי כך, תוכל לחבר ספריות בדיקה של צד שלישי, ישירות ל- JUnit, על ידי יישום TestEngine מותאם אישית.

3.2. יונייט יופיטר

מודול זה כולל מודלים חדשים של תכנות והרחבה לכתיבת מבחנים ב- JUnit 5. ביאורים חדשים בהשוואה ל- JUnit 4 הם:

  • @TestFactory - מציין שיטה שהיא מפעל בדיקות לבדיקות דינמיות
  • @הצג שם - מגדיר שם תצוגה מותאם אישית לשיעור בדיקה או לשיטת בדיקה
  • @ מקונן - מציין שהשיעור המבואר הוא כיתת מבחן מקוננת ולא סטטית
  • @תָג - מצהיר תגים לבדיקות סינון
  • @ExtendWith - הוא משמש לרישום סיומות מותאמות אישית
  • @ לפני כל אחד - מציין כי השיטה המבוארת תבוצע לפני כל שיטת בדיקה (בעבר @לפני)
  • @אחרי כל אחד - מציין כי השיטה המבוארת תבוצע לאחר כל שיטת בדיקה (בעבר @לאחר)
  • @ לפני כל - מציין ששיטת ההערה תבוצע לפני כל שיטות הבדיקה במחלקה הנוכחית (בעבר @לפני השיעור)
  • @אחרי הכל - מציין כי השיטה המבוארת תבוצע לאחר כל שיטות הבדיקה במחלקה הנוכחית (בעבר @אחרי השיעור)
  • @ השבת - משתמשים בו כדי להשבית כיתת מבחן או שיטה (בעבר @להתעלם)

3.3. JUnit Vintage

תומך בהפעלת בדיקות מבוססות JUnit 3 ו- JUnit 4 בפלטפורמת JUnit 5.

4. הערות בסיסיות

כדי לדון בהערות חדשות חילקנו את החלק לקבוצות הבאות האחראיות לביצוע: לפני המבחנים, במהלך המבחנים (אופציונלי) ואחרי המבחנים:

4.1. @ לפני כל ו @ לפני כל אחד

להלן דוגמה לקוד הפשוט שיש לבצע לפני מקרי הבדיקה העיקריים:

@BeforeAll התקנת החלל הסטטי () {log.info ("@ BeforeAll - מבוצעת פעם אחת לפני כל שיטות הבדיקה במחלקה זו"); } @BeforeEach void init () {log.info ("@ BeforeEach - מבוצע לפני כל שיטת בדיקה בכיתה זו"); }

חשוב לציין כי השיטה עם @ לפני כל ההערה צריכה להיות סטטית, אחרת הקוד לא יתקבץ.

4.2. @הצג שם ו @נָכֶה

בואו נעבור לשיטות חדשות לבחירה:

@DisplayName ("בדיקה אחת מוצלחת") @Test בטל testSingleSuccessTest () {log.info ("הצלחה"); } @Test @Disabled ("עדיין לא מיושם") בטל testShowSomething () {}

כפי שאנו רואים, אנו עשויים לשנות את שם התצוגה או להשבית את השיטה באמצעות תגובה באמצעות הערות חדשות.

4.3. @אחרי כל אחד ו @אחרי הכל

לבסוף, נדון בשיטות הקשורות לפעולות לאחר ביצוע הבדיקות:

@AfterEach בטל tearDown () {log.info ("@ AfterEach - מבוצע לאחר כל שיטת בדיקה."); } @AfterAll הריק הסטטי נעשה () {log.info ("@ AfterAll - מבוצע אחרי כל שיטות הבדיקה."); }

שים לב לשיטה זו עם @אחרי הכל צריך להיות גם שיטה סטטית.

5. קביעות והנחות

JUnit 5 מנסה לנצל עד תום את התכונות החדשות של Java 8, במיוחד ביטויים למבדה.

5.1. קביעות

הטענות הועברו ל org.junit.jupiter.api.Asserstions ושופרו משמעותית. כפי שהוזכר קודם לכן, כעת תוכל להשתמש במבדות בקבוצות:

@Test בטל lambdaExpressions () {assertTrue (Stream.of (1, 2, 3) .stream () .mapToInt (i -> i) .sum ()> 5, () -> "הסכום צריך להיות גדול מ- 5" ); }

למרות שהדוגמה שלמעלה היא טריוויאלית, יתרון אחד בשימוש בביטוי למבדה למסר הקביעה הוא שהוא מוערך בעצלתיים, דבר שיכול לחסוך זמן ומשאבים אם בניית המסר יקרה.

כעת ניתן גם לקבץ קביעות עם assertAll () אשר ידווח על קביעות כושלות בתוך הקבוצה באמצעות א MultipleFailuresError:

 @Test בטל groupAssertions () {int [] numbers = {0, 1, 2, 3, 4}; assertAll ("numbers", () -> assertEquals (numbers [0], 1), () -> assertEquals (numbers [3], 3), () -> assertEquals (numbers [4], 1)); }

המשמעות היא שכעת בטוח יותר לבצע קביעות מורכבות יותר, מכיוון שתוכל לאתר את המיקום המדויק של כל תקלה.

5.2. הנחות

ההנחות משמשות להפעלת בדיקות רק אם מתקיימים תנאים מסוימים. זה משמש בדרך כלל לתנאים חיצוניים הנדרשים להפעלת תקינות הבדיקה, אך שאינם קשורים ישירות לכל מה שנבדק.

אתה יכול להכריז על הנחה עם מניח נכון (), מניח שקר (), ו בהנחה ש().

@Test בטל trueAssumption () {assectTrue (5> 1); assertEquals (5 + 2, 7); } @Test בטל falseAssumption () {assetFalse (5 assertEquals (2 + 2, 4)); }

אם הנחה נכשלת, א TestAbortedException נזרק ופשוט מדלגים על הבדיקה.

הנחות יסוד מבינות גם ביטויים למבדה.

6. בדיקת חריגים

ישנן שתי דרכים לבדיקת חריגים ב- JUnit 5. ניתן ליישם את שתיהן באמצעות assertTrows () שיטה:

@Test בטל shouldThrowException () {יוצא מן הכלל = assertThrows (UnsupportedOperationException.class, () -> {זרוק UnsupportedOperationException חדש ("לא נתמך");}); assertEquals (exception.getMessage (), "לא נתמך"); } @Test בטל assertThrowsException () {String str = null; assertThrows (IllegalArgumentException.class, () -> {Integer.valueOf (str);}); }

הדוגמה הראשונה משמשת לאימות פרטים נוספים על החריג שנזרק והשנייה רק ​​מאמתת את סוג החריג.

7. סוויטות מבחן

כדי להמשיך בתכונות החדשות של JUnit 5, ננסה להכיר את הרעיון של צבירת שיעורי מבחן מרובים בחבילת מבחן כדי שנוכל להריץ אותם יחד. JUnit 5 מספק שתי הערות: @SelectPackages ו @SelectClasses ליצור סוויטות מבחן.

יש לזכור כי בשלב מוקדם זה, רוב ה- IDE אינם תומכים בתכונות אלה.

בואו נסתכל על הראשון:

@RunWith (JUnitPlatform.class) @SelectPackages ("com.baeldung") מחלקה ציבורית AllUnitTest {}

@SelectPackage משמש לציין את שמות החבילות שיש לבחור בעת הפעלת חבילת בדיקה. בדוגמה שלנו, זה יפעיל את כל המבחנים. ההערה השנייה, @SelectClasses, משמש לציין את הכיתות שיש לבחור בעת הפעלת חבילת בדיקה:

@RunWith (JUnitPlatform.class) @SelectClasses ({AssertionTest.class, AssumptionTest.class, ExceptionTest.class}) מחלקה ציבורית AllUnitTest {}

לדוגמה, מעל המחלקה תיצור חבילה המכילה שלוש שיעורי מבחן. שימו לב שהשיעורים לא חייבים להיות בחבילה אחת אחת.

8. מבחנים דינמיים

הנושא האחרון שברצוננו להציג הוא תכונת הבדיקות הדינמיות של JUnit 5, המאפשרת להכריז ולהריץ מקרי בדיקות שנוצרו בזמן הריצה. בניגוד למבחנים הסטטיים המגדירים מספר קבוע של מקרי בדיקה בזמן הקומפילציה, המבחנים הדינמיים מאפשרים לנו להגדיר את מקרה המבחנים באופן דינמי בזמן הריצה.

ניתן ליצור בדיקות דינמיות באמצעות שיטת מפעל שמסומנת עליה @TestFactory. בואו נסתכל על דוגמת הקוד:

@TestFactory זרם ציבורי translateDynamicTestsFromStream () {return in.stream () .map (word -> DynamicTest.dynamicTest ("Test translate" + word, () -> {int id = in.indexOf (word); assertEquals (out. לקבל (id), לתרגם (word));})); }

הדוגמה הזו מאוד פשוטה וקל להבנה. אנו רוצים לתרגם מילים באמצעות שתיים רשימת מערך, בשם ב ו הַחוּצָה, בהתאמה. על שיטת המפעל להחזיר א זרם, אוסף, ניתן לנידון, או איטרטור. במקרה שלנו, אנו בוחרים ב- Java 8 זרם.

שים לב ש @TestFactory שיטות לא יכולות להיות פרטיות או סטטיות. מספר המבחנים הוא דינמי, וזה תלוי ב- רשימת מערך גודל.

9. מסקנה

הכתב היה סקירה מהירה של השינויים שמגיעים עם JUnit 5.

אנו יכולים לראות כי ל- JUnit 5 יש שינוי גדול בארכיטקטורה שלו שקשור למשגר פלטפורמות, אינטגרציה עם כלי הבנייה, IDE, מסגרות אחרות לבדיקת יחידות וכו '. יתר על כן, JUnit 5 משולב יותר עם Java 8, במיוחד עם מושגי Lambdas ו- Stream .

את הדוגמאות המשמשות במאמר זה ניתן למצוא בפרויקט GitHub.