JavaRush /בלוג Java /Random-HE /הפסקת קפה מס' 87. מדוע בדיקת יחידות חשובה למפתחים? 5 דרכי...

הפסקת קפה מס' 87. מדוע בדיקת יחידות חשובה למפתחים? 5 דרכים להעתיק מערך ב-Java

פורסם בקבוצה

מדוע בדיקת יחידות חשובה למפתחים?

מקור: SearchSoftwareQuality בואו נדון מדוע בדיקת יחידות חשובה ובעלת ערך, וכיצד היא מקלה על ניפוי באגים. בדיקת יחידות היא כלי רב עוצמה לשיפור איכות התוכנה. בדיקות יחידה מספקות אימות בסיסי לכך שאפליקציה תואמת את מפרטי התוכנה ומתנהגת כמתוכנן. הפסקת קפה מס' 87.  מדוע בדיקת יחידות חשובה למפתחים?  5 דרכים להעתיק מערך ב-Java - 1כאשר נעשה היטב, בדיקות יחידה:
  • להפחית את מספר הפגמים ולזהות אותם בשלבים מוקדמים של מחזור חיי הפיתוח;
  • לשפר את קריאת הקוד;
  • לאפשר שימוש חוזר בקוד;
  • להגביר את מהירות הפריסה.
הבה נבחן מדוע חשובה בדיקת יחידות, כיצד נוצרו סוג זה של בדיקות ומהם החסמים ליישום שלה.

היסטוריה של בדיקות יחידות

שגיאה שזוהתה בשלב מוקדם חוסכת זמן ומאמץ. במשך 50 השנים הראשונות של היסטוריית המחשב, בדיקות יחידות וניפוי באגים היו בעצם אותו הדבר. אבל בשנות ה-90, הקוד הפך להיות כל כך מורכב שלעתים קרובות היה בלתי אפשרי לפצל את המערכת לחלקים קטנים כדי להפעיל אותם בבידוד. בשנת 1997, מתכנת בשם קנט בק יצר את JUnit, תוסף סביבת פיתוח לבדיקת פיסות קוד קטנות. קוד הבדיקה שמעריך את קוד המקור נקרא unit tests. סוג זה של בדיקת יחידות הפך למרכיב עיקרי במשך שנים רבות. לאחר שבק יצר את JUnit, מרטין פאולר כתב ספר, Refactoring, שבו הציע דרכים לשנות קוד כדי להפוך אותו למבודד יותר ובר-בדיקה. השילוב של עיבוד מחדש של קוד ובדיקת יחידות הוביל לפיתוח מונע מבחן, שבו יצירת בדיקות יחידה חיונית לתהליך התכנות. בו, הקוד חייב להיות ניתן לבדיקה עוד לפני יצירתו. לפיכך, תהליך התכנות אינו הושלם עד להרצת בדיקות היחידה. לאחר מכן הפרויקט יכול לעבור לשלב המחקר ברמה המערכתית או האנושית.

דוגמה לבדיקת יחידה

דוגמה זו מדגימה את החשיבות של בדיקת יחידות. כאן JUnit מעריך פונקציה פשוטה הממירה טמפרטורה מפרנהייט לצלזיוס. נוסחת המרה: C = (F-32) * 5/9. ניתן ליישם רק כמה שורות, כולל חתימת הפונקציה וסוגריים מסולסלים, בקוד כפונקציית ספרייה. עם זאת, מהפונקציה לא ברור שמדובר בקריטריונים. אפשרויות אלה עשויות לכלול עיגול כלפי מעלה או למטה, מספרים אמיתיים, או גבולות עליונים ותחתונים. בואו ניצור בדיקות יחידה לדוגמה עבור פונקציית המרת הטמפרטורה הזו ב- Perl באמצעות המודול Test::More. השורה הראשונה היא הערה שאומרת למתכנת למה לצפות מהקוד שנותר.
# is (input, expected result, comment)
is( FtoC(32),0,'Freezing point is F32, C 0');
is( FtoC(212),100,'Boiling point is F212, C 100');
is( FtoC(59038),32767, 'Upper limit of C is 32767');
is( FtoC(59039),undefined, 'One past upper limit is error');
המסגרת של JUnit מסתמכת על מערכות מונחה עצמים ואובייקטי בדיקה, אך הרעיון דומה.

בדיקות יחידה מבודדות

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

התאמת בדיקות יחידה

תוכנה מדור קודם היא תוכנה שפועלת כבר זמן רב וככל הנראה נכתבה ללא בדיקות יחידה. לקוד מדור קודם יש ערך עבור החברה. זה עובד ביציבות במשך שנים רבות. חלק מהתוכניות שנבנו ללא בדיקות יחידה מעבדות עסקאות של מיליון דולר ביום. אבל קוד שאין בו בדיקות יחידה הופך עם הזמן לכדור עפר גדול, מכיוון שהרבה מתכנתי תחזוקת קוד נגעו בו לאורך השנים. Refactoring מאפשר למתכנתים לבצע בהדרגה שינויים במערכת כדי להפוך אותה לניתנת לבדיקה. עם זאת, שינויים אלה לוקחים זמן. לפני מספר שנים, דנתי עם עמיתי בוב רסלמן בסוגיית השימוש בבדיקות יחידה עבור יישומים מדור קודם. רסלמן טען שהטמעת בדיקת יחידות באפליקציות שנבנו בלעדיה היא יקרה מדי ואפילו טיפשית. במקום זאת, הוא המליץ ​​לארגון להתחיל בפיתוח חדש עם בדיקות יחידה ולהשאיר יישומים מדור קודם. זה אולי נכון לגבי COBOL, מחוללי דוחות ויישומים אחרים, אבל הייתי טוען שבאפליקציות הכתובות בשפות מודרניות - C++, C#, Java ו-Ruby - די קל להוסיף רטרואקטיבית בדיקות יחידה. במקום לכתוב אותם עבור האפליקציה כולה, פשוט הוסף בדיקות יחידה לשינוי הנוכחי ותפקוד מחדש תוך כדי.

מהירות, איכות ויכולת בדיקה מוגברת

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

5 דרכים להעתיק מערך ב-Java

מקור: Dev.to אז יש לך שני מערכים A ו-B ואתה צריך להעתיק את האלמנטים מ-A ל-B. ובכן, יש דרכים שונות לעשות את זה ב-Java ואני אראה לך אותם עכשיו.

שיטה ראשונה: ForLoop

זה המקום שבו הישן והטוב ללולאה בא לעזרתנו :
int[] A = {1,2,4,4};
int[] B = new int[];

 for (int i = 0; i < A.length; i++){
      B[i] = A[i];
}

שיטה שנייה: .clone()

שיטת שיבוט המערך יכולה גם לסייע בהשגת התוצאה הרצויה:
int[] A = {1,2,4,4};
int[] B = A.clone();//the clone method copies the content of A into B;

שיטה שלישית: System.arraycopy()

הדרך הבאה היא להשתמש בשיטת System.arraycopy() , שנמצאת בחבילת java.lang . לפני שנעבור לשימוש בו, הבה נדון בחתימתו:
public static void arraycopy(
    Object src, //:source array, in this case A
    int srcPos, //:the start index for copy, typically 0
    Object dest, //:destination object in this case B.
    int destPos, //:the index to place the copied elements
    int length //:the length of the contents to be copied
);
יישום:
int[] A = {1,2,4,4};
int[] B = new int[];

System.arraycopy(A, 0, B, 0, A.length);

שיטה רביעית: Arrays.copyOf()

אפשרות ההעתקה הבאה עליה נדון היא המחלקה Arrays מחבילת java.utils . שימו לב לחתימה שלו:
public static int[] copyOf(
    int[] original, // :source array in this case A
    int newLength // :the length of the contents to be copied
);
יישום:
int[] A = {1,2,4,4};
int[] B = Arrays.copyOf(A, 3);

שיטה חמישית: Arrays.copyOfRange()

אז זו תהיה האפשרות האחרונה שנבחן בפוסט הזה. זה גם ממחלקת Arrays שנמצאת בחבילת java.utils . בואו נסתכל שוב על החתימה שלו:
public static int[] copyOfRange​(
    int[] original, // :source array in this case A
    int from,  //:the start index for copy, typically 0
    int to // the end index exclusive
);
יישום:
int[] A = {1,2,3,4,5,6,7};
int[] B = Arrays.copyOfRange(A, 0, A.length);
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION