בחירת שפת תכנות עבור תשתית אוטומציה שיקולים, אילוצים ועוד | ניסים אריאל

 

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

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

 

השפעות חוץ

 

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

מחשבה זו אינה בטלה ולעיתים היא נכונה וזה מאוד תלוי מקרה, אך היא אינה לוקחת בחשבון כמה נקודות קריטיות:

·          הרוב המוחלט של פלטפורמות האוטומציה נכתבות כ Standalone, כך שהשפה שבה מפותח המוצר איננה כ"כ רלוונטית בשיקול הבחירה.

·          לא תמיד השפה שבה המוצר מפותח מתאימה לאוטומציה, למשל ++C שהיא שפה נפוצה מאוד בעולם ה Embedded, אך לא בנויה לשימושים של אוטומציה קלאסית של UI או בדיקות API. אפשר להקים איתה מערכי בדיקות למוצרי Embedded, אבל בצורה שיותר מתאימה לעולם הפיתוח מאשר לעולם הבדיקות.

·          האם השפה שמכוונים אליה היא שפה עם אפשרויות, עם ספריות שנכתבו לטובת אוטומציה. הרי כתיבת אוטומציה, היא בעלת אופי ייחודי ששונה מפיתוח בשורה התחתונה, ובדרך כלל על הבסיס הזה נוצרו ספריות אוטומציה לשפה מסוימת ולאחרת הרבה פחות. לדוגמא: PYTHON – שיש לה תאימות להרבה פלטפורמות, לעומת NET. שלא.

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

 

הבנת הצרכים והדרישות

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

 ה-Desktop applications.

 

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

 קהילה

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

הערכת התאמת שפה

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

 הערכת התאמת שפה

 Python

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

 

 

יתרונות

1.       פשטות התחביר. Python הוא פשוט וקריא, מה שהופך אותו לנגיש בכל רמות המיומנות. פשטות זו מאיצה את תהליך הפיתוח ומקדמת תחזוקה של קוד.

2.       Python מתהדרת במערכת אקולוגית עשירה של ספריות למשימות אוטומציה. ספריות פופולריות כמו Selenium, PyTest מספקות כלים חזקים לבדיקות אינטרנט, בדיקות API ועוד.

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

חסרונות

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

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

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

פלטפורמות נפוצות ש-Python עובדת איתן:

Selenium, Appium, Playwright, Robot Framework, Cucumber

 

Java

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

 

יתרונות

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

2.       מערכת אקולוגית עשירה. Java נהנית ממערכת אקולוגית עצומה של ספריות, כלים ומסגרות הנותנות מענה לצרכי אוטומציה שונים. בין אם מדובר באינטראקציה עם מסדי נתונים, טיפול בשירותי אינטרנט, JUnit, TestNG מציעות תמיכה נרחבת באמצעות ספריות וממשקי API של צד שלישי.

3.       קהילה וותיקה ביותר. אין סוף חומר ודוגמאות ברשת. הדגמות, פתרון תקלות וכל מה שאפשר להעלות על הדעת.

חסרונות

1.       מורכבות ועקומת למידה. האופי המונחה עצמים של Java והמערכת האקולוגית המקיפה של ג'אווה עשויים להציג עקומת למידה תלולה במיוחד אלה החדשים בשפה. שליטה ב-Java עבור אוטומציה דורשת הבנת מושגים כמו מחלקות, ירושה וממשקים, כמו גם היכרות עם כלים ומסגרות קשורות.

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

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

פלטפורמות נפוצות ש Java עובדת איתן:

Selenium, Appium, Cucumber

JavaScript

JavaScript היא שפת תכנות מגוונת, קלת משקל וקריאה, המשמשת בעיקר ליצירת תוכן אינטראקטיבי ודינאמי באתרי אינטרנט. משמשת בעיקר בצד הלקוח (בדפדפן האינטרנט של המשתמש) והיא חיונית לפיתוח WEB. JavaScript מאפשר פונקציונליות, אנימציות, ואינטראקטיביות. עם עלייתו של Node.js, ניתן להשתמש ב-JavaScript גם בצד השרת, מה שמאפשר פיתוח full stack בשפה אחת. האימוץ הנרחב שלה, הספריות הנרחבות (כמו React, Angular ו-Vue.js), והשילוב הקל עם HTML ו-CSS הופכים אותו לכלי בסיסי עבור מפתחי אתרים.

 

יתרונות

1.       תפוצה רחבה. JavaScript היא אחת משפות התכנות הנפוצות ביותר, במיוחד בפיתוח אתרים. הימצאותה כמעט בכל מקום מבטיחה שמפתחים רבים כבר מכירים את JavaScript, מה שמקל על ההכשרה של חברי הצוות ולמנף את המומחיות הקיימת כבר בחברה לפרויקטים של אוטומציה.

2.       אסינכרוניות. מודל התכנות האסינכרוני – מקבילי, שאינו ממתין בתור, של JavaScript, המופעל על ידי תכונות כמו Promises ו-async/await, הופך אותו למתאים היטב לטיפול במשימות אסינכרוניות הנפוצות באוטומציה, כגון ביצוע בקשות HTTP, המתנה לאלמנטים שיופיעו ב- דף אינטרנט, וטיפול במשימות בעלות זמן קצוב ב UI.

3.       אינטגרציה עם Node.js. האינטגרציה של JavaScript עם Node.js מרחיבה את היכולות שלה מעבר לדפדפן, ומאפשרת למפתחים לבנות סקריפטים של אוטומציה בצד השרת ולמנף מגוון עצום של מודולי npm (Node Package Manager) - עבור אוטומציה מרובת משימות, כולל פעולות עם קבצים, רשתות ואינטראקציות עם מסד נתונים.

 

 

חסרונות

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

2.       תאימות דפדפנים. מאז ES6 – הגרסה האחרונה והמשמעותית ביותר של השפה, ישנן בעיות תאימות הדפדפן. הבדלים ביישום הדפדפן ובשונויות של מנוע JavaScript עשויים לחייב מאמץ נוסף כדי להבטיח תאימות בין דפדפנים והתנהגות עקבית בסביבות שונות.

3.       אמנם האופי האסינכרוני של JavaScript הוא יתרון, אבל זה יכול גם להוביל למבני קוד מורכבים ומקוננים, המכונה בדרך כלל "Callback Hell" או "Promise chaining".

פלטפורמות נפוצות ש-JavaScript עובדת איתן:

Selenium, Cypress, Nightwatch.js, Puppeteer, .Playwright

 

TypeScript

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

 

 יתרונות

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

2.       תסריטי בדיקה שנכתבו ב-TypeScript קלים יותר לקריאה ולהבנה, במיוחד עבור מפתחים שחדשים בבסיס הקוד או בפרויקט. דבר שאני שומע מחברים שעברו מJS ל TS.

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

חסרונות

1.       לחלק מכלי אוטומציה מיוחדים או ספריות עשויות להיות תמיכה מוגבלת ב-TypeScript. זה עלול להוביל לאתגרים בשילוב כלים מסוימים במסגרת אוטומציה מבוססת.

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

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

פלטפורמות נפוצות ש TypeScript עובדת איתן:

Cypress, Nightwatch.js, Puppeteer, Playwright