בדיקות יחידה

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

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

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

### חסרונות

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

## גישות שונות של בדיקות יחידה
קיימות מספר גישות לביצוע של בדיקות יחידה.

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

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

## בדיקות יחידה בתחום התוכנה

בדיקות יחידה לתוכנה היו בשימוש מאז ימיו הראשונים של התכנות הפרוצדורלי. המתכנת היה כותב לעיתים תוכנית בדיקה שאינה חלק מהיישום על מנת לבדוק נכונות של פרוצדורה. השיטה הייתה ישימה גם בתכנות מודולרי ובכל פרדיגמת תכנות נפוצה מאז, אך חסרונה המרכזי היה נעוץ בקושי לערוך סדרת בדיקות מקיפה המורצת באופן אוטומטי. החל מהעשור הראשון של המאה ה-21 גבר השימוש בחבילות עזר לבדיקות יחידה (Unit testing frameworks), שאפשרו יצירת תבנית אחידה לכל בדיקת יחידה. ספריות עזר נוספות אפשרו את הגברת הבידוד של כל בדיקה והרצתה בהקשר עצמאי לחלוטין, ללא תלות ביחידות אחרות או בתלויות חיצוניות אחרות דוגמת בסיס נתונים.

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

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

## ראו גם
*Typemock
* JUnit
* NUnit
* xUnit
* הבטחת איכות תוכנה
* בדיקות תוכנה
* בדיקות נסיגה
* בדיקות קבלה
* בדיקות אינטגרציה
* מיכון בדיקות יחידה

קטגוריה:בדיקות תוכנה
קטגוריה:בדיקות במחקר ופיתוח