@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. הקדמה

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

אנו גם נסקור בקצרה את @לאחר ביאורים משלימים.

נתחיל ב- JUnit 4.

2. @לפני

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

בואו נראה דוגמה שבה אנו מאותחל רשימה ונוסיף כמה ערכים:

@RunWith (JUnit4.class) מחלקה ציבורית BeforeAndAfterAnnotationsUnitTest {// ... רשימת רשימה פרטית; @ לפני init בטל פומבי () {LOG.info ("הפעלה"); list = ArrayList חדש (Arrays.asList ("test1", "test2")); } @ לאחר פירוק חלל ריק () {LOG.info ("פירוק"); list.clear (); }}

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

לאחר מכן, בואו נוסיף כמה בדיקות כדי לבדוק את גודל הרשימה שלנו:

@ מבחן ציבורי בטל כאשרCheckingListSize_thenSizeEqualsToInit () {LOG.info ("מבחן ביצוע"); assertEquals (2, list.size ()); list.add ("מבחן אחר"); } @Test ציבורי בטל כאשרCheckingListSizeAgain_thenSizeEqualsToInit () {LOG.info ("ביצוע בדיקה נוספת"); assertEquals (2, list.size ()); list.add ("מבחן נוסף"); }

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

אם נסתכל על פלט היומן אנו יכולים לבדוק כי init ו לקרוע שיטות בוצעו פעם אחת לבדיקה:

... הפעלה ... ביצוע בדיקה נוספת ... פירוק ... הפעלה ... ביצוע בדיקה ... פירוק

3. @לפני השיעור

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

בואו ליצור מחלקת בדיקה פשוטה המדמה יצירת חיבור מסד נתונים:

@RunWith (JUnit4.class) מחלקה ציבורית BeforeClassAndAfterClassAnnotationsUnitTest {// ... @BeforeClass הגדרת חלל סטטי ציבורית () {LOG.info ("אתחול - יצירת חיבור DB"); } @ AfterClass חלל סטטי ציבורי tearDown () {LOG.info ("סוגר חיבור DB"); }}

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

כמו שעשינו בעבר, בואו נוסיף גם כמה בדיקות פשוטות:

@Test ציבורי בטל simpleTest () {LOG.info ("מבחן פשוט"); } @Test הציבור מבטל את AnotherSimpleTest () {LOG.info ("מבחן פשוט נוסף"); }

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

... הפעלה - יצירת חיבור DB ... בדיקה פשוטה ... בדיקה פשוטה נוספת ... סגירת חיבור DB

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

@BeforeEacיד @ לפני כל הם המקבילים JUnit 5 של @לפני ו @לפני השיעור. הערות אלה שונו עם שמות ברורים יותר כדי למנוע בלבול.

בואו לשכפל את השיעורים הקודמים שלנו באמצעות ההערות החדשות האלה, החל מ- @ לפני כל אחד ו @אחרי כל אחד ביאורים:

מחלקה @RunWith (JUnitPlatform.class) BeforeEachAndAfterEachAnnotationsUnitTest {// ... רשימת רשימה פרטית; @BeforeEach בטל init () {LOG.info ("הפעלה"); list = ArrayList חדש (Arrays.asList ("test1", "test2")); } @AfterEach הורדת ריק () {LOG.info ("פירוק"); list.clear (); } // ...}

אם נבדוק יומנים, נוכל לאשר שזה עובד באותה צורה כמו עם ה- @לפני ו @לאחר ביאורים:

... הפעלה ... ביצוע בדיקה נוספת ... פירוק ... הפעלה ... ביצוע בדיקה ... פירוק

לבסוף, בואו נעשה את אותו הדבר עם שיעורי המבחן האחרים כדי לראות את @ לפני כל ו @אחרי הכל ביאורים בפעולה:

@RunWith (JUnitPlatform.class) מחלקה ציבורית BeforeAllAndAfterAllAnnotationsUnitTest {// ... @BeforeAll התקנת חלל סטטי ציבורית () {LOG.info ("הפעלה - יצירת חיבור DB"); } @ AfterAll חלל סטטי ציבורי tearDown () {LOG.info ("סוגר חיבור DB"); } // ...}

והפלט זהה לזה עם ההערה הישנה:

... הפעלה - יצירת חיבור DB ... בדיקה פשוטה ... בדיקה פשוטה נוספת ... סגירת חיבור DB

5. מסקנה

במאמר זה הראינו את ההבדלים בין @לפני, @לפני השיעור, @ לפני כל אחד ו @ לפני כל הערות ב- JUnit ומתי יש להשתמש בכל אחת מהן.

כמו תמיד, קוד המקור המלא של הדוגמאות זמין באתר GitHub.