چکیده: در این پست، ما در مورد تعدادی از Best Practiceهای سلنیوم برای اتوماسیون تست سلنیومی بحث میکنیم که ممکن است به شما در توسعه Test Suiteها یا Test Caseهای خوش طرح و البته مقیاس پذیر کمک کنند.
در طول کار خود در تست اتوماتیک با استفاده سلنیوم، با افراد زیادی روبرو شدهام که از پایداری و اطمینان اتوماسیون تست خود شکایت دارند. در بیشتر موارد، منطق مورد استفاده در اجرای Test Caseها مناسب بود، اما شیوه طراحی و Scalability(مقیاسپذیری) نگران کننده مینمود.
پس از مدتها کار با چارچوب سلنیوم، فهمیدم که رویکرد “یک سایز برای همه” در مورد اتوماسیون تست سلنیومی صدق نمیکند. اگرچه هیچ قاعده سرانگشتی برای طراحی و توسعه تستهای اتوماتیک مقیاسپذیر وجود ندارد، اما اصول خاصی وجود دارد که باید هنگام نوشتن تستها با استفاده از چارچوب سلنیوم رعایت کنید. این اصول میتوانند ” Best Practiceهای سلنیوم” باشند.
در این پست، ما در مورد تعدادی از Best Practiceهای سلنیوم برای اتوماسیون تست سلنیومی بحث میکنیم که ممکن است به شما در توسعه Test Suiteها یا Test Caseهای خوش طرح و البته مقیاس پذیر کمک کنند.
صرف نظر از زبانی که برای اتوماسیون تست با سلنیوم استفاده میکنید، این موارد Best Practiceهای ارزشمند سلنیوم هستند.
- از مسدود کردن کد با Sleep خودداری کنید
کاملا مشخص است که رفتار برنامه های وب(یا وب سایتها) به بسیاری از عوامل خارجی مانند سرعت شبکه، قابلیتهای دستگاه، محل دسترسی، بارگذاری در سرور Back-End و موارد دیگر بستگی دارد. این عوامل پیشبینی زمان واقعی بارگیری یک Web Element خاص را کاملاً چالش برانگیز میکند. در اینجا، اضافه کردن تأخیر(یا مهلت زمانی) قبل از انجام هرگونه Action در Web Element، به منظور بارگذاری آن Web Element خاص، اجرای کل Test Script را به تاخیر میاندازد.
این کار با استفاده از یک متد Delay در Library زبان مورد استفاده در سلنیوم(به عنوان مثال، Thread.sleep در جاوا، time.sleep در پایتون) حاصل میشود و برای مدتی مشخص شده Test Script را به تاخیر میاندازد. برای یک برنامه Single Thread، کل اجرای سیستمی مسدود میشود. این کار در افزودن تأخیر مورد نیاز نقش اساسی دارد، اما مدت زمان تأخیر به عوامل بیشماری بستگی دارد. هیچ تضمینی وجود ندارد که تأخیر اضافه شده همیشه کار کند. به عنوان مثال، ممکن است ۵ ثانیه تأخیر اضافه کرده باشید، اما Web Element مد نظر شما حتی پس از ۱۰ ثانیه هم Load نشود. ایضا ممکن است عملیات بارگذاری سریعتر هم انجام شود. در این صورت مدت زمان باقیمانده عملا به هیچ کاری جز توقف بی دلیل برنامه نمیآید. به هر حال این حربه قطعا به یک نقطه ختم میشود و آن این است که شما صرفا در حال ایجاد Test Scriptهایی هستید، که هیچ اطمینانی برای یافتن Web Element در آنها وجود ندارد، و علاوه بر آن زمان زیادی را نیز برای اجرا صرف خواهند کرد. این موضوع در وهله اول به چشم نمیآید. اما زمانیکه قرار باشد تعداد Test Scriptهای شما زیاد شود(مثلا ۵۰۰ عدد)، و یا تعداد اجراهای شما برای هر Test Script به طور متوسط از ۱ بار به ۱۰ بار رشد کند آنگاه خواهید دید که شما ۵۰۰۰ اجرای عملیات را با چندین ثانیه تاخیر برای هر اجرا انجام میدهید. معمول اوقات اگر بخواهید در Test Scriptهای عملیاتی و واقعی، از مسدودسازی با استفاده از Sleep بهره بگیرید، معمولا به طور میانگین مجبورید در بهترین حالت هر اجرا را ۵ ثانیه متوقف کنید. اکنون خواهید دید که با توجه به ۵۰۰۰ اجرا شما مجموعا ۲۵۰۰۰ ثانیه را برای توقفهای نامطمئن(یعنی توقفی که مشخص نیست آیا پس از آن بارگذاری Web Element صورت میگیرد یا خیر) صرف کردید. این زمان حدود ۷ ساعت است. این موضوع علاوه بر مطالب مندرج، میتواند منجر به ایجاد مشکلاتی در تستهای اتوماسیون UI شود.
اما چه گزینه بالقوهای برای جلوگیری از مسدودسازیها از نوع Sleep وجود دارد؟ سلنیوم Implicit Waiting و Explicit Waiting را برای این موضوع پیشنهاد میکند. که باعث میشود به محض رویت Web Element مربوطه، اجرای کد شما ادامه یافته و دیگر منتظر نماند.
- Test Caseها و Test Suitها را به صورت مناسب نامگذاری کنید
هنگام کار در یک تیم، مواردی وجود دارد که ممکن است اعضای تیم شما ملزم به رشد دادن تستهایی شوند که شما نوشتهاید. اگر بعد از چند ماه به همان تست دوباره مراجعه کنید، تا زمانی که اجرای کامل را انجام ندهید، نمیتوانید هدف آن تست را دریابید.
اگر برخی از تستها در مرحله اجرا ناموفق بودهاند، باید فقط با نگاهی سریع به نام تست، بتوانید درک کنید که کدام ویژگیها دچار نارسایی شدهاند. این مشکلات را میتوان با نامگذاری توصیفیِ مناسب Test Caseها که در قالب Test Script سلنیومی تولید شدهاند، برطرف کرد. آنچنانکه نه شما و نه هم تیمیهایتان وقت خود را بی جهت صرف پیمایش و بررسی کد ثبت شده در اسکریپت نکنند.
- سطح زوم مرورگر را روی ۱۰۰ درصد تنظیم کنید
بعضی اوقات در طی فرآیند اتوماسیون تست در سلنیوم، ممکن است متوجه شوید که اجرای تست روی مرورگرهای خاص به درستی کار نمیکند. این امر معمولاً هنگام اجرای تست به صورت چند مرورگری(Cross Browser Testing که به معنی اجرای تست فارق از مرورگر است. این یعنی شما میتوانید تست خود را بدون در نظر گرفتن استانداردهای یک مرورگر اجرا نمایید) روی مرورگرهای منسوخ شده مانند اینترنت اکسپلورر رخ میدهد.
صرف نظر از مرورگری که تست اتوماتیک سلنیومی روی آن انجام میشود، تنظیم سطح بزرگنمایی مرورگر روی ۱۰۰ درصد یکی از بهترین اقدامات سلنیوم است که باید دنبال شود. این تنظیم باعث ایجاد احساس Mouse بومی(Native Mouse) برای مرورگر میشود، و اطمینانی ایجاد میکند که رویدادهای بومی Mouse در مختصات صحیح تنظیم شدهاند.
برای این تنظیم میتوانید شبیهسازی عملیاتِ کلیدهایِ ترکیبیِ کیبورد را که در حالت معمول از آنها به عنوان Short Key برای تنظیم زوم ۱۰۰% استفاده میکنید، بهره بگیرید. مثلا کلیدهای ترکیبی Ctrl+0 عملیات زوم کردن ۱۰۰% را برای شما انجام میدهند. این کار را باید با کلاس Actions در سلنویم انجام دهید.
همراه با این تنظیمات، Protected Mode Settings(در اینترنت اکسپلورر) برای هر منطقه باید یکسان باشد. در غیر اینصورت ممکن است یک استثنا NoSuchWindowException گریبانتان را بگیرد.
- پنجره مرورگر را به Maximize برسانید
یکی از اولین اقداماتی که توسط یک تستر برای اتوماسیون تست سلنیومی انجام میشود، گرفتن عکس از صفحه وب است. عکسبرداری از صفحه در حین اجرای تست، کاریست که برای کمک به توسعهدهندگان در زمان دیباگ و کمک به ذینفعان کلیدی برای پیگیری پیشرفت توسعه محصول گرفته میشود. عکسهای صفحه همچنین به تشخیص عدم موفقیت تست به دلیل Failure در برنامه یا مشکل در Test Script که برای اتوماسیون تست با سلنیوم استفاده میشود، کمک میکنند.
به طور پیش فرض، سلنیوم پنجره مرورگر را در حالت حداکثر باز نمیکند. این میتواند بر تصویر صفحه وب که معمولاً در Test Report و Bug Report ضمیمه میشود، تأثیر بگذارد. به حداکثر رساندن پنجره مرورگر بلافاصله پس از بارگیری URL تست، ضبط تصویر از کل صفحه وب را تضمین میکند.
این یکی از بهترین اقدامات سلنیوم است که صرف نظر از مرورگری که اتوماسیون تست سلنیومی برای آن انجام میشود، باید صورت گیرد.
برای این کار میتوانید از سلسه مراتب متدهای manage().window().maximize()با آغاز از کلاس WebDriver استفاده نمایید.
و این مقاله ان شا ا… ادامه خواهد داشت…