C:
כתיבת בדיקות

איך לעשות:

אף על פי שב-C אין מסגרת טסטים מובנית כמו בחלק מהשפות האחרות, ניתן עדיין לכתוב טסטים יעילים באמצעות assert.h לטענות פשוטות או לאגד מסגרות של צד שלישי כמו CUnit או Unity לטסטים מובנים יותר. הנה דוגמה בסיסית בשימוש ב-assert.h לטסט פונקציה שמוסיפה שני מספרים שלמים:

#include <assert.h>
#include "my_math.h"

void test_addition() {
    assert(add(1, 2) == 3);
    assert(add(-1, -2) == -3);
    assert(add(0, 0) == 0);
    printf("All addition tests passed.\n");
}

int main() {
    test_addition();
    return 0;
}

ב-my_math.h, יכול להיות לך:

// פונקציה פשוטה לחיבור
int add(int a, int b) {
    return a + b;
}

הרצת פונקציית הטסט בפונקציית ה-main מפיקה את הפלט:

All addition tests passed.

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

טבילה עמוקה

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

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