شاپیفای پایداری تستهای E2E موبایلش رو به ۹۸٪ رسوند
خلاصهٔ کاملتر
تیم شاپیفای میگه تستهای end-to-end موبایل اپلیکیشن اصلیشون اونقدر flaky (بیثبات) شده بودن که PRهای درست رو بیشتر از PRهای خراب رد میکردن، و در نهایت مجبور شدن کلاً این تستها رو از بلاک کردن CI بردارن. مشکل اصلی framework قدیمی بود که روی Appium و WebdriverIO با React Native Test ID کار میکرد؛ چون محدودیتی برای الگوهای درست تست وجود نداشت، توسعهدهندهها راحت pause(1000) میذاشتن که لوکال جواب میداد ولی تو CI شکست میخورد.
به گفتهٔ نویسنده، بهجای پچ کردن Appium، یه لایهٔ opinionated روش ساختن: یه builder-style API که نوشتن تست flaky رو سخت میکنه. هر قدم (تپ کردن، تایپ، ویت کردن) باید یه assertion داشته باشه، یعنی اگه صفحه به وضعیت مورد انتظار نرسه، تست دقیقاً همونجا شکست میخوره نه چند قدم بعد. توابع خطرناک هم با پیشوند UNSAFE_ علامتگذاری شدن تا کسی راحت ازشون استفاده نکنه.
بخش مهمتر ماجرا اینه که بهجای Test ID از بینایی ماشین استفاده میکنن: PaddleOCR متن رو تشخیص میده و OpenCV آیکونها رو با SVGهای طراحی Polaris مچ میکنه، دقیقاً شبیه اینکه یه merchant دنبال دکمهٔ Save بگرده. Test ID فقط بهعنوان fallback و اختیاری (با UNSAFE_testID) باقی مونده. این تغییر نوشتن تست رو هم برای آدمها هم برای ایجنتهای هوش مصنوعی خیلی سریعتر کرده، چون فقط کافیه چیزی که روی صفحه میبینی رو تو کد بنویسی.
نتیجهٔ این بازسازی، رسیدن پایداری تستها از ۵۰ درصد به ۹۸ درصد بوده. هر اجرا یه ویدیوی annotated تولید میکنه که نشون میده هر قدم دنبال چی میگشته و چی پیدا کرده، برای همین دیباگ کردن شکستها خیلی سریعتر شده. یه gate هم قبل از merge شدن تستهای جدید گذاشتن که چند بار تست رو اجرا میکنه و اگه ناپایدار بود ردش میکنه.
نکات کلیدی:
- پایداری تستهای E2E موبایل شاپیفای از ۵۰٪ به ۹۸٪ رسیده
- تشخیص المانها الان با PaddleOCR (متن) و OpenCV (آیکون) انجام میشه، نه با Test ID
- Test ID فقط بهصورت fallback با فیلد UNSAFE_testID در دسترسه
- هر قدم تست باید یه assertion داشته باشه تا شکست دقیقاً سر جای واقعی مشخص بشه
- ابزار runner با یه دستور هم روی شبیهساز لوکال و هم روی remote device farm اجرا میشه




