LOGIN
התחברות או הרשמה
Avatar
להמשך הרשמה ידנית – לחץ על כפתור ההרשמה, להרשמה/כניסה מהירה בעזרת חשבון רשת חברתית – לחץ על הלוגו בכותרת

אפס סיסמה - שכחתי את שם המשתמש

שם משתמש
סיסמה
זכור אותי

he icon   en icon

בכדי להוסיף פוסט בבלוג יש להרשם או להתחבר - ההרשמה/כניסה מתבצעת מכותרת האתר.

תכונות הטסט: תחזוקה

נכתב על ידי 
שני, 18 אוגוסט 2014 14:42
דרגו כתבה זו
(2 הצבעות)

לאורך השנים שנאתי את המילה תחזוקתיות (maintainability) בקונטקסט של טסטים. טסטים הם ניתנים לתחזוקה כמו כל קוד אחר. זה מגיע בסוף לנקודה שנשבר לנו ואנחנו כותבים את הכל מחדש. אבל עד אז – אנחנו יכולים לשנות את הקוד.

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

אז מדוע אנחנו מדברים עדיין על טסטים "תחזוקתיים"?

אחת הבעיות היא שאנחנו לא מסתכלים על קוד של טסטים כקוד "אמיתי". הם לא חלק מ קוד production.

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

המחיר הוא הקשור לתחזוקה. זה הוא מחיר עתידי נוסף על עבודת משנה, שנחשבת פחות.

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

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

לתחזוקה יש אכן מחיר גבוה. אבל לא בגלל זה.

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

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

הנה דוגמא מאד פשוטה, מקוד שכבר ראינו בפוסט על תכונת המיקוד:

maintenance-code

מה יקרה אם נרצה לשנות בקוד הנבדק את השם PositiveCalculatorל Calculator?

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

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

מה קורה שבשפות עם שמן קומפילציה ארוך כמו C++ ? או שפות script שנותנות פידבק רק בזמן ריצה?

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

אז כיצד ניתן להנמיך את מחיר התחזוקה?

העצה הבדוקה היא "לא לצמד את הקוד לטסט".

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

  • בדקו תוצאות, לא אלגוריתמים. מכיוון שהטסטים כבר מצומדים ממילא, ככל שנדע פחות בתוך הטסטים על המימוש בקוד, תהיינה פחות בעיות. טסטים שבירים פחות כאשר הם לא נסמכים על קריאות בתוך הקוד. במקום זאת, נתייחס לקוד כאל קופסא שחורה, למרות שאנחנו יודעים איך הקוד עובד. בנוסף, טסטים אלה יהיו גם קריאים יותר.
  • עבודה מול ממשק חשוף. בדיקה צריכה להיעשות מבחוץ פנימה, ולא לבדוק פונקציות פנימיות. ננסה לשמור את שמות הפונקציות הפנימיות, והחתימות שלהן בתוך הקופסא השחורה. אם אתם מרגישים שאין ברירה, הפכו את הפונקציות הפנימיות לחיצוניות באובייקט אחר. עצם החשיפה יהפוך אותן לקלות לשינוי.
  • חסכו ב asserts. ספציפי מדי עבור קריטריון מעבר הטסט, במיוחד כשמדובר באימות של קריאת פונקציות על תלויות, יכול להביא לשבירת טסטים. האם אנחנו באמת צריכים לבדוק שפונקציה נקראה 5 פעמים, או שדי לבדוק קריאה אחת לפחות? האם כשהיא נקראה, מעניינים אותנו הערכים שנשלחו אליה, או שאנחנו יכולים להסתפק בתחום ערכים? ככל שהטסטים הופכים למדויקים יותר, אנחנו מוסיפים רמות של צימוד, וכתוצאה מזה הזדמנויות לשבירת טסטים ללא צורך. זכרו שבמקרה של שבירה, נרצה שהטסטים יתנו לנו כמה שיותר מידע לפתירת הבעיה. אך אם אנחנו לא מרוויחים את המידע הנוסף כתוצאה מה assert המדויק, אפשר להנמיך את קריטריון המעבר.
  • השתמשו בכלי refactoring טובים. וכלי פיתוח טוב. ועבדו בשפות שתומכות באלו. אם לא, הפידבק על שגיאות מתאחר, ומחיר התחזוקה עולה.
  • השתמשו פחות ב mocking. שימוש בכלי mocking הוא כמו שימוש בקרני רנטגן. הם טובים למטרתם, אבל חשיפת יתר היא רעה. Mocks יוצרים צימוד יתר בין הקוד לטסט. אנחנו שוב נסמכים על אלגוריתם פנימי, שיכול להשתנות, ואתו גם הטסט.
  • אל תשתמשו ב mocks ידניים – אלו הגרועים ביותר. מלבד המקרה שהם מאד פשוטים, הם מעודדים העתקה של הקוד לתוך הטסט. כלי mock מעודדים עבודה מול ממשק.

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

במקור הופיע בבלוג שלי.

בפעם הבאה: עקבות.

חובה להיות משתמש רשום במערכת בכדי להגיב - ההרשמה/כניסה בכותרת האתר

חדשות מעולם הבדיקות

  • Fifteen Free Tools to Help With Testing

    Fifteen Free Tools to Help With Testing There are a great many articles, blog posts, and presentations that discuss automation frameworks and strategies.  But even the most robust automation framework won't eliminate the need to do exploratory testing.  There will always be situations where we need to generate a large amount of text to test a text field or where we need to encode a string in HTML to test for cross-site scripting.  In this week's post, I share fifteen of my favorite free tools that make testing faster and easier.  Text Tools:1. Letter Count:  This tool will count the characters or words in a block of text.  I use it for creating strings with a specific character count when I test text fields.2. Lorem Ipsum Generator: I use this tool when I need to generate large amounts of text for text fields where a user will be able to enter several paragraphs of text.3. Convert Case: This tool comes in handy when I'm testing with Postman and my assertions are expecting the exact casing for string comparison.  Convert Case will set all the characters in a string to lower case, upper case, sentence case, alternating case, and more.JSON Tools:4. Pretty Print: JSON objects need indentation to be easily readable.  This tool will take care of all of the indentation and spacing for you.  This is especially helpful when you receive flattened JSON in a response and you want to be able to read through it.5. Online JSON Viewer: This tool will flatten your JSON for you by removing[…]

    15.12.2018 | 2:14 קרא עוד...
  • Hacking Password Reset Functionality

    Hacking Password Reset Functionality So I have recently returned from 3 months travelling around Colombia and Central America and I am ready to get back to work! One thing that stayed with me during my travels is the amount of time technology would generally appear in conversations from Bitcoin to GPS systems – this gave me further motivation to expand my career in this varied and extremely interesting field. I recently got an email from Pluralsight with an invitation to use the platform for their free weekend, so I thought it would be a good opportunity to take some security classes. Especially considering one of my 2019 goals is to complete the CEH qualification. The course I decided to do focused on web hacking password reset functionality. Please continue reading to learn more about the various ways password reset functionality is vulnerable to attacks. There are generally 3 different ways to reset user password on websites: Password reset links (by far the most common) Generating a new Password which is sent (in plaintext) to the users email Question and Answer style A typical password reset link could look like this: https://example.com/reset.php?token=12345ab6 or it could look like this, using two parameters -> user ID and token https://example.com/reset.php?userId=12345&token=12345ab6 The userId parameter is unnecessary in the second example, as each token should be unique to the user, making the userId parameter arbitrary. A vulnerability which can be easily fixed is that the link should only be valid for a certain amount of time (enough time for the[…]

    15.12.2018 | 1:20 קרא עוד...
  • I Represent the User! And We All Do

    As a tester, I try to represent the interests of users. Saying the user, in the singular, feels like a trap to me. There are usually lots of users, and they tend to have diverse and sometimes competing interests. I’d like to represent and highlight the interests of users that might have been forgotten or overlooked. There’s another trap, though. As Cem Kaner has pointed out, it’s worth remembering that practically everyone else on the team represents the interests of end users in some sense. “End users want this product in a timely way at a reasonable price, so let’s get things happening on schedule and on budget,” say the project managers. “End users like lots of features,” say the marketers. “End users want this specific feature right away,” say the sales people. “End users want this feature optimized like I’m making it now,” say the programmers. I’d be careful about claiming that I represent the end user—and especially insinuating that I’m the only one who does—when lots of other people can credibly make that claim. Meanwhile, I aspire to test and find problems that threaten the value of the product for anyone who matters. That includes anyone who might have an interest in the success of the product, like managers and developers, of course. It also includes anyone whose interests might have been forgotten or neglected. Technical support people, customer service representatives, and documentors spring to mind as examples. There are others. Can you think of them? People who[…]

    15.12.2018 | 11:33 קרא עוד...

טיפים

לרשימה המלאה >>