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

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

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

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

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

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

  • Five Blogs – 18 October 2018

    The (best) five blogs I read today. Check them out. What Is Data Democratization? A Super Simple Explanation And The Key Pros And Cons Written by: Bernard Marr What’s getting Agile down? Written by: Gary Watts Future of AI in Testing (Will You Be Replaced?) Written by: Joe Colantonio Jeff Hawkins Is Finally Ready to Explain His Brain Research Written by: Cade Metz Lower level Automation and testing? Be more precise! The Automation triangle revisited…again! Written by: Toyer Mamoojee Quote of the day: “When you’re young, being different is not cool. But when you’re older, it absolutely is.” -Lane Moore You can follow this page on Twitter

    17.10.2018 | 11:36 קרא עוד...
  • The Automated Regression Suite. Part 2 of 3. When to run the tests.

    Once you have your automated regression suite in place, you can create a scheduler to run them periodically, without any manual intervention. Mostly you will use Jenkins jobs (or some similar CI tool) to trigger them and have them running on an environment of your choice. Just because they are called “regression tests” it does not mean they are only meant to be run once before a release. They are in place to help validate your system, so you can run them as often as you want. But how often do you want to run them? That really depends on some factors like: how often are you releasing, how often are you committing, how many other services is your software dependent on, how often are those services also released, and so on. How often you are releasing determines the amount of new or changed code that needs to reach production. If you are releasing once a year, the amount of such code will be huge. If you release every two weeks you will have less such code, and in case a failure would occur in the software, it would be much easier to pinpoint the root of the problem (as compared to the one-year release cycle). If you are releasing rarely, with large amounts of time between releases, you really should run your tests at least once a week. From my experience, this test run frequency makes running these tests worth it, since you have a good amount of changed[…]

    17.10.2018 | 11:17 קרא עוד...
  • Let’s stop talking about testing, let’s start thinking about value

    Let’s stop talking about testing, let’s start thinking about value This year Alex Schladebeck and I did two keynotes titled “Let’s stop talking about testing, let’s start thinking about value” at QA Expo in Spain and TestNet in the Netherlands. This blogpost has the most important points we made in our talk. The keynote was inspired by some of our frustrations: “Testing is under appreciated” (Alex) and “Most testers are unable to explain what we do” (Huib). I wrote about my frustration back in 2016 already. This blogpost is about my frustration that most testers cannot come up with a decent definition of testing. And even worse: a big majority of the people who call themselves professional testers are not able to explain what testing is and how it works! They have trouble explaining what they are testing and why they are doing specifically the thing they are doing! How can anybody take a tester seriously who cannot explain what he is doing all day? Alex’s frustration is that testing is not valued by others. Developers are seen as the rockstars of the project because they create the software that adds value. But why are testers often not valued? Lowered expectations for testing expertise by stuff like ISO standards and ISTQB: I wrote about certification and standards before. ISTQB and standards put too much emphasis on process and documentation, rather than the real testing. By assuming there can be a standard, you say that there is one best way to organize and document your testing. But isn’t your test strategy[…]

    17.10.2018 | 5:05 קרא עוד...

טיפים

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