זהו מדריך מקיף למדידת כיסוי בדיקות (test coverage) בתוכנה אמבדד באמצעות CTC++‎ Testwell של חברת Verifysoft Technology. שמי אייל גרבר, ואני מ-Novodes, שם אנו מתמחים בפתרונות פיתוח ובדיקות לתוכנה אמבדד. בפוסט זה נצלול לתהליך הבדיקה ומדידת הכיסוי של בדיקות תוכנת האמבדד שלכם בעזרת כלי עוצמתי בשם CTC++‎ Testwell, וכיצד לשלב אותו עם Keil uVision.

הבנת כיסוי הבדיקות

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

סוגי כיסוי

אחת התכונות הבולטות של CTC++‎ היא מגוון סוגי הכיסוי שהוא תומך בהם. בואו נסקור אותם בקצרה:

  • כיסוי Statement: בודק אם כל שורת קוד מורצת.
  • כיסוי Decision: מוודא שכל החלטה (אמת/שקר) בקוד מתרחשת.
  • כיסוי ריבוי-תנאים (Multi-Condition Coverage): צורה מורכבת יותר שמתחשבת במספר תנאים.

לצורך מדריך זה, נתמקד בכיסוי Statement ובכיסוי Decision.

תחילת העבודה עם CTC++‎ Testwell

כדי להתחיל, עליכם להתקין את הכלים הדרושים ולהגדיר את סביבת העבודה שלכם. הנה השלבים:

התקנה

  1. הורדה וחילוץ: הורידו את קבצי CTC++‎ הרלוונטיים וחלצו אותם במחשב שלכם.
  2. התקנת חבילות נוספות: אם אתם משתמשים ב-Keil uVision, תצטרכו גם להתקין קבצים נוספים. במקרה זה, מדובר ב-zip בשם keilctc-2.2.
  3. שילוב בפרויקט: תקבלו קבוצת קבצים שיש להוסיף לפרויקט שלכם. אלה כוללים קבצי C וקבצי header.

Novodes, figure 1

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

Novodes, figure 2

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

Novodes, figure 3

טיפול בספריות ובבטיחות תפקודית (Functional Safety)

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

הגדרת NO_STD_LIB

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

#define NO_STD_LIB

Novodes, figure 4

הגדרה זו מבטיחה ש-CTC++‎ Testwell יתאים את עצמו אוטומטית להיעדר ספריות סטנדרטיות, כמו malloc.

אינסטרומנטציה (Instrumentation): המפתח למדידת הכיסוי

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

הגדרת האינסטרומנטציה

  1. הרצת אינסטרומנטציה: לאחר בניית הפרויקט שלכם, תצטרכו לייצר קובץ batch ולהשתמש בו לאינסטרומנטציה. ניתן לייצר את קובץ ה-batch ב-Keil uVision על ידי מעבר לאפשרויות היעד (target options) —> Output —> סימון התיבה “Create Batch File” והרצה מחדש של הבנייה.

  2. הרצה משורת הפקודה: פתחו CMD בתיקיית הפרויקט שלכם והריצו את הפקודה הבאה:

    call keilctc -i d <batch_file>

Novodes, figure 5

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

Novodes, figure 6

העלאה ואיסוף נתונים סריאליים

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

איסוף נתונים סריאליים

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

  1. פתיחת טרמינל סריאלי: פתחו את הטרמינל הסריאלי שלכם והתחילו ללכוד את הנתונים הסריאליים שהמיקרו-בקר מדפיס.
  2. שמירת הפלט: העתיקו את נתוני הכיסוי הסריאליים ושמרו אותם לקובץ, בדרך כלל MON.txt.

Novodes, figure 7

ניתוח נתוני הכיסוי

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

ctc2dat -i MON.txt

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

סקירת דוח הכיסוי

לבסוף, השתמשו ב-ctcreport כדי לייצר דוח מפורט:

Novodes, figure 8

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

Novodes, figure 9

ניתן לעיין בכל קובץ שכוסה ולראות הן את כיסוי ה-Statement והן את כיסוי ה-Decision:

CTC VerifySoft Coverage Example

סיכום

CTC++‎ Testwell מוכיח את עצמו ככלי איתן, שהופך את תהליך מדידת כיסוי הבדיקות לפשוט ויעיל. אפילו אינטגרציות מורכבות, כמו התאמה לספריות std מוגבלות או התאמה אישית של שיטות איסוף הנתונים, נתמכות היטב.

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

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

בדיקות מהנות!