בדיקות יחידה II

‫הנדסת תוכנה‬
III ‫ בדיקות‬.9
Test Doubles (Mock Objects)
Pragmatic Programmer Tip :
Test Early. Test Often. Test Automatically.
Tests that run with every build are much more effective than test
plans that sit on a shelf.
se16b-yagel
1
‫מה היום?‬
‫• ראינו‪ :‬בדיקות ‪ >-‬בדיקות יחידה‪Test Driven ,‬‬
‫‪Development‬‬
‫• נושאים מתקדמים‬
‫– טיפול בתלויות‬
‫– כיסוי קוד‬
‫• הדגמה \ המשך שב ‪4‬‬
‫• הרצאה ‪\3‬תרגיל‪ :‬סקרי סבב )‪ +‬בדיקות?(‬
‫‪2‬‬
‫‪se16b-yagel‬‬
‫מקורות‬
• Meszaros, xUnit Test Patterns: Refactoring
Test Code, ’07
• Mock Roles, not Objects, ‘04
• Fowler, Mocks Aren't Stubs
• Osherove, "Interaction testing with mock
objects” The art of unit testing, ’09
• Unit Testing with Python, Pluralsight
Course, module 5+6
se16b-yagel
3
‫תזכורת‪ :‬בדיקת יחידה טובה‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪4‬‬
‫בדיקת יחידה היא קוד שקורא לקוד אחר ובודק‬
‫אח"כ נכונות של טענות מסוימות על ההתנהגות‬
‫הלוגית של מתודה או מחלקה‪.‬‬
‫בדיקת יחידה תכתב בד"כ באמצעות ‪framework‬‬
‫קצרה ומורצת בקלות‬
‫‪FIRST‬‬
‫‪se16b-yagel‬‬
TDD Cycle :‫תזכורת‬
se16b-yagel
5
‫איך בודקים כשיש תלות בגורמים‬
‫חצוניים?‬
‫• מחלקות אחרות (שעוד לא קיימות \ ‪)BDD‬‬
‫• גורמים חיצוניים (למשל ‪,File System‬‬
‫‪ :)Services , Database‬איטיים‪ ,‬לא עקביים‬
‫‪6‬‬
‫‪se16b-yagel‬‬
Test Isolation
http://martinfowler.com/bliki/UnitTest.html
se16b-yagel
7
‫הדגמה‬
...‫ תלות בבסיס נתונים של לקוחות‬:?‫• מפרויקט‬
• Tang, Unit Testing and TDD in Node.js –
Part 1, Part 2 (future), repo.
‫• המשך משימה אישית‬
... •
se16b-yagel
8
Test Doubles
se16b-yagel
9
Test Doubles
• By Gerard Meszaros (xunitpatterns.com,
G tech-talk)
‫ – שם כללי לאובייקטים שמחליפים‬Test Doubles •
‫ לצרכי בדיקה‬,‫אובייקטים אמיתיים‬
se16b-yagel
10
Test doubles
se16b-yagel
11
Stub – Car Example
Alarm ‫• בדיקה של‬
!‫• ללא חיישן אמיתי‬
se16b-yagel
12
Stub - Code
• https://gist.github.com/robiy/79169db54c5b24f42fc1
se16b-yagel
13
Stub
se16b-yagel
Examples from Pluralsight course TDD I
14
Fake
se16b-yagel
15
Spy
se16b-yagel
16
Dummy
se16b-yagel
17
‫‪( Mock Object‬אובייקט מדומה)‬
‫•‬
‫אוביקט הנוצר ע"י ספריה‪ ,‬ניתן לקנפג את האוביקט‬
‫להחזיר ערכים על פעולות‪ ,‬לוודא שפעולות מסוימות‬
‫נקראו ועוד‪.‬‬
‫בד"כ נרצה להשתמש בספריות‪ ,‬לדוגמא‪:‬‬
‫‪Java: mockito, jMock, EasyMock,‬‬
‫‪.Net: Nmock, moq, RhinoMock, Isolator,‬‬
‫‪Nsubstitute, FakeItEasy, NUnit ...‬‬
‫‪Python: unittest.mock‬‬
‫בד"כ יכולות לשמש ליצירת ‪ Test Doubles‬שונים‬
‫)עוד בתיכון מונחה עצמים(‬
‫‪18‬‬
‫‪se16b-yagel‬‬
‫•‬
‫•‬
‫•‬
‫מה אינה מטרה של ‪?mock objects‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪19‬‬
‫לבדוק אם האובייקט הנבדק מתקשר נכון עם‬
‫סביבתו‬
‫לאתחל ולהריץ את התלויות של אובייקט באופן‬
‫אוטומטי‬
‫להגיע לכיסוי קוד גבוה ע"י דימוי סביבת‬
‫האובייקט‬
‫לאפשר לבדוק גם כשתלויות עדיין חסרות‬
‫‪se16b-yagel‬‬
‫סיכום הסוגים‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪20‬‬
‫‪ – Stub‬מחזיר תשובה צרובה לכל שאילתא‪ ,‬ללא‬
‫לוגיקה‬
‫‪ – Fake‬מימוש אמתי אך פשוט יותר‬
‫‪ – Spy‬מאפשר לבדוק מה קרה במהלך הבדיקה‬
‫‪ – Mock‬כולל את הקודמים ומשמש לבדיקת‬
‫התנהגות‬
‫‪ – Dummy‬ערך שנדרש עבור קריאה לממשק‪ ,‬אך‬
‫לא משמש את הבדיקה‬
‫‪se16b-yagel‬‬
‫האם כדאי להשתמש?‬
‫• בעד‬
‫– מהירות ריצה‪ ,‬בידוד מתלויות‬
‫– מאפשר תיכון מתמשך (או כשחסרים חלקים)‬
‫• הפרדה וחלוקת אחריות‬
‫• נגד‬
‫–‬
‫–‬
‫–‬
‫–‬
‫‪21‬‬
‫סיבוכיות וקריאות‬
‫לא בודקים את הדבר האמיתי‬
‫מצריך נסיון בתיכון‬
‫בקוד קיים (‪ )legacy‬לא תמיד אפשרי (אבל יותר קל‬
‫בשפות דינמיות \ מנוהלות – ‪)monkeypatching‬‬
‫‪se16b-yagel‬‬
‫עוד מקורות‬
• Fowler, Mocks Aren’t Stubs
• Roy Osherove, Mocks and Stubs - The
difference is in the flow of information:
se16b-yagel
22
‫דוגמאות נוספות‬
• Osherove, TDD Kata 2 – Interactions
– Mocks and stubs
– git init - repo
– Kata cast (.net)
se16b-yagel
23
‫שאלות נוספות‬
‫• כמה לבדוק?‬
‫– עד שנגמר הזמן‬
‫– יחס בדיקות לקוד‬
‫• כמה הבדיקות טובות?‬
‫– שיטות פורמליות‬
‫– כיסוי קוד‬
‫• איזה סוגי בדיקות‬
‫‪• Detailed: Aditya Mathur, Foundations of‬‬
‫‪Software Testing‬‬
‫‪24‬‬
‫‪se16b-yagel‬‬
‫כיסוי קוד ע"י בדיקות‬
‫• מדד לכמות הבדיקות‬
‫– בהינתן בדיקות כמה מהקוד הן מכסות‬
‫– או‪ :‬בהינתן קוד\פונקציונליות כמה ממנו מכוסה ע"י בדיקות‬
‫• בדיקות קופסה לבנה \ מבנה‬
‫– קופסא שחורה‪ :‬האם התוכנה מצבעת את הפונקציונליות‬
‫שלה?‬
‫• מחלקות שקילות‬
‫– בדיקות שיש יותר סיכוי שיגלו תקלות‬
‫– חלוקה של תחום הקלט כך שבדיקה אחת בכל מחלקה‬
‫מייצגת את האחרות (דוגמא‪ :‬מחרוזת מייל)‬
‫‪25‬‬
‫‪se16b-yagel‬‬
‫כיסוי קוד ע"י בדיקות‬
‫• כמה בדיקות צריך לכתוב?‬
‫• ב‪ TDD-‬לא כותבים שורה חדשה בלי בדיקה‬
‫‪ 100%‬כיסוי (האם?)‬
‫‪‬אם יש ‪ 90%‬כיסוי‪ ,‬היכן מסתבר שרוב הבאגים?‬
‫‪26‬‬
‫‪se15b-yagel‬‬
Measuring Coverage—Basics
• S0: every method called
• S1: every method from
every call site
• C0: every statement
class MyClass
def foo(x,y,z)
if x
if (y && z) then bar(0) end
– Ruby SimpleCov gem
else
bar(1)
• C1: every branch in both
end
directions
end
• C1+decision coverage:
def bar(x) ; @w = x ; end
every subexpression in
end
conditional
• C2: every path (difficult,
and disagreement on
how valuable)
‫יתרונות וחסרונות‬
‫• מדד‬
‫• מציאת בדיקות חסרות \ קוד מיותר‬
‫• מצב קוד קיים (‪)Legacy Code‬‬
‫• האם צריך להיות יעד לכיסוי? (מגבלות מדדים)‬
‫• האם ‪ 100%‬כיסוי מספק?‬
‫‪28‬‬
‫‪se16b-yagel‬‬
‫איזה סוג בדיקות‬
• Test Automation Pyramid [Crispin]
‫• מהירות‬
Test -‫• שימוש ב‬
Doubles
‫• כיסוי גבוה‬
se16b-yagel
29
‫כלים לדוגמא‬
EclEmma : Eclipse –
4 ‫ – תרגיל‬codecov :‫– שרות‬
se16b-yagel
30
‫נושאים נוספים‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫‪31‬‬
‫מאפיינים שונים של ‪( xUnit‬אתחולים‪ ,‬חריגות‪)... ,‬‬
‫אינטגרציה\ממשק משתמש‬
‫פרמטרים‬
‫כיסוי‬
‫אוטומציה \ ‪Continuous Integration‬‬
‫בדיקות לקוד קיים (‪)Legacy Code‬‬
‫קוד מובייל \ ענן \ ווב (ר' דוגמא חלק ‪)2‬‬
‫כיצד להטמיע ‪ TDD‬בארגון?‬
‫‪Katas, pexforfun‬‬
‫עוד בקורס בדיקות תוכנה (אינטל)‬
‫‪se16b-yagel‬‬
‫בשבוע הבא‬
‫• תיכון מתמשך (מבוא לתיכון מונחה עצמים)‬
‫– נושאים נוספים‬
‫• פרויקט – סבב ‪2‬‬
‫– סקר בדיקות (שבוע לפני סוף הסבב)‬
‫‪32‬‬
‫‪se16b-yagel‬‬
‫סיכום‬
‫• בדיקות בהינתן תלויות‬
‫• בדיקת מצב מול התנהגות‬
‫– למתחילים מומלץ להסתפק בערכים מוחזרים ומצב‬
‫• כיסוי קוד‬
‫– קוד איכותי‬
‫• הקשר לתיכון‬
‫• לוקח זמן עד שמקבלים רווח‬
‫– תרגול ולימוד (<‪ )>-‬מתמשכים‪...Code retreats ,‬‬
‫‪– Google Code, 2012: Stop Mocking, Start Testing‬‬
‫”‪(video), “Mock objects tell you what you want to hear‬‬
‫• בדיקות ואנחנו‬
‫‪33‬‬
‫‪se16b-yagel‬‬