1 / 58

SCE - 20 עצמי דמה דר’ יעקב אקסמן תשס"ו

SCE - 20 עצמי דמה דר’ יעקב אקסמן תשס"ו. הנדסת מרכיבי תוכנה. דרישות תוכנה. דגם הייררכי. דגם פיזיקלי. מרכיבים. קוד להרצה = exe. מדידות. עצמי דמה ספרות. [Mackin-2000] Mackinnon, T., Freeman, S. & Craig, P. “Endo-Testing: Unit Testing with Mock Objects”

Download Presentation

SCE - 20 עצמי דמה דר’ יעקב אקסמן תשס"ו

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SCE-20 עצמי דמה דר’ יעקב אקסמן תשס"ו

  2. הנדסת מרכיבי תוכנה דרישות תוכנה דגם הייררכי דגם פיזיקלי מרכיבים קוד להרצה = exe מדידות

  3. עצמי דמה ספרות [Mackin-2000] Mackinnon, T., Freeman, S. & Craig, P. “Endo-Testing: Unit Testing with Mock Objects” Proc. XP2000 – “eXtreme Programming and Flexible Processes in Software Engineering”. – 2000. [Jalis-Kind-2001] Jalis, A. & Kind, L. “Automatically Generating System Mock Objects” HP – July 2001. [Seemann-2004] Seemann, M. “Mock Objects to the Rescue! Test your .NET Code with NMock” MSDN-Magazine – October 2004. msdn.microsoft.com/msdnmag/issues/04/10/NMock/

  4. עצמי דמה • עצמי דמה • למדידות ובדיקות • של מרכיבים בודדים

  5. עצמי דמה מינוח driver Unit Test בדיקת יחידה עצם נבדק עצם נבדק IMyInterface Stub Mock Object עצם דמה

  6. עצמי דמה עצמי דמה Mock Objects

  7. עצמי דמה סביבה יחידת בדיקה Test Unit העצם הנבדק סביבה

  8. עצמי דמה מניעים • מניעים • בדיקות ממצות של מרכיב בודד (Unit Testing) • לעיתים למרכיב יש יחסי גומלין עם סביבה • עצמי דמה– מאפשרים בדיקות ממצות • בלי סביבה מלאה.

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

  10. עצמי דמה הגדרה • הגדרה • עצמי דמה • עצמים שתגובותיהם כמו העצמים האמיתיים, אך אינם מכילים תוכן מלבד התגובות עצמן ואמצעי בדיקה.

  11. עצמי דמה אינטראקציה הפעלה עצם דמה העצם הנבדק תגובה תוצאת מדידה יחסי גומלין

  12. עצמי דמה הפעלה מקומית מקומיות Vהפעלה בודדת – עצם נבדק מפעיל כל פעם רק עצם דמה יחיד Xמורכבות יתר – אין לשרשר עצם דמה המפעיל עצם דמה אחר

  13. עצמי דמה מימוש • מימוש • ממשק מדויק מדמהאת העצמים האמיתיים • [למשל ע"י ירושה]. • פלט סינטטי של תוצאה ללא כל חישוב פנימי.

  14. עצמי דמה דוגמאות • ספריות ליצירת עצמי דמה • easymock - www.easymock.org • עבור JUnit ע"י מנגנון proxy בשפת JAVA • NMock – www.nmock.org • עבור .NET ספריה דינמית

  15. הדמייה עצמי דמה עצמי דמה ע"י ירושה

  16. עצמי דמה סביבה מערכת = סביבה יחידת בדיקה Test Unit העצם הנבדק צימוד ממשי

  17. עצמי דמה סביבה מנותקת real צימוד ממשי guard עצם מגן יחידת בדיקה Test Unit mock מערכת = סביבה העצם הנבדק עצם דמה

  18. עצמי דמה מימוש • מימוש ע"י ירושה • עצם ממשי –מנותק מן הסביבה, • אינו מופעל ישירות. • עצם מגן – יורש מעצם ממשי • מגן על עצם ממשי, מפני הפעלה. • עצם דמה – יורש מעצם מגן • תחליף לאינטראקציה ממשית.

  19. עצמי דמה דוגמה הסביבה: מערכת תקשורת בין שרת ללקוח • עצם ממשי =java.net.Socket • עצם מגן =GuardSocket • עצם דמה = MockSocket

  20. עצמי דמה מימוש "מגן" מגן עצם ממשי public classGuardSocket extends java.net.Socket { private static RuntimeException mFault = new RuntimeException("unimplemented method invoked"); public GuardSocket() { } public java.net.InetAddress getInetAddress( ) { throw mFault; } public int getPort() { throw mFault; } public void setTcpNoDelay(boolean arg1) throws java.net.SocketException { throw mFault; } public boolean getTcpNoDelay( ) throws java.net.SocketException { throw mFault; } public java.net.InetAddress getLocalAddress( ) { throw mFault; } public java.io.OutputStream getOutputStream() throws java.io.IOException { throw mFault; } public java.io.InputStream getInputStream( ) throws java.io.IOException { throw mFault; } … הגנה

  21. עצמי דמה guard • תיפקוד ה"מגן" • כל הפונקציות • שלא נדרסו בעצם ה"דמה" • מחזירות הודעת שגיאה.

  22. עצמי דמה מימוש "דמה" פלט סינטטי עצם דמה public voidtestServerAddsTwoNumbers() throws Exception { String request = "6 + 4"; String expected = "10"; // create socket input stream: LOAD REQUEST final ByteArrayInputStream fakeInputStream = new ByteArrayInputStream(request.getBytes( )); // create output stream where server will leave response final ByteArrayOutputStream fakeOutputStream = new ByteArrayOutputStream( ); // create mock socket as anonymous class by extending guard socket MockSocketsocket = newGuardSocket( ) { public InputStream getInputStream( ) {return fakeInputStream;} public OutputStream getOutputStream( ){return fakeOutputStream;} }; // create new server and SEND REQUEST to it through socket Server server = newServer( ); server.handleRequest(socket); // get server response left in output stream String result = fakeOutputStream.toString( ); // VERIFY that the result is as expected assertEquals(expected, result);} מגן

  23. עצמי דמה mock • תיפקוד ה“דמה" • השרת נבדק: • ע"י משלוח מסר • לשיטות הרגילות של השקע (socket). • תשובה מתקבלת: • בלי שאף מסר יגיע • לשקע ממשי.

  24. עצמי דמה סיכום • סיכום • הרכבת מערכת • ממרכיבים אמיתיים ועצמי דמה • מדידות בקוד להרצה

  25. עצמי דמה ספרייה ספריית עצמי דמה

  26. עצמי דמה mock • מבנה כללי של "דמה" • Setup = אתחול • יצירת דמה • והכנת מצב לפני בדיקה • Expectations = ציפיות • מה צפוי להתרחש ב"חישוב" • Execution = ביצוע • ביצוע של עצם הנבדק • וקבלת תוצאות • Verification = בדיקה • השוואת תוצאות לעומת ציפיות.

  27. עצמי דמה ספרייה ספרייה לעצמי דמה פונקציות אופייניות של ספרייה למימוש המבנה הכללי.

  28. עצמי דמה ספרייה • דוגמת ספרייה: NMock • עבור .NET • דינמית – יצירת עצמי דמה בזמן ריצה • משתמשת בשיקוף • נמצאת ב-NMock.dll

  29. עצמי דמה Nmock דוגמה • דוגמת יישום: סל רכישה באינטרנט • ממשק: • [העצם הדמה] • IShoppingDataAccess – גישה לשרת מסד הנתונים • מחלקות: • [העצם הנבדק] • Basket - סל רכישה • BasketItem- פריט לרכישה

  30. עצמי דמה Nmock דוגמה לוגיקת הרכישה העצם הנבדק IShoppingDataAccess גישה לנתונים עצם דמה מסד נתונים

  31. עצמי דמה Nmock דוגמה using System; namespace NMockExample.Shopping { public interface IShoppingDataAccess { string GetProductName(int productID); int GetUnitPrice(int productID); BasketItem[] LoadBasketItems(Guid basketID); void SaveBasketItems(Guid basketID, BasketItem[] basketItems); } }

  32. עצמי דמה Nmock דוגמה using System; using System.Collections; using System.Configuration; namespace NMockExample.Shopping { public class Basket { private ArrayList basketItems_; private Guid basketID_; private IShoppingDataAccess dataAccess_; public Basket(IShoppingDataAccess dataAccess) { Initialize(dataAccess); } public void AddItem(BasketItem item) { basketItems_.Add(item); } public void Save( ) { dataAccess_.SaveBasketItems(basketID_, (BasketItem[ ])basketItems_.ToArray (typeof(BasketItem))); } public decimal CalculateSubTotal( ) { decimal subTotal = 0; foreach (BasketItem item in basketItems_) { subTotal += item.GetPrice( ); } return subTotal; } private void Initialize(IShoppingDataAccess dataAccess) { dataAccess_ = dataAccess; basketItems_ = new ArrayList(); basketID_ = Guid.NewGuid(); } } } בונה = constructor

  33. עצמי דמה Nmock דוגמה using System; namespace NMockExample.Shopping { public class BasketItem { private decimal unitPrice_; private int productID_; private int quantity_; private IShoppingDataAccess dataAccess_; private string productName_; public BasketItem(int productID, int quantity, IShoppingDataAccess dataAccess) { Initialize(productID, quantity, dataAccess); } public decimal UnitPrice { get{ return unitPrice_; } } public int ProductID { get { return productID_; } set { productID_ = value; unitPrice_ = dataAccess_.GetUnitPrice(productID_); productName_ = dataAccess_.GetProductName(productID_); } } public int Quantity { get { return quantity_; } set { quantity_ = value; } } public string ProductName { get { return productName_; } } public decimal GetPrice() { return unitPrice_ * quantity_; } private void Initialize(int productID, int quantity, IShoppingDataAccess dataAccess) { dataAccess_ = dataAccess; ProductID = productID; Quantity = quantity; } } }

  34. עצמי דמה היפוך בקרה היפוך בקרה = Inversion of Control בונה (Constructor) מקבל "תלויות" בתור ארגומנט [כאן "גישה למסד נתונים".] משחרר המחלקה הנבדקת מפרטי מימוש התלויות.

  35. היפוך בקרה ספרות [Fowler-2004] Martin Fowler “Inversion of Control Containers and the Dependency Injection Pattern” www.martinfowler.com/articles/injection.html January 2004.

  36. עצמי דמה Nmock בונה בונה = constructor סוג עצם הדמה פונקציות בספריית NMock יצירת עצם דמה DynamicMockMockName = new DynamicMock(typeof (typeName));

  37. עצמי דמה Nmock דוגמה יצירת עצם דמה DynamicMockdataAccess = new DynamicMock(typeof (IShoppingDataAccess)); Basket b = new Basket( (IShoppingDataAccess) dataAccess.MockInstance); b.Save( ); גישה למופעשל DynamicMock Casting: MockInstance מפני ש- מחזיר System.Object

  38. עצמי דמה NmockSetup קביעת תוצאה void SetupResult(string methodName, object returnVal, params Type[ ] argTypes); סוגי ארגומנטים נחוצים לזיהוי שיטה במקרה של overloading פונקציות בספריית NMock ניתן להפעיל שיטה מספר פעמים ללא קביעת סדר תמיד יוחזר אותו ערך. מועיל לשיטות getter.

  39. עצמי דמה Nmock דוגמה קביעת תוצאה SetupResult( "GetUnitPrice", 99, typeof (int) );

  40. עצמי דמה Nmock ציפיות פונקציות בספריית NMock קביעת ציפיות (Expectations) void Expect(string methodName, params object[ ] args); ללא ערך מוחזר. void ExpectNoCall(string methodName, params Type[ ] argTypes); לא תהיה קריאה לשיטה הזו. void ExpectAndReturn(string methodName, object returnVal, params object[ ] args); void ExpectAndThrow(string methodName, Exception exceptionVal, params object[ ] args);

  41. עצמי דמה Nmock דוגמה יצירת ציפיות ExpectAndReturn("GetUnitPrice", 99, 1); זיהוי שיטה ע"פ פרמטרים במקרה של overloading אם ערך מוחזר שונה Nmock משליך VerifyException.

  42. עצמי דמה NmockStrict פונקציות בספריית NMock בהעדר ציפיות DynamicMockInstance.Strict = true; גם בהעדר ציפיות Nmock משליך VerifyException [שקול למנגנון ה-[GuardObject Strict = false; בהעדר ציפיות Nmock אדיש לערך מוחזר. [ברירת המחדל].

  43. עצמי דמה Nmock דוגמה בהעדר ציפיות dataAccess.Strict = true;

  44. עצמי דמה Nmock אילוצים פונקציות בספריית NMock אילוצים (Constraints) לצורך ציפיות

  45. עצמי דמה Nmock אילוצים אילוצים בסיסיים

  46. עצמי דמה Nmock אילוצים אילוצי קשרים

  47. עצמי דמה Nmock אילוצים אילוצי מחרוזות ((Strings

  48. עצמי דמה Nmock אילוצים אילוצים שונים

  49. עצמי דמה Nmock דוגמה לא הכרחי. ברירת מחדל של אילוצי ציפיות שימוש אילוצים dataAccess.Expect(“SaveBasketItems", newIsTypeOf(typeof(Guid)), new BasketItem[ ] {item1,item2}); dataAccess.ExpectAndReturn("GetUnitPrice", 47, newIsEqual(5));

  50. עצמי דמה Nmock בדיקה פונקציות בספריית NMock להכריח בדיקה voidVerify( ); מציין שכל הקריאות לשיטות בוצעו ניתן לבדוק נכונות מספר הקריאות.

More Related