זהו מדריך מקיף למדידת כיסוי בדיקות (test coverage) בתוכנה משובצת (embedded) באמצעות CTC++ Testwell של חברת Verifysoft Technology. שמי אייל גרבר, ואני מ-Novodes, שם אנו מתמחים בפתרונות פיתוח ובדיקות לתוכנה משובצת. בפוסט זה נצלול לתהליך הבדיקה ומדידת הכיסוי של בדיקות התוכנה המשובצת שלכם בעזרת כלי עוצמתי בשם CTC++ Testwell, וכיצד לשלב אותו עם Keil uVision.
הבנת כיסוי הבדיקות
לפני שנצלול לעומק התהליך, בואו נבהיר מהו כיסוי בדיקות ומדוע הוא חיוני. כיסוי בדיקות מודד כמה מהקוד שלכם מורץ בפועל על ידי הבדיקות שלכם. זה חיוני כדי להבטיח שהבדיקות שלכם מקיפות ואפקטיביות בתפיסת בעיות אפשריות מוקדם במחזור הפיתוח.
סוגי כיסוי
אחת התכונות הבולטות של CTC++ היא מגוון סוגי הכיסוי שהוא תומך בהם. בואו נסקור אותם בקצרה:
- כיסוי משפטים (Statement Coverage): בודק אם כל שורת קוד מורצת.
- כיסוי החלטות (Decision Coverage): מוודא שכל החלטה (אמת/שקר) בקוד מתרחשת.
- כיסוי ריבוי-תנאים (Multi-Condition Coverage): צורה מורכבת יותר שמתחשבת במספר תנאים.
לצורך מדריך זה, נתמקד בכיסוי משפטים ובכיסוי החלטות.
תחילת העבודה עם CTC++ Testwell
כדי להתחיל, עליכם להתקין את הכלים הדרושים ולהגדיר את סביבת העבודה שלכם. הנה השלבים:
התקנה
- הורדה וחילוץ: הורידו את קבצי CTC++ הרלוונטיים וחלצו אותם במחשב שלכם.
- התקנת חבילות נוספות: אם אתם משתמשים ב-Keil uVision, תצטרכו גם להתקין קבצים נוספים. במקרה זה, מדובר ב-zip בשם keilctc-2.2.
- שילוב בפרויקט: תקבלו קבוצת קבצים שיש להוסיף לפרויקט שלכם. אלה כוללים קבצי C וקבצי header.

הוסיפו את קבצי ה-C הללו לפרויקט שלכם וודאו שקבצי ה-header כלולים בנתיב ה-include של הפרויקט.

- שינוי פונקציית התבנית: הגדירו את
ctc_send_dataבהתאם ליכולות שלכם. לדוגמה, בדוגמה שלנו אנו משתמשים בפונקציית API מותאמת אישית בשםTraceC.

טיפול בספריות ובבטיחות תפקודית (Functional Safety)
אם אתם משתמשים במהדר (compiler) של בטיחות תפקודית עם ספריות std מוגבלות, אל דאגה. CTC++ Testwell מטפל בכך היטב על ידי כך שהוא מאפשר לכם להגדיר NO_STD_LIB בפרויקט שלכם.
הגדרת NO_STD_LIB
הוסיפו את ההגדרה בתחילת קבצי הפרויקט שלכם:
#define NO_STD_LIB

הגדרה זו מבטיחה ש-CTC++ Testwell יתאים את עצמו אוטומטית להיעדר ספריות סטנדרטיות, כמו malloc.
אינסטרומנטציה (Instrumentation): המפתח למדידת הכיסוי
אינסטרומנטציה היא תהליך הוספת קוד כיסוי לתוך הקוד שלכם, שמאפשר לעקוב אחר אילו חלקים בקוד מורצים בזמן ריצה.
הגדרת האינסטרומנטציה
-
הרצת אינסטרומנטציה: לאחר בניית הפרויקט שלכם, תצטרכו לייצר קובץ batch ולהשתמש בו לאינסטרומנטציה. ניתן לייצר את קובץ ה-batch ב-Keil uVision על ידי מעבר לאפשרויות היעד (target options) —> Output —> סימון התיבה “Create Batch File” והרצה מחדש של הבנייה.
-
הרצה משורת הפקודה: פתחו CMD בתיקיית הפרויקט שלכם והריצו את הפקודה הבאה:
call keilctc -i d <batch_file>

- החרגת קבצים לא רצויים: השתמשו ב-
exclude patternכדי להחריג קבצים של צד שלישי או קבצים מיותרים מהאינסטרומנטציה, כך שתמדדו כיסוי רק בקבצים הרצויים לכם. זה גם יזרז את תהליך האינסטרומנטציה. הדבר נעשה בקובץ ctc-keil.ini.

העלאה ואיסוף נתונים סריאליים
לאחר שהקוד עבר אינסטרומנטציה, העלו את קובץ ה-hex המתקבל אל המיקרו-בקר היעד באמצעות הצורב (programmer) שלכם.
איסוף נתונים סריאליים
ודאו שהמיקרו-בקר שלכם שולח רק נתוני כיסוי כדי למנוע רעש:
- פתיחת טרמינל סריאלי: פתחו את הטרמינל הסריאלי שלכם והתחילו ללכוד את הנתונים הסריאליים שהמיקרו-בקר מדפיס.
- שמירת הפלט: העתיקו את נתוני הכיסוי הסריאליים ושמרו אותם לקובץ, בדרך כלל
MON.txt.

ניתוח נתוני הכיסוי
לאחר שמירת הנתונים שנלכדו, הריצו את הפקודה הבאה לעיבודם:
ctc2dat -i MON.txt
פקודה זו מקשרת את הנתונים הסריאליים עם נתוני האינסטרומנטציה, ויוצרת דוח כיסוי.
סקירת דוח הכיסוי
לבסוף, השתמשו ב-ctcreport כדי לייצר דוח מפורט:

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

ניתן לעיין בכל קובץ שכוסה ולראות הן את כיסוי המשפטים והן את כיסוי ההחלטות:

סיכום
CTC++ Testwell מוכיח את עצמו ככלי איתן, שהופך את תהליך מדידת כיסוי הבדיקות לפשוט ויעיל. אפילו אינטגרציות מורכבות, כמו התאמה לספריות std מוגבלות או התאמה אישית של שיטות איסוף הנתונים, נתמכות היטב.
אם אתם מחפשים גם מסגרות בדיקות יחידה (unit test) מסחריות עוצמתיות ומסגרות mocking, ייתכן שתשקלו אפשרויות כמו כלי בדיקות היחידה של Parasoft, C/C++Test, או Cantata של QA Systems. עם זאת, CTC++ Testwell נותר בחירה מצוינת לאינטגרציה ותמיכה נטולות-טרחה בכל הנוגע לכלי כיסוי בלבד.
זכרו, כיסוי בדיקות מפורט אינו רק תיבת סימון בתהליך הפיתוח שלכם; זהו חלק מכריע בהבטחה שהקוד שלכם אמין ונקי מבאגים. לכן, השקיעו את הזמן לשלב את הכלים הללו כראוי ותיהנו מתהליך פיתוח תוכנה איתן יותר.
בדיקות מהנות!