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

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

אז למי שלא מכיר, ה-TestNG הינו פריימוורק לבדיקות מאוד פופולרי למפתחי אוטומציה, את הדוקומנטציה עליו תוכלו לקרוא כאן

 

כאשר אנו נרצה להריץ סוויטה של בדיקות עם TestNG , נכול לעשות זאת ע"י יצירה של קובץ xml שיהווה את קובץ הקונפיגורציה לנו להרצה (אותו אגב נוכל להריץ ישיריות מתוך ה-IDE (לדוגמת ה-Intellij) , דרך ה-Command Line או דרך כלי בניית תוכנה כזה או אחר (למשל Maven או Gradle), להלן דוגמא לקובץ xml כזה:

אוקיי, מה אנחנו רואים כאן ?

שורות 1 + 2 זוהי ההגדרה של מסמך ה-xml עם זיקה ל-TestNG

שורה 3: הגדרת הסוויטה הכוללת שם הסוויטה והאם להריץ את ה-tests שלה באופן מקבילי או לא

שורה 4: הגדרת ה-test הראשון, שימו לב כי זהו אינו מקרה בדיקה – Test@ שמגיע עם TestNG)

שורות 5-7: הגדרת המחלקות שירוצו תחת ה-test הזה, השם כולל את שם החבילה (package) ושם המחלקה

שורות 13 – 9: הגדרת ה-test השני

שורה 14: סגירת הגדרת הסוויטה במסמך

במקרה כזה, בבואנו להריץ קובץ זה, המחלקות ירוצו אחת אחרי השניה (אין כאן צורך ממשי בהגנה על האובייקט כאן) , אך במידה ונרצה להריץ באופן מקבילי את ה-tests, פשוט מאוד נצטרך לשנות את ההגדרה של שורה 3 , כאשר נשנה את ההגדרה כך: parallel="tests"

למעשה, ה-TestNG אפילו חכם עוד יותר מזה, אין אנו מחוייבים לעבוד רק בתצורה של tests לגביי הרצה מקבילית, הפריימוורק תומך בהרצה מקבילית של קונטיינרים אחרים, כמו למשל methods, classes, instances

כך ששורה מספר 3 בצילום המסך המוצג למעלה יכולה להיות גם כך:

או כך:

או כך:

להלן ההסבר:

כאשר אנו מגדירים את ההרצה המקבילית עם הערך methods ה-TestNG יריץ את כל המתודות (שזה אומר ה-Test@) של הסוויטה בצורה מקבילית, כל מתודה תרוץ ב-Thread שונה, רגע, לפני שאתם קופצים לגביי איך נריץ מאוד טסטים במקביל, יש דרך לשלוט בכמות ההרצות במקביל, נראה עוד מעט…

כאשר אנו מגדירים את ההרצה המקבילית עם הערך classes ה-TestNG יריץ את כל המחלקות המוגדרות בסוויטה בצורה מקבילית, כל מחלקה תרוץ ב-Thread שונה, שזה אומר שאם למחלקה ישנם 10 מקרי בדיקה (Test@) הם ירוצו אחד אחרי השני על אותו Thread , אבל במקביל תרוץ מחלקה אחרת (נגיד עם 15 מקרי בדיקה) על Thread שונה.

כאשר אנו מגדירים את ההרצה המקבילית עם הערך instances ה-TestNG יריץ את כל המתודות (שזה אומר ה-Test@) של המופעים בצורה מקבילית, כל מופע ירוץ ב-Thread שונה, כאשר כל המתודות שאותו מופע ירוצו אחת אחרי השניה

וכאמור בדוגמא הקודמת, אנחנו יכולים לשנות את הערך parallel ל-tests כך:

וזה אומר שבאופן סינטטי אנו יכולים להגדיר איזשהו קונטיינר שיכיל אוסף של מחלקות לרוץ במקביל ב-Thread שונה , גם אם אותן מחלקות אינן מוגדרות כ-Thread Safe

איך אנחנו יכולים להגביל את כמות ה-Threads ? ובכן זוהי פעולה די פשיטה ב-TestNG , והיא פשוט מתבטאת בהוספת של מאפיין נוסף של הסוויטה, כך:

הוספנו לכאן את המאפיין: thread-count והגבלנו אותו ל-3 Threads שונים בלבד, זאת אומרת שבמקרה הזה ירוצו בכל רגע נתון עד 3 מקרי בדיקה בלבד, כמובן שכולם יהיו מוגנים, ע"י מנגנון ההגנה שמגיע עם ה-TestNG

 

דרך נוספת להריץ מקרי בדיקה עם Thread Safe היא על ידי הגדרת המאפיין: threadPoolSize ברמת הגדרת ה-Test@ , כך למשל:

@Test(threadPoolSize = 3, invocationCount = 12,  timeOut = 5000)
public void test01() {
}

במקרה הזה הגדרנו את test01 שירוץ 12 פעמים על שלושה Threads שונים , בנוסף, הגדרנו המתנה של 5 שניות כדי להבטיח שאף אחד מה-Threads יחסום את השני

 

אנקדוטה קטנה לפני שאנחנו מסיימים כאן.

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

ThreadLocal threadLocalValue = new ThreadLocal<>();

זה אומר שאנחנו יכולים להגדיר למשל את הדרייבר שלנו באוטומציה באותו צורה:

protected ThreadLocal driver = new ThreadLocal<WebDriver>();

כעת נוכל לקרוא לכל המתודות שאנו מכירים כבר מסלניום, תוך קיראה ל-getters וה-setters שיש לה להציע:

String url = "https://atidcollege.co.il/";
driver.set(new ChromeDriver(options));
driver.get().manage().window().maximize(); 
driver.get().get(url);

 

  • מעוניינים ללמוד יותר לעומק איך לעבוד עם ה-ThreadLocal ? גם נושא זה מופיע אצלינו בקורס האוטומציה למתקדמים שלנו: Automation Plus Plus

 

בהצלחה,

סאיד

 

 

השאר הערה\הודעה