הנדסת תוכנה 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
© Copyright 2024