- בדיקת אינטגרציה של מסד נתונים באמצעות MariaDB להחלפת MySql
- יישום יישום רב לשוני
- שמירת קבצים באפליקציה ונתונים עליהם במסד הנתונים
סוגי בדיקות
מה זה מבחן? כפי שאומר ויקי: " מבחן או מבחן הם דרך לחקור את התהליכים הבסיסיים של מערכת על ידי הצבת המערכת במצבים שונים ומעקב אחר שינויים נצפים בה." במילים אחרות, זהו בדיקה של הפעולה הנכונה של המערכת שלנו במצבים מסוימים.-
בדיקת יחידה היא בדיקות שתפקידן לבדוק כל מודול של המערכת בנפרד. רצוי שאלו חלקים של המערכת הניתנים לחלוקה מינימלית, למשל מודולים.
-
בדיקת מערכת היא בדיקה ברמה גבוהה לבדיקת הפעולה של חלק גדול יותר של אפליקציה או של המערכת כולה.
-
בדיקת רגרסיה היא בדיקה המשמשת כדי לבדוק האם תכונות חדשות או תיקוני באגים משפיעים על הפונקציונליות הקיימת של האפליקציה והאם באגים ישנים מופיעים שוב.
-
בדיקה פונקציונלית היא בדיקת תאימות של חלק מהאפליקציה לדרישות המצוינות במפרטים, בסיפורי משתמשים וכו'.
סוגי בדיקות תפקודיות:
- בדיקת "קופסה לבנה" לעמידה של חלק מהאפליקציה בדרישות תוך הכרת היישום הפנימי של המערכת;
- בדיקת "קופסה שחורה" לעמידה של חלק מהאפליקציה בדרישות ללא ידיעה על היישום הפנימי של המערכת.
- בדיקת ביצועים היא סוג של בדיקות שנכתבות כדי לקבוע את המהירות שבה מערכת או חלק ממנה פועלים בעומס מסוים.
- בדיקת עומסים - בדיקות שנועדו לבדוק את יציבות המערכת בעומסים סטנדרטיים ולמצוא את השיא המקסימלי האפשרי בו האפליקציה פועלת בצורה נכונה.
- בדיקת מאמץ היא סוג של בדיקה שנועדה לבדוק את הפונקציונליות של אפליקציה בעומסים לא סטנדרטיים ולקבוע את השיא המקסימלי האפשרי שבו המערכת לא תתרסק.
- בדיקות אבטחה - בדיקות המשמשות לבדיקת אבטחת מערכת (מהתקפות של האקרים, וירוסים, גישה לא מורשית לנתונים חסויים ועוד הנאות חיים).
- בדיקת לוקליזציה היא בדיקת לוקליזציה עבור אפליקציה.
- בדיקת שמישות היא סוג של בדיקה שמטרתה לבדוק שימושיות, מובנות, אטרקטיביות ויכולת למידה עבור המשתמשים. כל זה נשמע טוב, אבל איך זה עובד בפועל? זה פשוט: נעשה שימוש בפירמידת הבדיקה של מייק קון:
-
Unit - בדיקות יחידה המשמשות בשכבות שונות של האפליקציה, בודקות את ההיגיון הניתן לחלוקה הקטן ביותר של האפליקציה: למשל, מחלקה, אך לרוב שיטה. בדיקות אלו מנסות בדרך כלל לבודד כמה שניתן מהיגיון חיצוני, כלומר ליצור אשליה ששאר האפליקציה עובדת במצב סטנדרטי.
תמיד צריכות להיות הרבה בדיקות אלו (יותר מסוגים אחרים), מכיוון שהן בודקות חתיכות קטנות והן מאוד קלות משקל, לא צורכות הרבה משאבים (במשאבים אני מתכוון ל-RAM וזמן).
-
אינטגרציה - בדיקת אינטגרציה. זה בודק חלקים גדולים יותר של המערכת, כלומר, זה או שילוב של כמה חלקים של לוגיקה (כמה שיטות או מחלקות), או את נכונות העבודה עם רכיב חיצוני. בדרך כלל יש פחות מבדיקות אלו מאשר בדיקות יחידה, מכיוון שהן כבדות יותר.
כדוגמה למבחני אינטגרציה, אתה יכול לשקול להתחבר למסד נתונים ולבדוק את הביצוע הנכון של השיטות שעובדות איתו .
-
UI - בדיקות הבודקות את פעולת ממשק המשתמש. הם משפיעים על ההיגיון בכל רמות האפליקציה, ולכן הם נקראים גם מקצה לקצה. ככלל, יש הרבה פחות מהם, מכיוון שהם בעלי המשקל הכבד ביותר וחייבים לבדוק את הנתיבים הנחוצים ביותר (המשומשים).
באיור לעיל אנו רואים את היחס בין השטחים של חלקים שונים של המשולש: בערך אותו פרופורציה נשמר במספר המבחנים הללו בעבודה אמיתית.
היום נסתכל מקרוב על המבחנים הנפוצים ביותר - בדיקות יחידות, שכן כל מפתחי Java שמכבדים את עצמם צריכים להיות מסוגלים להשתמש בהם ברמה בסיסית.
- חומר על כיסוי קוד ב- JavaRush וב- Habré ;
- תורת הבדיקות הבסיסית .
- אנחנו כותבים את המבחן שלנו.
- אנחנו מריצים את המבחן, בין אם הוא עבר ובין אם לא (אנחנו רואים שהכל אדום - אל תתחרפן: ככה זה צריך להיות).
- אנו מוסיפים את הקוד שאמור לעמוד בבדיקה זו (הפעל את הבדיקה).
- אנחנו מחדשים את הקוד.
- ציון הנתונים לבדיקה (מתקנים).
- שימוש בקוד הנבדק (קורא לשיטה הנבדקת).
- בדיקת התוצאות והשוואתן לאלו הצפויות.
assertEquals(Object expecteds, Object actuals)
- בודק אם האובייקטים המועברים שווים.assertTrue(boolean flag)
- בודק אם הערך שעבר מחזיר אמת.assertFalse(boolean flag)
- בודק אם הערך שעבר מחזיר false.assertNull(Object object)
– בודק אם האובייקט הוא null.assertSame(Object firstObject, Object secondObject)
- בודק אם הערכים שעברו מתייחסים לאותו אובייקט.assertThat(T t, Matcher<T> matcher)
- בודק אם t עומד בתנאי שצוין בהתאמה.
![הכל על בדיקת יחידות: שיטות, מושגים, תרגול - 4](https://cdn.javarush.com/images/article/a166ce03-22ed-4303-a7bf-9a52af158a7f/original.jpeg)
מושגי מפתח של בדיקת יחידות
כיסוי מבחן (Code Coverage) הוא אחת ההערכות העיקריות של איכות בדיקת היישום. זהו אחוז הקוד שכוסה בבדיקות (0-100%). בפועל, הרבה אנשים רודפים אחרי האחוז הזה, שאני לא מסכים איתו, מאחר שמתחילים להוסיף מבחנים איפה שאין בהם צורך. לדוגמה, לשירות שלנו יש פעולות CRUD (יצירת/קבל/עדכן/מחק) סטנדרטיות ללא היגיון נוסף. שיטות אלו הן מתווכים גרידא המאצילים עבודה לשכבה שעובדת עם המאגר. במצב זה, אין לנו מה לבדוק: אולי אם השיטה הזו קוראת לשיטה מהטאו, אבל זה לא רציני. כדי להעריך את כיסוי הבדיקה, משתמשים בדרך כלל בכלים נוספים: JaCoCo, Cobertura, Clover, Emma וכו'. למחקר מפורט יותר של סוגיה זו, שמור כמה מאמרים מתאימים:![הכל על בדיקת יחידות: שיטות, מושגים, תרגול - 6](https://cdn.javarush.com/images/article/ff9e2bc1-433f-4b8f-9db0-66836910aaf9/original.jpeg)
שלבי בדיקה
המבחן מורכב משלושה שלבים:![הכל על בדיקת יחידות: שיטות, מושגים, תרגול - 7](https://cdn.javarush.com/images/article/ed89764c-1c59-4397-8a3e-cd4dd8f6bf6f/original.jpeg)
סביבות בדיקה
אז עכשיו בואו ניגש לעניינים. קיימות מספר סביבות בדיקה (מסגרות) זמינות עבור Java. הפופולריים שבהם הם JUnit ו-TestNG. לסקירה שלנו, אנו משתמשים:![הכל על בדיקת יחידות: שיטות, מושגים, תרגול - 8](https://cdn.javarush.com/images/article/f742fdeb-9f27-441e-b37a-40f2455e5723/original.jpeg)
assertThat(firstObject).isEqualTo(secondObject)
כאן דיברתי על השיטות הבסיסיות, שכן השאר הן וריאציות שונות של האמור לעיל.
תרגול בדיקות
עכשיו בואו נסתכל על החומר לעיל באמצעות דוגמה ספציפית. נבדוק את השיטה לשירות - עדכון. לא נשקול את שכבת הדאו, מכיוון שהיא ברירת המחדל שלנו. בואו נוסיף התחלה למבחנים:<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.2.2.RELEASE</version>
<scope>test</scope>
</dependency>
אז, מחלקת השירות:
@Service
@RequiredArgsConstructor
public class RobotServiceImpl implements RobotService {
private final RobotDAO robotDAO;
@Override
public Robot update(Long id, Robot robot) {
Robot found = robotDAO.findById(id);
return robotDAO.update(Robot.builder()
.id(id)
.name(robot.getName() != null ? robot.getName() : found.getName())
.cpu(robot.getCpu() != null ? robot.getCpu() : found.getCpu())
.producer(robot.getProducer() != null ? robot.getProducer() : found.getProducer())
.build());
}
}
8 - משוך את האובייקט המעודכן ממסד הנתונים 9-14 - צור את האובייקט דרך ה-Builder, אם לאובייקט הנכנס יש שדה - הגדר אותו, אם לא - השאר את מה שיש במסד הנתונים ותראה את הבדיקה שלנו:
@RunWith(MockitoJUnitRunner.class)
public class RobotServiceImplTest {
@Mock
private RobotDAO robotDAO;
private RobotServiceImpl robotService;
private static Robot testRobot;
@BeforeClass
public static void prepareTestData() {
testRobot = Robot
.builder()
.id(123L)
.name("testRobotMolly")
.cpu("Intel Core i7-9700K")
.producer("China")
.build();
}
@Before
public void init() {
robotService = new RobotServiceImpl(robotDAO);
}
1 - הרץ 4 שלנו - לבודד את השירות משכבת ה-dao על ידי החלפת מדומה 11 - הגדר ישות בדיקה למחלקה (זו שבה נשתמש כאוגר בדיקה) 22 - הגדר אובייקט שירות אותו נבדוק
@Test
public void updateTest() {
when(robotDAO.findById(any(Long.class))).thenReturn(testRobot);
when(robotDAO.update(any(Robot.class))).then(returnsFirstArg());
Robot robotForUpdate = Robot
.builder()
.name("Vally")
.cpu("AMD Ryzen 7 2700X")
.build();
Robot resultRobot = robotService.update(123L, robotForUpdate);
assertNotNull(resultRobot);
assertSame(resultRobot.getId(),testRobot.getId());
assertThat(resultRobot.getName()).isEqualTo(robotForUpdate.getName());
assertTrue(resultRobot.getCpu().equals(robotForUpdate.getCpu()));
assertEquals(resultRobot.getProducer(),testRobot.getProducer());
}
כאן אנו רואים חלוקה ברורה של הבדיקה לשלושה חלקים: 3-9 - הגדרת מכשירי 11 - ביצוע החלק הנבדק 13-17 - בדיקת התוצאות פרטים נוספים: 3-4 - הגדרת ההתנהגות של moka dao 5 - הגדרת מופע שנעדכן על תקן 11 שלנו - השתמשו בשיטה וקחו את המופע המתקבל 13 - בדקו שהוא לא אפס 14 - בדקו את מזהה התוצאה ואת ארגומנטי המתודה שצוינו 15 - בדקו אם השם עודכן 16 - תראו בתוצאה של מעבד 17 - מכיוון שלא קבענו זאת בשדה מופע העדכון, זה אמור להישאר זהה, בוא נבדוק את זה. ![הכל על בדיקת יחידות: שיטות, מושגים, תרגול - 9](https://cdn.javarush.com/images/article/b8157308-05a2-47e7-a144-14f6b7552543/original.jpeg)
![הכל על בדיקת יחידות: שיטות, מושגים, תרגול - 10](https://cdn.javarush.com/images/article/18f17d92-890c-4390-adc9-1aa644e1c613/original.jpeg)
![הכל על בדיקת יחידות: שיטות, מושגים, תרגול - 11](https://cdn.javarush.com/images/article/78583b9a-e6c6-4a20-9aa1-cc118aa7dc34/original.jpeg)
GO TO FULL VERSION