Java מתקדם | JUnit

Download Report

Transcript Java מתקדם | JUnit

‫קורס ‪ Java‬מתקדם‬
‫‪JUnit‬‬
‫קרן כליף‬
‫‪ Java‬מתקדם |‬
‫‪2 | ©Keren Kalif | JUnit‬‬
‫ביחידה זו נלמד‪:‬‬
‫‪ ‬מנגנון ה‪JUnit -‬‬
‫‪ ‬שיטת העבודה עם מנגנון ה‪JUnit -‬‬
‫‪ ‬הרצת בדיקות בשימוש ‪annotation‬‬
‫‪ ‬בדיקת אובייקטים‬
‫‪ ‬בדיקת חריגות‬
‫‪Fixture ‬‬
‫‪ ‬הרצת סוויטה של בדיקות‬
‫‪ Java‬מתקדם |‬
‫‪3 | ©Keren Kalif | JUnit‬‬
‫בדיקות תוכנה‬
‫‪ ‬כאשר כותבים מערכת תוכנה יש לבצע בדיקות‬
‫‪ ‬הבדיקות הינן בכמה רמות‪:‬‬
‫‪o‬‬
‫‪o‬‬
‫‪o‬‬
‫‪o‬‬
‫בדיקת המפתח על הקוד שלו (‪)Unit Test‬‬
‫בדיקות אינטגרציה מול רכיבים אחרים במערכת (‪)QA‬‬
‫בדיקות ‪ – regression‬בדיקה שקוד קודם עדיין עובד נכון‬
‫בדיקה אצל הלקוח‬
‫‪ ‬הדרך הרווחת (והפחות טובה) לבדיקות היא כתיבת הקוד‪ ,‬ואז בדיקה (קודם קוד מצוי ואז‬
‫בדיקות)‬
‫‪ ‬ישנה מגמה של ‪ Test Driven Programming‬שבה מראש מחליטים מה יהיו הבדיקות‬
‫שיבוצעו‪ ,‬מכינים את הקוד לבדיקה‪ ,‬ורק בסוף מקודדים את התוכנית (קודם בדיקות רצויות ואז‬
‫קוד)‬
‫‪ Java‬מתקדם |‬
‫‪4 | ©Keren Kalif | JUnit‬‬
‫‪JUnit‬‬
‫‪ Junit ‬הינו מנגנון מובנה בשפת ‪ JAVA‬המאפשר כתיבת מודול בדיקות והרצתן ברצף בצורה‬
‫נוחה‬
‫‪http://www.junit.org/ ‬‬
‫‪ ‬קוד בדיקה טוב הוא כזה המזהה באגים!‬
‫‪ Java‬מתקדם |‬
‫‪5 | ©Keren Kalif | JUnit‬‬
‫הגירסא להורדה‬
‫‪ ‬יש להוסיף ל‪ JDK -‬את ה‪ JAR -‬עם הספריות של ‪:JUnit‬‬
‫‪  Download JUnit  http://junit.org/ ‬יש להוריד את הגרסא האחרונה של ‪ JAR‬‬
‫לשמור את הקובץ במחשב‬
‫‪ ‬בסביבת העבודה לעמוד על הפרוייקט ‪ ‬לבחור בתפריט ‪ Properties  Project‬‬
‫‪  Java Build Path‬כרטיסיית ‪Add External Jars  Libraries‬‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪4‬‬
‫‪ Java‬מתקדם |‬
‫‪6 | ©Keren Kalif | JUnit‬‬
‫דוגמא‬
‫בסיסית‬
‫כדי לבדוק את המחלקה‬
‫‪ Calculator‬בעלת הממשק הבא‪:‬‬
‫הרצה אוטומטית של כל השיטות‬
‫המתחילות ב‪test -‬‬
‫קיים ב‪ jar -‬שהוספנו‬
‫בדיקת שוויון בין ‪ 2‬ערכים‬
‫‪ Java‬מתקדם |‬
‫‪7 | ©Keren Kalif | JUnit‬‬
‫הפלט‬
‫רצו רק השיטות ששמן‬
‫מתחיל ב‪test -‬‬
‫הסבר על הכישלון‬
‫‪ Java‬מתקדם |‬
‫‪8 | ©Keren Kalif | JUnit‬‬
‫גילינו שיש באג‪..‬‬
‫‪ ‬ראינו שהשיטה הנבדקת ב‪ ,testPowerVer1 -‬כלומר השיטה ‪ Calculator.power_ver1‬אינה‬
‫טובה‪ ,‬מאחר והיא מחזירה את הערך ‪0‬‬
‫הנה הבאג!‬
‫‪ Java‬מתקדם |‬
‫‪9 | ©Keren Kalif | JUnit‬‬
‫בסביבת העבודה ניתן להריץ גם בלי ‪main‬‬
‫‪ ‬סביבת העבודה מספקת לנו להריץ את קובץ הבדיקה גם ללא ‪:main‬‬
‫‪o‬‬
‫‪o‬‬
‫מקש ימני על קובץ הבדיקה ‪JUnit Test  Run As ‬‬
‫אופציה זו מריצה באופן סדרתי את כל השיטות בקובץ ששמן מתחיל ב‪test -‬‬
‫‪ Java‬מתקדם |‬
‫‪10 | ©Keren Kalif | JUnit‬‬
‫תוצאות הבדיקה‬
‫כאשר עומדים על אחת הבדיקות ניתן‬
‫לראות את התוצאה שלה בחלון התחתון‬
‫‪ Java‬מתקדם |‬
‫‪11 | ©Keren Kalif | JUnit‬‬
‫סיכום בניית מודול בדיקה‬
‫‪.1‬‬
‫יש לכתוב מחלקה היורשת מהמחלקה ‪ TestCase‬הקיימת ב‪.jar -‬‬
‫‪o‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫ניתן לכתוב ‪ constructor‬המקבל מחרוזת שתהייה שם סדרת הבדיקות‬
‫נכתוב שיטות בדיקה‪ ,‬שמן חייב להתחיל במילה ‪test‬‬
‫הרצת מודול הבדיקה‪:‬‬
‫‪o‬‬
‫ניתן לכתוב ‪ main‬שיריץ את כל שיטות הבדיקה‬
‫‪o‬‬
‫או לחילופין להריץ ללא ‪ main‬דרך סביבת העבודה‬
‫נבדוק את תוצאות הבדיקות ונתקן באגים‬
‫‪ Java‬מתקדם |‬
‫‪12 | ©Keren Kalif | JUnit‬‬
‫שיטות בדיקה הקיימות במנגנון‬
‫שם הבדיקה‬
‫תיאור‬
‫‪assertEquals‬‬
‫בודקת אם שני הביטויים שווים (מפעילה ‪)equals‬‬
‫‪assertNotEquals‬‬
‫בודקת אם שני הביטויים שונים‬
‫‪assertSame‬‬
‫בודקת שלשני משתנים יש הפניה זהה‬
‫‪assertNotSame‬‬
‫בודקת שלשני משתנים יש הפניה שונה‬
‫‪assertFalse‬‬
‫מופעלת עם ביטוי בוליאני ובודקת אם הוא ‪false‬‬
‫‪assertTrue‬‬
‫מופעלת עם ביטוי בוליאני ובודקת אם הוא ‪true‬‬
‫‪assertNull‬‬
‫מופעלת על משתנה ובודקת שהוא ‪null‬‬
‫‪assertNotNull‬‬
‫מופעלת על משתנה ובודקת שאינו ‪null‬‬
‫‪fail‬‬
‫מכשילה את ה‪test -‬‬
‫‪ ‬כל השיטות יכולות לקבל כפרמטר ראשון מחרוזת‪ ,‬שתהווה תיאור הבעיה‬
‫‪ Java‬מתקדם |‬
‫‪13 | ©Keren Kalif | JUnit‬‬
‫בדיקות לאובייקטים‬
‫מאחר והמחלקה ‪ Person‬לא דרסה את‬
‫‪ equals‬הבדיקה היא לפי הפניה‪...‬‬
‫‪ Java‬מתקדם |‬
‫‪14 | ©Keren Kalif | JUnit‬‬
‫בדיקות לאובייקטים (‪)2‬‬
‫מאחר והמחלקה ‪ Person‬כן דרסה‬
‫את ‪ equals‬הבדיקה הצליחה!‬
‫‪ Java‬מתקדם |‬
‫‪15 | ©Keren Kalif | JUnit‬‬
‫מה קורה כאשר ‪ assert‬אינו מצליח‬
‫‪ ‬השיטה מפסיקה‪ ,‬ה‪ test -‬נכשל‬
‫‪ ‬אם משתמשים ב‪ assert -‬לא בתוך ‪ test‬תהיה תעופה של התוכנית‪ ,‬ניתן לתפוס ע"י‬
‫‪.try+catch‬‬
‫‪ Java‬מתקדם |‬
‫‪16 | ©Keren Kalif | JUnit‬‬
‫דוגמאות בדיקה לחריגות (‪)1‬‬
17 | ©Keren Kalif | JUnit
| ‫ מתקדם‬Java
‫‪ Java‬מתקדם |‬
‫‪18 | ©Keren Kalif | JUnit‬‬
‫‪Fixture‬‬
‫‪ ‬ראינו בדוגמאות הקודמות שימוש בתכונות מחלקת הבדיקה ואתחולם בקונסטרקטור של‬
‫המחלקה‪.‬‬
‫‪ ‬המחלקה ‪ TestCase‬מכילה את השיטה ‪ setUp‬המופעלת עם תחילת הבדיקות‪ .‬ניתן לדרוס‬
‫את המימוש לשיטה זו ולאתחל בה את תכונות מחלקת הבדיקה (במקום ב‪.)constructor -‬‬
‫‪ ‬המחלקה ‪TestCase‬‬
‫מכילה גם את השיטה‬
‫‪ tearDown‬המופעלת‬
‫בסוף ה‪.TestCase -‬‬
‫האיור נלקח מ‪http://junit.sourceforge.net/doc/cookstour/cookstour.htm :‬‬
‫‪ Java‬מתקדם |‬
‫‪19 | ©Keren Kalif | JUnit‬‬
‫‪)2( Fixture‬‬
‫ניתן לראות את סדר הפעלת השיטות‪.‬‬
‫כרגע ‪ runTest‬לא הריצה אף ‪.test‬‬
‫ניתן להפעיל איזה ‪'test‬ים שרוצים משיטה זו‪.‬‬
‫‪ Java‬מתקדם |‬
‫‪20 | ©Keren Kalif | JUnit‬‬
‫‪)3( Fixture‬‬
‫ניתן לראות את סדר הפעלת השיטות‪.‬‬
‫כרגע ‪ runTest‬הריצה פעמיים את ‪.testForFun‬‬
‫‪ Java‬מתקדם |‬
‫‪21 | ©Keren Kalif | JUnit‬‬
‫‪)4( Fixture‬‬
‫מאחר ולא דרסנו את השיטה ‪ runTest‬מופעלות‬
‫באופן אוטומטי כל השיטות המתחילות ב‪.test -‬‬
‫‪ Java‬מתקדם |‬
‫‪22 | ©Keren Kalif | JUnit‬‬
‫‪)5( Fixture‬‬
‫‪ ‬אז מי מפעיל את השיטות ‪ setUp‬ו‪?tearDown -‬‬
‫‪o‬‬
‫‪o‬‬
‫כשמריצים מחלקת בדיקה (היורשת מ‪ )TestCase -‬מופעלת השיטה ‪ run‬של המחלקה‬
‫שיטה זו היא שיטת ‪ template‬המפעילה את השיטות בסדר שראינו‬
‫‪ Java‬מתקדם |‬
‫‪23 | ©Keren Kalif | JUnit‬‬
‫מתי מופעלים‬
‫ה‪ c’tor -‬וה‪-‬‬
‫‪?Fixture‬‬
‫ניתן לראות שהם מופעלים עבור כל שיטת ‪test‬‬
‫בנפרד‪ ,‬כלומר התכונות מאותחול כל פעם מחדש‪.‬‬
‫‪ Java‬מתקדם |‬
‫‪24 | ©Keren Kalif | JUnit‬‬
‫מדוע לא לאתחל ב‪ c’tor -‬אלא ב‪?setUp -‬‬
‫‪ ‬ניתן לאתחל בשני המקומות‪ ,‬אבל עדיף ב‪ setUp -‬מהסיבות הבאות‪:‬‬
‫‪ o‬יתכן ויש היררכית הורשה מורכבת ונרצה שהאתחול יבוצע רק בסוף‬
‫‪ o‬הטיפול במקרה של תעופה באתחול מטופל טוב יותר כאשר הוא קורה ב‪-‬‬
‫‪ setUp‬מאשר ב‪c’tor -‬‬
‫‪ Java‬מתקדם |‬
‫‪25 | ©Keren Kalif | JUnit‬‬
‫‪ TestCase‬ו‪TestSuite -‬‬
‫‪ ‬עד כה התוכנית הריצה שיטות ‪ test‬ממחלקה אחת בלבד‬
‫‪ ‬ניתן לכתוב תוכנית המאפשרת להריץ ‪'test‬ים ממחלקות שונות‬
‫‪ ‬במנגנון יש מחלקה הנקראית ‪ TestSuite‬והיא יכולה להכיל אוסף בדיקות ממחלקות שונות‬
‫‪ ‬נקראית "סוויטה" מאחר ויכולה להכיל בדיקות רבות ממקורות שונים‬
‫‪ Java‬מתקדם |‬
‫‪26 | ©Keren Kalif | JUnit‬‬
‫הרצת מחלקות בדיקה רבות‬
‫הרצת כל שיטות הבדיקה שבמחלקות‬
‫שהועברו לקונסטרקטור של ‪TestSuite‬‬
‫‪ Java‬מתקדם |‬
‫‪27 | ©Keren Kalif | JUnit‬‬
‫הרצות שיטות בדיקה מסוימות ממחלקות בדיקה שונות‬
‫הרצת הסוויטה‬
‫הסוויטה‬
‫הוספת כל שיטות‬
‫הבדיקה שבמחלקה‬
‫הוספת שיטה‬
‫ספציפית מהמחלקה‬
‫מחזירה את מספר שיטות‬
‫הבדיקה שירוצו בסוויטה זו‬
‫‪ Java‬מתקדם |‬
‫‪28 | ©Keren Kalif | JUnit‬‬
‫כדי לאפשר הוספת שיטה ספציפית לבדיקה‬
‫‪ ‬בדוגמא הקודמת הוספנו לסוויטה שיטה ספציפית‪:‬‬
‫כדי לאפשר זאת יש לכתוב במחלקת‬
‫הבדיקה קונסטרקטור המקבל מחרוזת‬
‫‪ Java‬מתקדם |‬
‫‪29 | ©Keren Kalif | JUnit‬‬
‫שימוש במנגנון ה‪ annotation -‬ב‪JUnit -‬‬
‫‪ ‬מנגנון ה‪( JUnit -‬גרסא ‪ )3‬ראינו דרש שהשיטות לבדיקה יתחילו ב‪test -‬‬
‫‪ ‬באמצעות מנגנון ה‪ reflection -‬הקומפיילר זיהה איזה שיטות להפעיל‬
‫‪ ‬עם פיתוח מנגנון ה‪ annotation -‬יש שינוי במנגנון ה‪( JUnit -‬גרסא ‪:)4‬‬
‫‪o‬‬
‫נוסף ‪ annotation‬הנקרא ‪ Test‬הזמין בזמן ריצה והקומפיילר מריץ את כל השיטות שסומנו ב‪-‬‬
‫‪ annotation‬זה‬
‫‪ Java‬מתקדם |‬
‫‪30 | ©Keren Kalif | JUnit‬‬
‫דוגמא‬
‫לא יורשים מ‪TestCase -‬‬
‫לא ניתן לבצע ‪ import‬לספריה זו כי תהייה התנגשות‬
‫עם ההגדרה של ה‪ annotation -‬של ה‪Test -‬‬
‫יצירת סוויטה המכילה את כל השיטות במחלקה‬
‫באמצעות ‪ adapter‬המקשר לגרסא ‪3‬‬
‫הפקודה המריצה את הסוויטה‪ .‬ניתן‬
‫ישירות דרך סביבת העבודה בלי ‪.main‬‬
‫‪ Java‬מתקדם |‬
‫‪31 | ©Keren Kalif | JUnit‬‬
‫שגיאה מסביבת העבודה‬
‫‪ ‬הרצת התוכנית הקודמת עלולה לייצר את השגיאה הבאה בזמן ריצה‪ ,‬למרות שלא שכחנו‬
‫להוסיף את ה‪ JAR -‬של ה‪:JUnit -‬‬
‫‪ ‬הפתרון הוא הוספת הספריה של ה‪ JUnit -‬לפרוייקט‪:‬‬
‫‪o‬‬
‫מקש ימני על הפרוייקט ‪properties ‬‬
‫(עם גרסא ‪ 3‬זה לא יעבוד)‬
‫‪Libraries ‬‬
‫‪ Add Library ‬ולבחור ב‪ JUnit -‬גרסא ‪4‬‬
‫‪ Java‬מתקדם |‬
‫‪32 | ©Keren Kalif | JUnit‬‬
‫‪ annotation‬נוספים ל‪JUnit -‬‬
‫יורץ לפני כל ‪test‬‬
‫יורץ לאחר כל ‪test‬‬
‫יורץ פעם אחת לפני כל ה‪'test -‬ים‬
‫יורץ פעם אחת לאחר כל ה‪'test -‬ים‬
‫‪ Java‬מתקדם |‬
‫‪33 | ©Keren Kalif | JUnit‬‬
‫השוואה בין ‪ JUnit‬גרסא ‪ 3‬לגרסא ‪4‬‬
‫‪JUnit 3‬‬
‫‪JUnit 4‬‬
‫מחלקת בסיס‬
‫‪TestCase‬‬
‫‪-‬‬
‫זיהוי שיטות להרצה‬
‫שיטות המתחילות במילה ‪test‬‬
‫שיטות שסומנו ב‪Test :annotation -‬‬
‫שיטה הרצה לפני כל מתודת‬
‫בדיקה‬
‫‪setUp‬‬
‫שיטות שסומנו ב‪Before :annotation -‬‬
‫שיטה הרצה לאחר כל מתודת‬
‫בדיקה‬
‫‪tearDown‬‬
‫שיטות שסומנו ב‪After :annotation -‬‬
‫שיטה הרצה פעם לפני כל‬
‫מתודות הבדיקה‬
‫‪-‬‬
‫שיטות שסומנו ב‪BeforeClass :annotation -‬‬
‫שיטה הרצה פעם לאחר כל‬
‫מתודות הבדיקה‬
‫‪-‬‬
‫שיטות שסומנו ב‪AfterClass :annotation -‬‬
‫היתרון בשימוש בהן הוא אתחול פעם אחת משהו שאין‬
‫צורך שיאותחל בנפרד לפני כל ‪ ,Test‬למשל חיבור‬
‫וסגירת קישור ל‪DB -‬‬
34 | ©Keren Kalif | JUnit
| ‫ מתקדם‬Java
@Test ‫ של‬expected ‫השדה‬
-‫אם לא תיזרק חריגה זו ה‬
‫ יכשל‬test
‫‪ Java‬מתקדם |‬
‫‪35 | ©Keren Kalif | JUnit‬‬
‫השדה ‪ timeout‬של ‪@Test‬‬
‫‪ test‬שאינו מסתיים תוך הזמן המבוקש יכשל‬
‫‪ Java‬מתקדם |‬
‫‪36 | ©Keren Kalif | JUnit‬‬
‫ביחידה זו למדנו‪:‬‬
‫‪ ‬מנגנון ה‪JUnit -‬‬
‫‪ ‬שיטת העבודה עם מנגנון ה‪JUnit -‬‬
‫‪ ‬הרצת בדיקות בשימוש ‪annotation‬‬
‫‪ ‬בדיקת אובייקטים‬
‫‪ ‬בדיקת חריגות‬
‫‪Fixture ‬‬
‫‪ ‬הרצת סוויטה של בדיקות‬