בדיקת מוטציה עם PITest

1. סקירה כללית

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

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

2. תלות Maven

כפי שניתן לראות בתצורת התלות של Maven, נשתמש ב- JUnit כדי להריץ את הבדיקות שלנו ואת ה- PITest ספרייה להציג מוטציות בקוד שלנו - אל דאגה, נראה שנייה מה זה מוטציה. אתה תמיד יכול לחפש את גרסת התלות האחרונה נגד המאגר המרכזי של maven על ידי קישור זה.

 org.pitest ההורה הכי גרוע 1.1.10 פום 

על מנת להפעיל את ספריית PITest, עלינו לכלול את ה- מעורר רחמים תוסף שלנו pom.xml קובץ תצורה:

 org.pitest pitest-maven 1.1.10 com.baeldung.testing.mutation. * com.baeldung.mutation.test. * 

3. הגדרת פרויקט

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

ציבורי בוליאני isPalindrome (String inputString) {if (inputString.length () == 0) {return true; } אחר {char firstChar = inputString.charAt (0); char lastChar = inputString.charAt (inputString.length () - 1); מחרוזת אמצע = inputString.substring (1, inputString.length () - 1); return (firstChar == lastChar) && isPalindrome (באמצע); }} 

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

@ מבחן ציבורי בטל כאשר Palindrom_thenAccept () {Palindrome palindromeTester = Palindrome new (); assertTrue (palindromeTester.isPalindrome ("צהריים")); } 

עד כאן הכל טוב, אנו מוכנים להריץ את מקרה הבדיקה שלנו בהצלחה כמבחן JUnit.

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

4. כיסוי קוד

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

אנו יכולים למדוד את כיסוי הקוד האפקטיבי על בסיס נתיבי ביצוע באמצעות כלים כמו אקלים זמין ב- Eclipse IDE.

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

למרבה הצער, מדדי כיסוי הקוד יכולים לפעמים להיות די לֹא יָעִיל, מכיוון שציון כיסוי קוד של 100% פירושו רק שכל הקווים הופעלו לפחות פעם אחת, אבל זה לא אומר דבר על בדיקות דיוק אוֹ שלמות מקרי שימושולכן בדיקת המוטציות למעשה חשובה.

5. כיסוי מוטציה

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

מבחנים טובים ייכשלו

כל שינוי בקוד נקרא a מוטציה, והתוצאה היא גרסה שונה של התוכנית, הנקראת a מוּטָצִיָה.

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

עכשיו בואו נבצע את הבדיקה באמצעות Maven, עם אפשרות היעד מוגדרת ל: org.pitest: pitest-maven: mutationCoverage.

אנו יכולים לבדוק את הדוחות בפורמט HTML ב יעד / pit-test / YYYYMMDDHHMI מַדרִיך:

  • כיסוי קו 100%: 7/7
  • כיסוי מוטציה של 63%: 5/8

ברור שהמבחן שלנו עובר על כל מסלולי הביצוע, ולכן ציון כיסוי הקו הוא 100%. מצד שני, ספריית PITest הציגה 8 מוטציות, 5 מהם נהרגו - גרם לכישלון - אך 3 שרדו.

אנחנו יכולים לבדוק את com.baeldung.testing.mutation / Palindrome.java.html דווח לקבלת פרטים נוספים על המוטציות שנוצרו:



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

  • INCREMENTS_MUTATOR
  • VOID_METHOD_CALL_MUTATOR
  • RETURN_VALS_MUTATOR
  • MATH_MUTATOR
  • NEGATE_CONDITIONALS_MUTATOR
  • INVERT_NEGS_MUTATOR
  • CONDITIONALS_BOUNDARY_MUTATOR

לפרטים נוספים על המוטציות של PITest, תוכלו לבדוק את הרשמי דף תיעוד קישור.

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

6. שפר את ציון המוטציה

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

בואו ניקח את המוטציה הראשונה - מותנה מבוטלת - על קו 6 כדוגמה. המוטציה שרדה כי גם אם נשנה את קטע הקוד:

אם (inputString.length () == 0) {return true; }

ל:

אם (inputString.length ()! = 0) {return true; }

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

@ מבחן ציבורי בטל כאשר NotPalindrom_thanReject () {Palindrome palindromeTester = Palindrome new (); assertFalse (palindromeTester.isPalindrome ("תיבה")); } @Test הציבור בטל כאשר NearPalindrom_thanReject () {Palindrome palindromeTester = Palindrome new (); assertFalse (palindromeTester.isPalindrome ("ניאון")); }

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

  • כיסוי קו 100%: 7/7
  • כיסוי מוטציה 100%: 8/8

7. תצורת בדיקות PITest

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

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

  com.baeldung.testing.mutation. * com.baeldung.mutation.test. * CONSTRUCTOR_CALLS VOID_METHOD_CALLS RETURN_VALS NON_VOID_METHOD_CALLS 

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

8. מסקנה

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

ראינו גם כיצד לנתח דוחות בסיסיים של PITest תוך שיפור ה- ציון כיסוי מוטציה.

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

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