چکیده: Test Flakiness، تستی است که به صورت دورهای بدون هیچ گونه تغییری در کد خود گاهی Pass شده و گاهی نیز Fail میشود. تستهای فلِیکینِس قطعاً آزاردهنده هستند، اما ممکن است بسیار پرهزینه نیز باشند، زیرا اغلب آنها به مهندسین نیاز دارند تا کل ساختارهای CI را دوباره جمع کنند و غالباً وقت زیادی را در انتظار Buildهای جدید، برای یک موفقیت کامل تلف میکنند.
فلِیکینِس در تست چیست؟
Test Flakiness، تستیست که به صورت دورهای بدون هیچ گونه تغییری در کد خود گاهی Pass شده و گاهی نیز Fail میشود. تستهای فلِیکینِس قطعاً آزاردهنده هستند، اما ممکن است بسیار پرهزینه نیز باشند، زیرا اغلب آنها به مهندسین نیاز دارند تا کل ساختارهای CI را دوباره جمع کنند و غالباً وقت زیادی را در انتظار Buildهای جدید، برای یک موفقیت کامل تلف میکنند.
اما هزینه واقعی فلِیکینِس در تست، عدم اطمینان به تستهای تولید شده شماست. اگر به تستهای خود اطمینان ندارید، در وضعیت بهتری نسبت به تیمی که هیچ تستی ندارد، نیستید. تستهای فلِیکینِس به طور قابل توجهی بر توانایی شما برای تحویل مداوم به صورت مطمئن تأثیر میگذارند.
علل فلِیکینِس
دلایل زیادی برای پوسته پوسته شدن وجود دارد. اما در این میان، موارد ذیل را علل برجسته و اصلی میدانم:
- زمان Assertion نامناسب: وقتی State یا وضعیت اپلیکیشن شما بین دورههای تست با ثبات نباشد، متوجه میشوید که عبارات Assertion که مسئول مقایسه نتیجه واقعی تست با نتیجه مورد انتظار هستند، به طور تصادفی Fail میشوند. راهحل این امر ساخت تستهاییست که تا قبل از Assertion صبر کنند، تا برنامه در یک وضعیت با ثبات قرار بگیرد. من در مورد عبارات Wait در اسکریپت نویسی صحبت نمیکنم، بلکه صحبتی کلی تر مد نظر من است. شما باید Assertion را در زمان مناسب انجام دهید، و برای این کار نیازمند بررسی وضعیت برنامه از جهات مختلف هستید، تا به محض قرار گرفتن در برنامه در State مناسب عملیات Assertion را انجام دهید. به عنوان نمونه، تا زمانیکه منابع مورد نیاز برای اجرای صحیح تست در دسترس قرار نگرفته است(اعم از شبکه، DB، خود Test Object و …)، اجرای تست متوقف بماند، و یا از روی آن Skip شود.
- تکیه بر ترتیب اجرا در تست: “تست ترتیبی” یکی دیگر از مقصرین اصلی در Flakiness است که باعث میشود تستها به سایر تستهای موجود در سوییت وابسته شده و متکی شوند. اگر میبینید که نمیتوانید یک تست را به صورت جداگانه اجرا کنید و فقط وقتی کل سوییت(مجموعهای از Test Procedureها یا به زبان سادهتر مجموعهای از Test Caseها) اجرا شود امکان Pass شدن تست وجود دارد، حتما با مشکل “تست ترتیبی” مواجه هستید. البته دقت داشته باشید که Test Caseها یا Test Procedureهای موجود در یک سوییت میتوانند هیچ وابستگی اجرایی با هم نداشته باشند. فلذا راهکار غلبه بر این مشکل این است که برای اجرای هر Test Case در سوییت خود محیط را پیکربندی و آماده کنید، تا بدین ترتیب نیاز نباشد یک Test Case دادههای مورد نیاز Test Case بعدی را آماده نماید، و بدین ترتیب نیاز به “تست ترتیبی” کاهش یابد.
- تستهای End to End یا سراسری: تستهای End to End ذاتاً Flakiness هستند. سعی کنید تعداد کمی از آنها را ایجاد کرده و بنویسید. به جای داشتن ۵۰۰ تست End to End برای سازمان خود، ۵ تست در این زمینه داشته باشید.
اینها راهکارهایی ساده برای در امان ماندن از شر Flakiness در تست بود. هر چند نمیتوان از آن به طور کامل اجتناب کرد.
راهکارهای شناسایی Test Flakiness
اما شناسایی Test Flakiness چه دردی را دوا میکند؟
در ابتدا هم عرض کردیم، که Test Flakiness باعث بی اعتمادی به نتایج تست خواهد شد. بنابراین باید سعی کنید فلِیکینِسها را تعیین تکلیف کرده و مشخص کنید که نتیجه تست، واقعا کدامیک از حالات Pass یا Fail است.
بدیهیست که Test Flakiness زمانی خود را نشان میدهد، که تست شما چندین بار اجرا شود. معمولا تعدد اجرا و شناسایی Test Flakiness زمانی رخ میدهد، که یک Test Case منفرد و یا موجود در سوییت برای اولین بار Fail شود، و به این ترتیب توجه تستر را به خود جلب نماید. و با اجراهای بعدی تستر متوجه یک آهنگ منظم یا نامنظم از بروز Pass/Fail در اجرای تست شود. اما اگر اجرای تست با Pass شدن آن در اولین اجرا همراه شود، معمولا تستر به سراغ اجرای مجدد تست نخواهد رفت، و به همین دلیل احتمال رویت Test Flakiness[البته در صورت وجود] بسیار کم خواهد شد.
به هر حال تسترها به دلایل مختلف تستها را و در مرتبهای بالاتر سوییتها را، بارها و بارها اجرا میکنند. یکی از بهترین راهکارهای شناسایی Test Flakiness، بررسی Test Log است. این بررسی به سادگی Failingهای بی دلیل یک Test Case(که در بخشهای دیگر Test Log، پاس شدن آن ثبت شده است) را و مدت زمان اجرا یا انتظار برای اجرا را نشان میدهد. اگر بتوانید مجموعه Test Logهای موجود را در یک نمای گرافیکی گردآوری کنید، میتواند به سادگی Test Flakiness را شناسایی کنید.