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 מעודדים עבודה מול ממשק.

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

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

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

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

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

  • Humidifier For Home Heater

    Humidifier For Home Heater humidifier for home heater humidifier for sq ft. . . . . . . . . . . . . . .

    25.05.2019 | 11:08 קרא עוד...
  • ATA Meetup #22 - Bangalore - Amazing experience

    ATA Meetup #22 - Bangalore - Amazing experience Reached super earlyThe session was supposed to start at 9 AM and I reached by 7.45 AM. I did not want to be late. Due to weekend's minimalistic traffic and super driver, I surprised myself and I thought I can just enter and wait in the hall. The security asked me the contact person name and I told him that there is a meetup by Agile Testing Alliance - did not help. I called up Aditya Garg and somehow the security got convinced that I can at least pass the main barricade and sit on the makeshift park seats.It was nice to experience fresh air, have fruits and dive into an interesting book called "The Practicing Mind" by Thomas M. Sterner. The Practicing Mind I remembered the discussions with Shrini Kulkarni about consciousness, mind, awareness as I read the book. Around 8.40 AM, Thrivikram and Venkata P from HCL welcomed and escorted me to the induction hall where we had the meetup. The conversation between them and the security folks was an interesting one making me think of the process adherence vs value addition. Learning for me: Know the contact person in advance and keep them informed about surprises in plan. HCL ServicesThe first session was by HCL management represented by Prashantha M who highlighted the various services offered by HCL, the case studies and the learning. There were few really good questions by the audience who wanted to know more details about the insights shared to them.My tip: Knowing[…]

    25.05.2019 | 11:55 קרא עוד...
  • Performance testing (benchmarking) Java code with JMH

    Performance testing (benchmarking) Java code with JMH Contents:1) Introduction2) Is it easy?3) Common pitfalls4) Setup5) How to configure JMH?6) Configuration options7) Configuration - predefining state8) Demo9) Results10) Further reading1. IntroductionAs test engineers when we approach performance testing we usually only think about final end-to-end application verification with tools such as JMeter, Locust or Gatling. We know that such tests should run on a separate environment with conditions resembling production as close as possible. Unfortunately in some cases (especially with monolithic architecture) dedicated performance testing environment is hard to get. What to do in such cases? Should we test on common test environment? Or should we test on production? Or maybe we should change our approach to performance testing?  Each option has advantages and disadvantages.Today I'd like to describe low-level performance testing (often called benchmarking) of Java code. It does not require a separate environment. It can be executed directly from your IDE (although that's not recommended) or from the command line. Measuring the performance of critical pieces of code is essential for everyone who creates applications, frameworks, and tools. Testers are co-creators so it's also our responsibility. 2) Is it easy?Benchmarking correctly is hard. There are multiple optimizations implemented on the JVM/OS/hardware side which make it challenging. In order to measure right, you need to understand how to avoid those optimizations because they may not happen in the real production system. Thankfully, there is a tool which helps you mitigate those issues called JMH (Java Microbenchmark Harness). It was created for building, running, and analyzing nano/micro/milli/macro benchmarks written in Java[…]

    25.05.2019 | 8:10 קרא עוד...

טיפים

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