Sunday, July 23, 2017

זה לא צריך לעבוד

This shouldn't work

Over a month ago, the closing keynote of NordicTestingDays was given by Kristjan Korjus from Starship Technologies and he told us about their product - a small(ish) delivery robot meant to help with "last mile delivery". The general idea is ingenious - creating a self-driving, fully autonomic delivery bot is an extremely difficult task, but creating a mostly automated delivery bot with some human support when needed is a bit more feasible (still not easy, though).
Well, What happens when one brings such revolutionary idea to a testing conference? Naturally, you get a whole lot of questions challenging the validity of the idea. In fact, most people I've spoken with directly after the keynote did not seem to be convinced that it was a good idea at all.
However, while participating in the European Testing Conference I got to listen to Liz Keogh who, during an amazing Cynefin talk, mentioned that people tend to react to new ideas with four words: "That won't work because...". She also mentioned the value of this reaction in a complicated space and that this is one of the things testers are very well practiced on.
So, back to the the subject - A room full of testers, a new idea. Question after question that can be phrased as a "that won't work because..." statement (with one exception of "how can I become a robot-walker?").
What I liked in Liz's view about "that won't work because" is that it is a valuable to say when creating something since it allows people to consider possible setbacks and prepare for them - to lower the risk of probing (Which is, as far as I understood, Cynefin word for "quick experiment"). That this statement is balanced by the dreamers (traditionally, the dreamers are either in the developer or product manager roles, testers are most of the time hired as professional skeptics) that focus more on "imagine how great it would be if it did work", which is why new ideas are tried out and thus have a chance to succeed (you can't succeed in something you didn't do). Since the experience of TWWB was so strong for me in the room, I want to try an exercise in taking the other view and trying my imagination on the success of the delivery-bots presented at the conference.

So, what are the benefits of having a robotic delivery?
  • First is the obvious cost reduction factor, where a robot, over time, costs less money than paying a human, so everything will have the potential of being cheaper as lower costs are embodied in the final price of a product.  
  • Second, the risk of violence against the delivery person will be mostly gone (and violence against the robots isn't a major concern since they can call the police, and each one has 9 cameras that will record perpetrators).
  • Third, a robot could deliver ice-cream without any de-frosting concerns (why wouldn't a robot be also a miniature freezer, or have heating capabilities to keep the pizza warm?)  
  • Next, it will save people the need to interact with a complete stranger just so that they can have some food, or get a package. This will be great for people with social anxiety, but also imagine picking up your pizza delivery without bothering to get dressed - some people will find this appealing. 
  • Taking it a step forward - how will it interact with the world? Currently the robot had not yet mastered stairs, will we see smart buildings opening their elevators for it? Will we see hatches in doors for more than just cats? 
  • What about sending a package to a friend? I can totally imagine a business that will enable people to send small packages to friends - a small gift you made for your friend and want to surprise them with? The lunchbox your child forgot at home? The book you need to return to the library? Now you can get them to them without having to carry it all by yourself out in the rain. 
  • Following your delivery today has probably some legal issues  - is it ok to track a person while they work, especially when they are not working for me? Tracking robots and wouldn't pose the same privacy issue. I could probably track the bot from my phone with no problem. 
  • Oh, and finally, I just can't wait to see how well will the robots function with a 4 year old toddler sitting on top of it (after all, Roombas feature as cat-rides).

I could probably go on and try to create a very bright picture of how this world would look like - but I found out something interesting - as I was compiling this list of cool things, my tester habits took on a different angle, and accepting the delivery bots success as a given, I started imagining all sorts of difficulties such a success might present, it's not exactly TWWB, but rather "this idea might be less than great" -
  • The current robots drive on the pavement, alongside pedestrians, do we want a lot of those boxes rushing along between our legs? How long will it be until separate lanes would be required? 
  • Will there be a new service of "set your robot right after it has fallen (or pushed) on it's side?
  • Who is to blame if a robot gets to a bicycle lane (which, in some places, might be also where pedestrians should walk) and a cyclist falls and gets seriously injured? what about an old pedestrian who fell because of such robot and broke a hip? 
  • Will branded delivery bots be the target of vandals angry at your company? Will we see accusations of attacking the delivery system of the competing business? 
  • With 9 cameras and a human "emergency" operator, will we see a phenomenon of the operators spying on their ex-partners? How common will be instances of accidental spying? And how large will be the operators screenshot collection of people in embarrassing situations?
  • Speaking of spying, will the police have access to the footage if the bot witnessed a crime? Alexa was already a target of such request.
  • Will a fleet of such robots create a significant load on the phone\internet operators? 
  • Such bots are remotely operated - once hacked (and currently, it looks like every other piece of IoT, so it will probably be easy to hack) could it be derailed to the road and used to create Traffic jams and accidents? 
  • Will we see "suicide bots"? Just imagine one bot carrying a bomb in the middle of a crowded street. 
Am I saying that the current suggestion of a robot last mile delivery is a bad idea? Not necessarily (ok, I am saying that a bit, but please recall that the same was said about the telephones, cars and personal computers, and I personally don't get how twitter is a thing, so I wouldn't take my word on what has or hasn't a chance) - I have no idea  which of the possible outcomes will actually come to be (tying back to Liz's Cynefin talk, this is an extremely complex space). What I am saying is that as testers, the tendency to see fail points is useful - but during this exercise I found that seeing blockers in our way isn't all that there is to it. If we are to reduce risk by thinking of the bad stuff that might (or might not) happen, there's also some value to guessing what might happen when we succeed. And it doesn't have to be just around innovative ground shaking ideas, thinking back a few years, we had a feature we thought is great, but a week after it was released more than half of our customers called in furious and demanded that we remove it, this is also a possible outcome. Don't let such thoughts stop you from developing  new stuff, but make sure that you prepare for some of the outcomes you can guess.



-------------------------------------------
הרצאת הסיום של NordicTestingDays ניתנה על ידי קריסטיאן קוריוס מStarship Technologies, והוא סיפר לנו על המוצר שלהם - רובוט לא מאוד גדול שמטרתו להקל על המשימה של שילוח בק"מ האחרון (אין לי מושג ירוק איך לתרגם את last mile shipping, אבל שיהיה). הרעיון הבסיסי הוא די מבריק -  בנייה של רובוט אוטונומי לגמרי שידע להתמודד עם האתגר המורכב הזה היא משימה קשה להחריד. אבל בנייה של רובוט שידע להתמודד עם המקרים הקלים ואת השאר ישאיר למפעיל אנושי - ובכן, זה כבר קצת יותר בר ביצוע (גם אם לא פשוט בכלל). 
אז מה קורה כשמגיעים עם רעיון חדש ומהפכני לכנס בדיקות? מקבלים מבול של שאלות שמצביעות על פערים, בעיות ותוהות האם הרעיון הזה בכלל לגיטימי. למעשה, מעט האנשים שדיברתי איתם אחרי ההרצאה לא נשמעו משוכנעים בכך שזה רעיון טוב. בכל מקרה, זה התחבר לי להרצאה אחרת ששמעתי בEuropean Testing Conference, שם Liz Keogh דיברה על קנבין (מאייתים את זה Cynefin, וזו עוד אחת מהמילים שנכתבות בצורה אחת ונקראות בצורה אחרת לגמרי). ליז הזכירה את הנטייה של אנשים להגיב מהר מאוד ב"זה לא יעבוד כי...", וציינה שבודקי תוכנה מתורגלים מאוד בגישה הזו.
בכל מקרה, בחזרה לנושא המקורי - רעיון חדשני, חדר מלא בבודקי תוכנה, זמן השאלות. כצפוי - מבול של שאלות שאת רובן אפשר היה לנסח כהצהרת "זה לא יעבוד כי..." (עם חריגה אחת בולטת של "איך אפשר להתקבל לתפקיד של מלווי רובוטים).
מה שמצא חן בעיני במיוחד באמירה של ליז על זלי"כ ("זה לא יעבוד כי", ארוך לי לכתוב את זה) זו הגישה לפיה לאמירה הזו יש מקום של כבוד במרחב המורכב (complex) בו צריך לגשש כדי לנסות לראות אם דברים פועלים, כי זו דרך לצמצם את מידת הסיכון אליה נחשפים. האמירה הזו מאוזנת על ידי החולמים (באופן מסורתי, אלו יהיו מנהלי המוצר או מפתחי התוכנה, לבודקים משלמים עבור סקפטיות מקצועית), שמתעלמים כמעט לגמרי מהמכשולים ועסוקים בעיקר בלדמיין "כמה מגניב זה יהיה כשזה יצליח". כיוון שאווירת זלי"כ בחדר הייתה מאוד משמעותית, אני רוצה לתרגל דווקא את הלך המחשבה השני ולנסות לחשוב אילו השפעות חיוביות יהיו לרובו-שליחים.

  •  בראש ובראשונה, הצלחה של המוצר נמדדת בהוזלת עלויות השילוח. זה נותן לחברות השונות שולי רווח גבוהים יותר, שמתבטאים ביכולת להוריד מחירים כי יש פחות עלויות שצריך לגלם במוצר הסופי. 
  • שנית, סיכויי האלימות נגד שליחים מצטמצמים באופן משמעותי (ולא ממש אכפת לנו מאלימות נגד הרובוטים, יש להם תשע מצלמות וקשר ישיר למוקד המשטרתי).
  • שלישית - הרובוט יכול להעביר גלידה בלי שהיא תימס. הרי יש כבר חשמל, למה שהרובוט הזה לא יהיה גם מקפיא? או תנור שיכול לאפות את הפיצה בדרך (או סתם לשמור עליה חמה). 
  • חוץ מזה, יש אנשים שפשוט לא אוהבים לתקשר עם זרים. נכון, זו פחות בעיה בארץ, בה "אחי" הוא כינוי למי שאין לך מושג מה שמו, אבל לפחות את ההתלבטות של האם צריך לשלם תשר או לא אפשר לחסוך. 
  • אגב, ההשפעה של הצלחה גדולה על העולם עשוייה להיות לא זניחה בכלל. למשל, אנחנו יודעים שהרובוט עדיין לא מתמודד היטב עם מדרגות, האם נראה בניינים חכמים פותחים עבורו את המעלית ומכוונים אותו לקומה הנכונה? האם נראה פתחים בדלת שיתאימו ליותר מאשר חתולים?
  • ומה אם רוצים לשלוח חבילה לחברים? אני לגמרי יכול לדמיין עסק שישכיר רובו-שליחים במחיר שווה לכל כיס. רוצים להפתיע מישהו עם מתנה בלי שהוא יראה אתכם סוחבים אותה? הילד שכח את המחברת בבית? צריך להחזיר ספר לספרייה אבל שלושים וחמש מעלות עם תשעים אחוזי לחות בחוץ?  בעלות מינימלית יגיע אליכם רובוט שיקח את החבילה ויעביר אותה ליעדה. 
  • מעקב אחרי משלוח. היום, אפשר לטעון (אולי) לבעיות חוקיות באפשרות לעקוב אחר מיקומו המדוייק של שליח. בכל זאת - בן אדם. אבל עם שליחים רובוטיים, אפשר יהיה לראות כמה רחוקה בדיוק הפיצה. 
  • ולסיום, אני מת לראות איך יסתדרו הרובוטים האלה כשכל מיני ילדים יתחילו לתפוס עליהם טרמפ. אחרי הכל, אחד הפיצ'רים החשובים ביותר של רומבה הוא הסעת חתולים
אפשר להמשיך ולצבוע את העולם בצבעים ורודים ולספר כמה זה יהיה מגניב. אבל שמתי לב לתופעה מעניינת. תוך כדי המחשבה על איך תשפיע ההצלחה על העולם, ההרגלים שלי כבודק תוכנה קפצו שוב ושוב והתחלתי לדמיין כל מיני בעיות שיהיו אם הרובוט השליח באמת יצליח בגדול. בכך שקיבלתי כהנחת יסוד את הצלחת הרובוט, זלי"כ השתנה קצת והפך להיות "בעצם, לא בטוח שזה רעיון כל כך טוב". המהות היא אותה מהות, אבל השינוי בזווית הראיה משפיע על סוג הבעיות שמצליחים לחשוב עליהן. 
  • הרובוטים האלה נוסעים על המדרכה. גם ככה צפוף על המדרכה, אז עוד כל מיני רובוטים כאלה שיתפסו מקום? האם אנחנו רוצים את הקופסאות האלה שועטות לנו בין הרגליים? כמה זמן ייקח עד שיהיה צורך בנתיבים נפרדים רק בשבילם? 
  • האם נראה חברות שמספקות שירות "אנחנו נרים את הרובוט שלך אחרי שהוא ייפול(או שידחפו אותו) על הצד"? 
  • את מי מאשימים (ותובעים) אם רוכב אופניים מתנגש ברובוט כזה שייסע בשביל אופניים (או על ההמצאה המגונה הזו בה מדרכה היא גם שביל אופניים וגם מדרכה בו זמנית)  ומתהפך? 
  • האם נתחיל לראות נזק לרובוטים שישאו את הלוגו של חברה לא אהודה במיוחד? או את המעסיק שבדיוק פיטר את השליחים שלו כי עכשיו יש לו רובוטים?
  • עם תשע מצלמות ומפעיל אנושי שצריך לעזור בחלקים הקשים, האם נראה תופעות של מפעילים שמרגלים אחרי האקסית שלהם? עד כמה נפוצה תהיה הבעיה של ריגול לא מכוון? כמה גדול יהיה אוסף התמונות החושפניות\מביכות באוסף של כל מפעיל רובוטים?
  • ואגב ריגול, האם המשטרה תוכל להשתמש בתמונות שהרובוט יאסוף אם הוא היה עד לפשע? אלקסה כבר מתמודדת עם דרישות דומות
  • כמה עומס ייצור צי רובוטים כזה על תשתיות הטלפון והאינטרנט? אנחנו מדברים על רובוטים שמשדרים וידאו בכל רגע נתון.
  • אפשר לנהוג ברובוטים האלה מרחוק. כשיפרצו את הרובוט (ובינינו, כרגע זה נראה כמו כל פיסת IoT אחרת, מה שרומז על כך שלא יהיה קשה מאוד לפרוץ לשם) האם אפשר יהיה לגרום לרובוט להידרדר לכביש ולהפריע לתנועה? או לגרום לתאונות?
  • ומה לגבי רובוטים מתאבדים? כולנו כבר יודעים כמה נזק עלול לגרום "חפץ חשוד" בצורה של תיק שנשכח בפינה. אם הרובוטים האלה מסתובבים בין הרגליים של כולם ואף אחד לא שם לב אליהם, מה מפריע למישהו למלא את הרובוט בחומר נפץ?
האם אני אומר ששילוח רובוטי של הק"מ האחרון זה רעיון רע? לא. לפחות, לא לגמרי (כאילו, כן. אבל אני לגמרי מודע לזה שאת אותו דבר אמרו על הטלפון, המכונית והמחשב האישי, ובאופן אישי אני לא מבין איך אנשים מפרסמים את כל החיים שלהם בפייסבוק, שלא לדבר על הזוועה ששמה טוויטר - אז אני כנראה לא בדיוק המדד הטוב ביותר למה יתפוס ומה לא). אין לי מושג ירוק מה מבין התוצאות האפשריות שהזכרתי כאן יתממש, ומה עוד יצוץ (כמו שכבר הזכרנו, בעולם של קנבין מדובר בתחום מורכב לעילא ולעילא). מה שאני אומר הוא שההרגל שלנו כבודקי תוכנה לצפות תקלות הוא חשוב, אבל להבחין בבעיות בדרך למימוש זה לא הכל. כדאי גם להקדיש קצת זמן ולתרגל את עצמנו לנסות לנחש מה עלול לקרות אם (או כאשר) נצליח. כמובן, לא חייבים לפתח משהו סופר-חדשני כדי שצורת המחשבה הזו תהיה רלוונטית. אם אני מסתכל אצלנו, לפני כמה שנים הוצאנו פיצ'ר חדש, ובערך שבוע אחרי שהוא שוחרר, יותר מחצי מהלקוחות שלנו התקשרו בזעם ודרשו לבטל אותו. גם זו תוצאה שעלולה לקרות. 
כמו במקרה של זלי"כ - אל תיתנו למחשבות השליליות לעצור אתכם מלפתח דברים חדשים, רק שימו לב שאתם מוכנים לכל תוצאה שאתם יכולים לשער. 

Tuesday, June 27, 2017

I don't find test-cases very useful

Well, Randall Munroe (the XKCD guy) has it right. Someone wrong on the internet is a great motivator. I was flipping through my reading list, when I encountered an article with the oh-so-daring title "You Don’t Have Test Cases, Think Again". Well - The people at PractiTest blog usually write deep thoughtful posts, so there is probably a catch hiding in the post that will lead to an interesting thought trail. Also, reading through my phone, I casually skipped the warning notice at the top of the page and went on reading. As I read through, it became clear to me that I completely disagree with the content there. Hence - this post here.

Probably the easiest thing would be to be the friendly neighborhood bully and pick up on some of the many mistakes there are in the post that indicates that the author either has no understanding of what exploratory tests are, or  he is using a very private and skewed definition of ET (some candidates are the claim that there is no test planning in ET, the axiom "good tests have well defined and agreed upon pass criteria in advance" or my favorite: "[...]some Exploratory gurus assiduously disdain requirements; so they’re very unlikely to get involved with intermediate development deliverables prior to executable code"), but I prefer to avoid public ranting and patronizing people I don't know, so instead, I'd rather say why I don't think in terms of test cases and why I usually avoid this language.

I'll start with the obvious truth - some of what I do can be described in test-cases language. While I'm "testing" (or "exploring", if you prefer this term) I'm doing a lot of checking that can be translated to test-cases language, as can some of my more vague observations (e.g. "this doesn't look comfortable") could sometimes be translated to a test case without stretching it (in fact, once a problem is spotted, defining a test case around it is usually easy). So, yes - if someone insists, I am "executing test-cases" and I'm doing it wrong in as many ways as shorthand writing is doing calligraphy wrong.
And that's, in short, is the reason I try to avoid using the language of "test cases" - It comes with a lot's of baggage. When I say "test case" I'm also saying "heavy predefined documents" and "step-by-step instructions", which is not what I'm trying to convey. When I talk about my testing, I focus on getting my team to agree on what we should test, on what risks do we want to address and I rely on my skills. During my work I will use checklists, I will review any source of information I have (and get those I need) and have my team review both my intentions and my work. Heck, we've recently spent a full week reformatting data into excel sheet just so that we could deal with an unusually large testing problem. And yet - I don't say "test cases".

Another matter I want to address is the odd dichotomy created between "exploratory testing" and writing a test case. When you think about it closely, it is pretty much the same thing. When I spent some time writing down very detailed test cases, I could never do it without actually having the software and performing it at the same time, and I have yet to meet a tester who wrote a test plan without "winging it". Sure, some of us improvise magnificently using all sorts of techniques  - from equivalence partitioning to combinatorial testing to personas and use cases - but all of that charade is simply masking the fact that we apply our experience, skills and gut feelings to choosing the data and the techniques that will be applied (no, I'm not saying those techniques are a sophisticated fraud, they are valuable, very much so sometimes, but the skilled tester will know when to apply each technique or tool and when not to).
I want to ask you to think of the following question: what would be the result of exploratory testing a requirements document?
...
...
...
...
Done thinking? have your answer? Great. Unless, of course, your answer was "exploratory testing must have a working product to act upon", which is simply wrong. But in any other case, great.
My answer is - test plan. When I test a requirements document (for those who use the ISTQB vocabulary, please recall that a review is a form of a static test), I come up with a model of how the software is supposed to function, with questions pointing at gaps in this model, or inconsistencies in the requirements, I compose a list of risks that we might want to put some safeguards against (some of them may be "test this area once it's done and look for that sort of glitches") and I add my knowledge and experience back to the team. I was definitely testing, and since I was learning about the product during this activity, I would say it falls under the definition of "exploratory" part as well (Also, if we avoid quoting anonymous "gurus" and stick with quotes we can trace, I tend to agree with Bach & Bolton's definition, according to which all testing is exploratory).
So, if we accept that writing a test plan is, in fact, an act of exploratory testing, why do we claim that executing the results is any different? And why do we insist on separating test execution from test planning? Sure, there are cases where we might want to plan more beforehand - to make sure we don't forget or to fight off some of the bias that we might have after testing the same thing for a while, but there are other cases where we might not want to do so. Relying on skilled testing allows us that freedom of doing what we think is right for our project. Which leads us back to why I don't like using the term "test case" - it just draws the focus from what's important.


---------------------------------------
מה יש לומר רנדל מונרו (ההוא מXKCD) ידע על מה הוא מדבר. יש מעט מאוד דברים שגורמים למוטיבציה כמו לראות מישהו טועה באינטרנט. הפעם, רפרפתי דרך רשימת הקריאה שלי כשהגעתי לבלוג של פרקטיטסט ושם היה המאמר עם הכותרת ההו-כה-מבריקה "You Don’t Have Test Cases, Think Again". נו, מילא. בדרך כלל אני מוצא שם פוסטים מרתקים, אז אולי יש פה ניסיון לתפוס את תשומת הלב כדי לגרום לי לחשוב. כמובן, כיוון שקראתי דרך הפלאפון, דילגתי בקלילות מעל האזהרה שהייתה כתובה באותיות של קידוש לבנה בראש העמוד והמשכתי לקרוא - מצפה לרעיון מעניין. ובכן, מהר מאוד הבנתי שמעניין זה לא יהיה, כי כל המאמר מבוסס על חוסר הבנה משווע של (הדרך בה אני חושב שצריך להבין) בדיקות חוקרות, ואפילו של בדיקות בכלל. ולכן (ובדחיפה קטנה מצד יואל) - הפוסט הזה. 

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

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

אם אנחנו כבר כאן, אני רוצה להתייחס לעוד נקודה שהפריעה לי בפוסט ההוא, והיא החלוקה המשונה בין "בדיקות חוקרות" לבדיקות מתוסרטות. כשעוצרים לחשוב על זה מקרוב, זה פחות או יותר אותו הדבר. בעבר, כשהקדשתי הרבה מאוד זמן לכתיבה של תסריטי בדיקה מפורטים, הדרך היחידה בה יכולתי לעשות את זה הייתה על ידי ביצוע של התסריט במקביל לכתיבה (וכניסיתי לכתוב במנותק מהתוכנה, הייתי צריך לשכתב הכל בהרצה הראשונה). מצד שני, מעולם לא פגשתי בודק תוכנה שלא כתב את תוכנית הבדיקות תוך כדי אלתור. נכון, חלק מאיתנו מאלתרים ממש נהדר עם כלים מרשימים כמו מחלקות שקילות, בדיקות קומבינטוריות, פרסונות או מקרי-שימוש (use cases, בלע"ז), אבל בסופו של יום, הבודק שכותב את תוכנית הבדיקות הוא זה שבוחר באיזה כלי להשתמש ואילו נתונים מוזנים לתוך כל אותם כלים (כמובן, אני לא טוען שהכלים האלה חסרי תועלת - להיפך, יש בהם תועלת רבה - אבל בסופו של יום, הבודק המיומן ידע מתי נכון להשתמש באיזה כלי ומתי לא). 

אני רוצה להציג את השאלה הבאה: כיצד יראו התוצאות של בדיקות חוקרות של מסמך דרישות?
קחו רגע לחשוב על זה. 
...
...
...
...

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

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

Monday, June 12, 2017

Nordic testing days - closing it all up


So, second day of NTD 2017... The scary part where I get to speak. At least, it was directly after the keynote, so I would have most of my day worry-free. 
Fiona Charles's keynote raised an important matter - As testers we should be responsible for our ethics - both towards the company that hires us, but more importantly, to the public that our product affect, and to ourselves. In a perfect world, everyone would be doing the right thing, so there will be no ethical dilemmas. Sadly, our world is not perfect, and we are asked to lie, or help in covering up information, or take part in a product that we think is morally inappropriate (my personal "no way I'll work there" include gambling sites, porn and most ad-services). In such cases, we have to know when to say "no". "No" to lying. "No" to deception. Also, it is very important to know that there are levels of saying that no. Most of the times, this no should be voiced internally - Letting the product owner know that the tests indicate a very high risk in releasing the software, asking again if we are comfortable with *this* business decision, going over your manager's head to make sure your concerns are not ignored irresponsibly, even resigning when you think the company is acting immorally (but not illegally) . Sometimes, when there's something more serious is on the line, it means that we should notify external entities - turn the external auditor's attention to the flaw that might cause a safety-critical component to malfunction, anonymously tipping the police when acts of fraud are being sanctioned by the CEO,  or even going to the media to reveal how irresponsibly the company is handling their user data despite all warnings and attempts to fix this. 
My main takeaway from this talk is that it's always easy to know what is the right thing for others to do. Especially in retrospect. Knowing the right thing to do yourself, and having the courage to do so - is not always that simple. Let's hope we won't face such dilemmas ourselves. 

Then, after the break, there was my talk. Was I nervous? yes. I think it went well, and some of the questions I got at the end indicated that my message had indeed reached at least some of the audience (my message, in short - threat modeling is very much like testing, so go and do that. 

After that, I could enjoy the rest of the conference worry-free, and went on to listen to some very good talks (such as Carly Dyson's talk on her insights from being a consultant, Melissa Marshall's thoughts about integration tests or Gwen Diagram's talk on logging and monitoring). 

Finally, was the closing keynote. Usually, I really like the keynotes - where you get great speakers with ideas that are inspiring and thought provoking. This one, sadly, was neither. The speaker, Kristjan Korjus, showed us a really interesting product - a robot that is meant to facilitate "last mile delivery" and make delivery a lot less expensive. It is, to borrow the Cynefin terminology, a very complex situation, and thus probably the most interesting situation, when the way forward is by probing fast and learning in retrospect, so I'm assuming that any of the directions there could have made out a great keynote that will give people something to take home except "oh, look, a cute robot". Instead, we got something that looked a lot like a sales pitch, and I'm not even sure who is supposed to buy what. 

Anyway, after the keynote and thanking the amazing conference team for their magnificent work we've moved to a nice bar for the after-party, where we got to say goodbye to those flying soon after the conference ends, and chat a bit more over dinner with those that were staying another night.
Yes, naturally we met a bit more with people at a(nother) pub for some more chats and fun. 

The last day where I could say it was still a bit conference-y was when we met the next morning for breakfast and final goodbyes. I then went with Sven for a day-trip in the countryside (where I took the picture you can see above). A really nice way to take a slow cooldown from a conference. 

So, all in all - it was a great conference. A lot to consider, great experiences and even greater people. If you are making a list of conferences you want to attend, this one should be very high on your list. 

Friday, June 9, 2017

Nordic testing days - day 1

So, the tutorials day is over, and the first day of talks began.
For starters, it was a lot more crowded. With ~500 attendees, it's the largest testing conference I attended, and the atmosphere is absolutely electrifying. A lot of things to learn and experience, and a whole lot of new people to meet.
With so much going on, I could probably babble about the experiences I had for quite a while, but instead I want to pinpoint some of the highlights of the day.
First to be mentioned is Franziska Sauerwein's workshop on refactoring JUnit tests. I'm quite comfortable with Java, so I came with the expectation of learning new coding habits by watching other people's (in this case - Franzi's) way of coding. And indeed, that is mostly what I got. The workshop went pretty well, at least as far as I can determine, and I got out with several pointers on how to improve some of the code I am writing (also, need to check Hamcrest, with which I was not familiar before). A workshop that makes a very clear promise, and then delivers it exactly.
Similarly, Kevin Harris's talk about losing third of the testers and surviving that. When a crisis happens, you must adapt, and Kevin shared with us some of the extreme measures they had to take to cope with this change. Some of them, probably, are better off when done with the luxury of time at hand - and even if they don't, they sure seem like the right thing to do (others, on the other hand, are crisis-only action, so I hope not to ever need them, but I'm stacking them in memory just in case).
The final keynote of the day was given by Alan Richardson, and was all about taking control of the way each of us treats testing. It was not a new message, but it sure was very inspiring and super important for new testers, while remaining not less important reminder to the rest.
And so, the day was concluded.
Or was it?
A conference dinner shortly followed, and then some sort of a party - with disco-lights and drummers. I took the chance to get some 20 minutes of quiet time before returning for the lightning talks and the Powerpoint karaoke - both of were real fun. I especially liked Gwen Diagram's lightning talk which was a very fast-paced,foul-mouthed ode to rapid development named "me and Mr. T".

A long day, and quite a fun one at that. Now, for the final day of the conference, where I'll be presenting my talk.
How did the Romans say? Ave, Imperator, morituri te salutant.

Thursday, June 8, 2017

Nordic testing days - tutorials day


Today was the tutorials day at NTD, and what a lovely start for a conference it was.
Choosing a tutorial was really difficult (so I'm glad I've done that part when registering) - with the exception of "java for testers" that claims to cover stuff I already know, I simply couldn't tell which one I prefer going to. By the end, I chose Fiona Charles's workshop on heuristics. It started out really well, with a short overview of what heuristics are - and I do prefer her way of looking at it as "shortcuts" instead of the overly wide "fallible methods of solving a problem", since it narrows the field at least a bit. My main difficulty with "heuristics" is that it can be used to describe just about anything people do, and using "shortcuts" narrows the field of discussion to useful heuristics and enables some sort of a meaningful discussion about it.
Before lunch, we played some children games, and tasked with the goal of finding some heuristics to solve the puzzles and track our heuristics as they changed over the exercise. What really got me was that none of the initial heuristics we tried to apply first held true, and soon after starting to actually solve the puzzle. Doing something only because it seemed to make sense in the past is not necessarily a good idea. The cool thing in this, though, is that heuristics that are not helpful were als really hard to follow for a longer period of time.
The second part of the workshop started by watching this video and being asked "what heuristics would be useful for testing this, if all the information that you have is this video?" Well, that was tougher than I thought it should be. Armed with the (tacit) knowledge that coming up with heuristics before actually doing some of the work would not necessarily be productive, we got to the task of coming up with test ideas and filling the information gaps we had with assumptions. After doing that for a while, we've tried grouping the test ideas to similar categories in hope of distilling it to a point where it would be easier to notice some of the heuristics we were using - that didn't go as well as I thought it would, since we found ourselves looking at a checklist (which is a great heuristic by itself), and not really knowing what was leading us. In the latest 3 minutes or so of the exercise something clicked and we were able to detach ourselves enough from test-idea generation, and look at how we were doing that. Our main heuristic to generate ideas was using scenarios (or use-cases, if you would prefer), which had a lot to with personas (the phrase "redneck with a crowbar" did come up once or twice). I could totally see how naming those heuristics could help me get a better coverage given some more time, but as it usually is in workshops - time is of the essence.

The day ended with speaker's dinner, which started in the cute train you can see at the top. quite a nice way to get to where we wanted - it started with a toast on some sort of a balcony, overseeing the beautiful Tallinn, followed by a medieval-themed dinner (in a dark, candle-lit restaurant), after which we were dragged to a bar to try out something called millimalikas (or something of the sort, I heard it means "jellyfish" is Estonian, but did not verify that), which is two sorts of alcohol, one of which is anise-based (read: really disgusting) and some tabasco to make it painful. Thankfully, the tabasco  burn did eradicate the anise after-taste, but it is definitely not something I would repeat.
All in all, a packed day, which was a prequel to an even more packed conference.

Thursday, May 25, 2017

שמות עתיקים ומעלי עובש

names that get old and stale

אחד הדברים הראשונים שמלמדים בכל קורס מבוא לתכנות הוא שחשוב מאוד לבחור שמות משתנים בעלי משמעות. הם הופכים את הקוד לקריא יותר וחוסכים שעות על גבי שעות של עבודה. 
נקודה קטנה שלא מזכירים מספיק, היא ששמות מתיישנים. לפעמים קורה שהשפה בה אנחנו משתמשים משתנה. למשל - אם יש לנו יכולת לבטל את פעילות המערכת עבור משתמש מסויים, מה הגיוני יותר מאשר לקרוא למשתנה שקובע האם יש למנהל הרשאה להפסיק את החלק המרכזי בשירות בשם PERM_DEACTIVATION ? ואם, נוסף על היכולת הזו, יש לנו יכולת ביטול מלאה של השירות, למה לא לקרוא לזה PERM_FULL_DEACTIVATION? 
והנה, שלוש שנים אחר כך, בכל פעם בה מישהו אומר "הפסקת שירות" צריך לשאול אותו שבע פעמים לאילו משתי הפונקציות הוא מתכוון. 
השבוע יצא לי להתמודד עם סוג נוסף, קצת יותר זדוני, של שם משתנה שהזדקן רע. 
יש לנו במערכת משתמשים. חלקם, מתוקף תפקידם, יכולים ליצור משתמשים אחרים. אחד מהם, במקרה, נקרא "מנהל הכל". במקור הוא נכתב כשיש לו את ההרשאות ליצור את כל סוגי המשתמשים האפשריים. 
אבל, כמו שקורה במערכות מתפתחות - נוספו עוד סוגי משתמשים. וכמובן, אף אחד לא זכר לעדכן את ההרשאות של סוג המנהל הנ"ל. שמונה שנים (לפחות) מאוחר יותר, בשעת ערב לא מאוד מוקדמת, משבר! לקוחות זועמים! מנהלים מקיימים שיחות עתירות משתתפים! בוקה ומבוקה ומבולקה. 
לא אלאה אתכם בפרטים הקטנים, רק אציין נקודה אחת - חלק מהפתרון לבעיה הצריך יצירה של מנהל מערכת שיכול ליצור את כל סוגי המשתמשים. "אין בעיה", הכרזתי. יש לנו את "מנהל הכל", וכל חברי הצוות שהיו מעורבים הביעו הסכמה, למרות שכל אחד מהמשתתפים, לפחות פעם אחת (וכנראה שיותר) בשנים האחרונות, נתקל בפער ההרשאות הזה בין "מנהל הכל" לבין סוגי המשתמשים שיש במערכת. למרות זאת - כולנו היינו בטוחים ש"מנהל הכל" יכול לעשות את מה שאנחנו רוצים. אחרי הכל, למה שיקראו לו ככה אם הוא לא יכול לעשות הכל? כשבדקנו וגילינו שבעצם, לא - הוא לא יכול, נזכרתי שכבר הייתי בדיוק באותה סיטואציה בעבר, וכבר "גיליתי" שהיכולות של המשתמש הזה חסרות, ושככה, עם היכולות האלה,  הוא מוגדר בתיעוד הרשמי שלנו. 

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

----------------------------------------------------------------------------------
One of the first things that are being taught at every introductory programming course is "choose meaningful names for your variables". Those names make your code more readable, and save hours of work. 
A small point that don't get mentioned enough, is that names deteriorate. Sometimes, the domain language we speak is changing and old terms become meaningless, sometimes, it a matter of duplication - After all, what's more sensible than naming the permission to deactivate the main flow of our product as "PERM_DEACTIVATE" ? and, if we have another feature enabling full deactivation, why not name it PERM_FULL_DEACTIVATION? Three years later, you'll find yourselves asking each time "when you say 'deactivate', which of the two do you mean?". 
This week I got to deal with another, nastier form of term deterioration. 
In our systems there are users. As can be expected, where there are users, there are also admins that can manage those users. One of them is called "admin-all". Originally (we believe) it was meant to create all kinds of users in our system. As sometimes happens in developing systems - more roles were added at a later phase, and no one updated the admin-all permissions (it might even be that it was intentional and not a matter of negligence). Eight years later (at least), a crisis happens! Customers are furious! managers are gathering over phone to discuss! Chaos is reigning!
I won't bother you with the exact details of the problem, I'll only mention that we needed to provide someone with an admin that can create all other users. "Well, easy", I said. "Just give them an 'admin-all'". All the other people in the conversation, all of whom have more years of experience with the product than my mere 5 years, voiced their agreement. Yep, that's the user we need. Each and every one of us have encountered at least once in the past the gap between the claim "admin all" and the actual privileges, so when a short check we did showed that some privileges are missing, all of us had this "oh, right, I forgot" moment. 

I don't really have deep insights from this story, except, perhaps - make sure to maintain the names you choose, and update them if you have reason to. It saves confusion and mistakes later. 

Sunday, May 7, 2017

My problem with the screenPlay Pattern

source: https://farm7.staticflickr.com/6132/6009155327_3fc5e7c0e3_o.jpg

Like anyone who is even remotely interested in Selenium, I too heard about the new emerging "Screenplay Pattern" (you can read about it here, or watch this talk) and took some time to consider it. My first reaction was "I think it's a bit silly, writing all of this for no gain at all", then "It looks like more overhead and duplication than I currently have with page-objects". And then I forgot about it.
In Selenium Conf UK (2016) Antony Marcano gave a talk about it which I watched just since it was well presented, and I wanted to see if I could figure out why is there so much fuss around this pattern. It turns out that the screenplay pattern is simply branded incorrectly, and presented as a (complex) solution to a problem that should be solved in a simpler manner. Apart from that, though, it is a really useful tool to have in my utility belt, after fixing the fundamental flaw it has, of course.
To put things simply - The screenplay pattern is not a good substitution for decent page-objects and, in fact, should co-exist with them.
If you read my previous posts about "page-objects are not enough" (pt.1, pt.2) then you might have noticed that I advocate for a layered infrastructure for your automation. Personally, I see three layers that are really needed (Alex Schladebeck is splitting it to 5 distinct layers, which might be a good idea, depending on your context). The three layers I need are: Tests, Business actions (or "flows") and atomic actions.
The atomic actions are stuff like "click on the 'next' button" or "select all users from the database" (In Alex's model, there's a lower level layer which will do "click on something" or "run this SQL query" - a layer very important if you have multiple technologies to drive your actions).
However, atomic actions are not really helpful for your day to day test, so the second layer is created - the business actions. Here you'll find stuff such as "add a new user", "change password" and so on. Business actions are the place to put the context knowledge in - today logging in requires a username and password. Tomorrow it might require an one-time-password sent by SMS. the business action is the place to invoke the specific atomic actions that compose the actual action (Again, in Alex's model, this is split into two layers - internal and external. I think it's nice that she made this distinction, I don't think it's crucial in my context).
Finally, there's the tests themselves - They should be calling the flows layer, and even though some atomic actions might be used for assertions, as a rule of thumb - test methods should not be calling atomic actions themselves. When it get's to UI actions, this rule is more strict - your test should not contain any selenium code or any page-objects (the same is true for any sort of technology you might be using to drive your UI).

As I hope it's easy to notice - the screenplay pattern fits very nicely to that middle layer. Clear business actions that hide the actual steps taken to perform them. I can think of no reason not to include page objects within the screenplay actions, thus separating "how do I interact with an element" from "which elements should I be interacting with?"
This brings me to another point that was touched upon in Anthony's talk - Bloated page objects should not exist.
By separating the responsibility (the "which" from the "how") , most of this is solved - a page object should contain only the elements in it and a way to interact with each element. Perhaps we might go as far as aggregating filling up an entire form, but anything more complex than "login" should be dealt with in the flows layer. By doing this and keeping the page-objects representing small pieces of the UI , no large classes are created, and the flows layer (where the screenplay pattern is really helpful) remains clean and without unnecessary duplication when two actions go through the same pages.

--------------------------------------------------------------------------------------------

כמו כל אחד שמתעניין קצת בעולם של סלניום, גם לי יצא לשמוע על הדבר הזה שנקרא screenplay pattern (אפשר לקרוא על זה כאן או לצפות בהרצאה הזו) ועצרתי לחשוב על זה. תכל'ס? התגובה הראשונה שלי נעה בין משיכה בכתפיים לתהייה בשביל מה צריך את כל התסבוכת הזו - נראה שבמימוש סטנדרטי של התבנית הזו אני אסיים עם שכפול קוד משמעותי יותר מאשר יש לי כרגע עם page-objects. נו, מילא. קראתי, סיווגתי, המשכתי הלאה. 
בשנה שעברה, בכנס סלניום, Antony Marcano העביר הרצאה על התבנית הזו (נו, אותה הרצאה שקישרתי אליה שם למעלה), וצפיתי בה, בעיקר כי הוא העביר אותה היטב, אבל גם כי רציתי לראות - אולי אצליח להבין מה ההתלהבות הגדולה מסביב לזה. 
ואכן הבנתי משהו - כל סיפור התסריטים הזה (בפוסט הזה, לפחות, אשתמש ב"תסריט" במקום screenplay, כי זה נוח יותר להישאר בעברית) פשוט משווק לא נכון ולכן מציג פתרון מסובך לבעיה שעדיף לפתור באופן פשוט יותר. אבל חוץ מזה? נראה שהתסריטים הם משהו שכדאי להכניס לארגז הכלים שלי - אחרי שמתקנים את הפגם היסודי שבהם. 
בפשטות - התסריטים אינם חלופה טובה לpage objects בנויים כהלכה, וקל וחומר שאינם "הדור הבא" שלהם. למעשה, התסריטים צריכים לדור איתם בכפיפה אחת. 
אם יצא לכם לקרוא את שתי הרשומות שלי על page objects are not enough (חלק א', חלק ב'), בטח שמתם לב שאני ממליץ על אוטומציה שבנוייה בשכבות. בפרט, אני נוטה לחשוב על שלוש שכבות נפרדות (Alex Schaldebeck מציעה חלוקה לחמש שכבות שונות, מה שעשוי להתאים לפרוייקטים מסויימים). שלוש השכבות שלי הן שכבת הבדיקות, שכבת הפעולות העסקיות ושכבת הפעולות האטומיות. 
הפעולות האטומיות הן פשוטות - לחיצה על כפתור "הבא", שליפת מספר המשתמשים ממסד הנתונים. דברים כאלה (אצל אלכס יש שכבה בסיסית יותר בה יופיעו "לחיצה על אלמנט" או "הרצת שאילתה מול מסד הנתונים" - שזו שכבה חשובה מאוד אם יש לכם כמה דרכים לבצע את אותן פעולות אטומיות בסביבות שונות). 
עם זאת, פעולות אטומיות לא ייקחו אותנו רחוק מאוד - ולכן נולדה השכבה השנייה - שכבת הפעולות העסקיות. לפונקציות כאן כבר יש משמעות בעיני המשתמש. זה לא "לחץ כאן" "מלא את השדה הזה" אלא "הוסף משתמש חדש" או "החלף סיסמה". הפעולות העסקיות הן החלק בו נשים את הידע המוצרי - איך עושים דברים. הרי היום כניסה למערכת דורשת שם משתמש וסיסמה, אבל אולי מחר הכניסה תתבצע בעזרת סיסמה חד פעמית שתישלח במסרון. הפעולות העסקיות הן המקום ממנו נקראות הפעולות האטומיות, והן המקום בו מוגדר מה הפעולות האטומיות שצריך לבצע כדי להשיג תוצאה ספציפית (שוב, במודל של אלכס זה מפורט יותר ומחולק לשתי שכבות - חיצונית ופנימית. זו אבחנה שכדאי לעשות, אבל אני חושב שהיא פחות קריטית ברמה העקרונית). 
לסיום ישנה שכבת הבדיקות - כאן נכתבות הבדיקות בעזרת הפעולות העסקיות. למרות שניתן מדי פעם לקרוא לפעולות אטומיות לצורכי אימות (assertion), כלל האצבע הוא שהבדיקות קוראות רק לפעולות עסקיות.  כאשר מדברים על אוטומציה של UI, הכלל הזה צריך להיאכף בקפידה  - בבדיקות לא אמור להיות קוד של סלניום, או של page objects (והדבר נכון לכל טכנולוגיה בה אתם משתמשים כדי לגרום לממשק הגרפי לזוז). 

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