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
הרצת סוויטה של בדיקות