توجه: تمام وقتهای استفاده شده در این مقاله به وقت سنگاپور بهوقت معمولی UTC+8 است، مگر غیر مصرح آن.
پسزمینه
زمانی که در آوریل 2022 به Xcode 13.1 ارتقا دادیم، چند مشکل مانند ناپایداری تستهای CI و مشکلات دیگر مرتبط با انتقال به Xcode 13.1 مشاهده کردیم.
بعد از دیدن این مسئله، با ادغام برخی ابزارهای مشاهدهپذیری به فرآیند توسعه iOS CI خود، به بررسی این مشکل پرداختیم. این کار به ما چشماندازی جامع از کل فرآیند، از آغاز تا انتهای کار UITest، ارائه داد. در این مقاله، تغییراتی را که ایجاد کردیم، بینشهایی که به دست آوردیم و تأثیر این تغییرات روی کلیت فرآیند و استفاده از منابع را با شما به اشتراک میگذاریم.
راهحل
در بخشهای زیر، مراحل مختلفی که برای بررسی مشکلات مانند تستهای ناپایدار CI و استفاده بالای CPU انجام دادیم و تغییراتی که در زیرساخت iOS CI خود ایجاد کردیم را توضیح میدهیم.
تجزیه و تحلیل استفاده از CPU Xcode 13.1
به عنوان یک توسعهدهنده iOS، به اطمینان از آن دارید که با مشکلات مصرف CPU مرتبط با فرآیند Spotlight در Xcode 13.1 هم از پیش رخ دادید که در Xcode 13.2 رفع شده است. پس از بررسی، مشخص شد که مشکلات مصرف CPU یکی از عوامل اصلی ناپایداری UITest است و باید به طور فوری آن را رفع کنیم. ما تصمیم گرفتیم منتظر بروزرسانی اپل نباشیم زیرا یک دوره دیگر از مهاجرت وقت بر خواهد داشت.
قبل از شروع UITest، spotlight.app را به یک پوشه جدید منتقل کردیم. وقتی تست کامل شد، برنامه را به مکان اصلی خود بازگرداندیم. این عمل باعث کاهش قابل توجهی در استفاده از CPU شده و بیش از 50٪ کاهش یافت.
این بخش به شما کمک میکند که چگونگی تأثیر نسخههای مختلف Xcode بر استفاده از CPU را بهتر ببینید.
حذف وابستگی Safari iOS در زمان تست deep link
به عنوان یک سوپر اَپ، تعداد زیادی حالت وجود دارد که باید قبل از انتشار یک ویژگی در محیط تولید بهتستهای کاملی آنها نیاز است. یکی از این تستها تست deep link است.
بیش از 10٪ از کل تستها تستهای deep link هستند. بهطور معمول، پیشنهاد میشود وابستگیها را در طول تست مجازی سازی کنید تا اطمینان حاصل شود که تست به سرعت و به صورت قابل اعتماد اجرا میشود. اما این یک وابستگی دیگر بر IOS Safari ایجاد میکند.
به همین دلیل، یک مرورگر وهمتراز داخل UITest ایجاد کردیم. URL مربوط به مرورگر وهمتراز را به عنوان آرگومان راهاندازی استفاده کردیم و سپس همان URL را به عقب فراخوانی کردیم. این روش منجر به کاهش 20٪ در زمان CI شد و تستها پایدارتر شدند.
با مجوز شبیهساز iOS راهاندازی کنید
همیشه ایدهی خوبی است قبل از اجرای UITest شبیهساز را ریست کنید تا پیشتنظیمات یا دادههای شبیهسازی شده از تست دیگری باقی نماند. علاوه بر این، استفاده از هریک از خدمات شبیهساز (مکان، ATT، مخاطبین، و غیره) باعث میشود شبیهساز برای درخواست مجوز از شما کند شود. ما از UIInterruptionHandler (یک بلاک کنترلی برای مدیریت الرتها و دیالوگهای دیگر) برای مدیریت نافذههای نمایشی غیرهمزمان در طول تست استفاده کردیم.
ما میخواستیم زمان اجرای تستها را کاهش دهیم که میدانستیم شامل مجوزهای بسیاری است. بنابراین، به منظور سرعت بخشیدن به اجرا، شبیهساز را با مجوزها راهاندازی کردیم. این باعث میشود که نیازی به مجوزها در طول UITest وجود نداشته باشد که عملکرد را به 5٪ افزایش میدهد.
مانیتور ترافیک HTTP در طول UITest
در هنگام نوشتن تستها، مهم است که همه منابع را مجازیسازی کنیم تا بتوانیم بر روی کدی که تست میشود تمرکز کنیم و نه بر روی تعامل یا پاسخ دادن وابستگیهای خارجی. با این حال، با تیم بزرگی که به صورت همزمان کار میکند، ممکن است اطمینان حاصل شود که در واقع هیچ چیز از اینترنت دانلود نشود.
توسعهدهندگان اغلب تغییراتی در کد ایجاد میکنند و UITestها جهت اطمینان حاصل شدن از اینکه این تغییرات تأثیری منفی بر روی عملکرد فعلی ندارند، انجام میشوند. توصیه میشود که در زمان نوشتن تستها، تمام وابستگیها را مجازیسازی کنیم تا همه رفتارهای ممکن را شبیهسازی کنیم. ما متوجه شدیم که تعداد قابل توجهی منابع در هر بار اجرای تست دانلود میشوند که بسیار ناکارامد است.
با استفاده از ابزار سفارشی خود برای تجزیه و تحلیل ترافیک شبکه، ما مطمئن شدیم که هیچ منبعی در طول تست دانلود نمیشود. به جای آن، نیاز به وابستگیهای مجازی داشتیم که زمان تست را کاهش داد و پایداری را بهبود بخشید.
با استفاده از ابزار سفارشی خود برای تحلیل ترافیک شبکه، ما تضمین کردیم که در طول تست هیچ منبعی از اینترنت دانلود نمیشود. به جای آن، بر اساس وابستگیهای مجازی اعتماد کردیم که منجر به کاهش زمان تست و افزایش پایداری شد.
تجزیه و تحلیل اجراگر بار GitLab
در Grab، چندین تیم توسعهدهنده وجود دارد که برنامهریزی را انجام میدهند، تغییرات کد را اعمال میکنند و درخواستهای ادغام (MR) را روزانه بررسی میکنند. برای اطمینان حاصل شود که تغییرات جدید با کد موجود در تداخل نیستند، این MRها با CI یکپارچه میشوند.
علاوه بر این، به منظور مدیریت تعداد MRها، لیست خوشههایی که تستهای اجراگر را به صورت همزمان اجرا میکنند را حفظ میکنیم تا منابع موثرتر و عملکرد بهتری بیابیم. ما به طور مکرر این تستها را اجرا میکنیم تا تعداد پردازندههای موازی مورد نیاز برای نتایج پایدار را تعیین کنیم.
####برگرداندن پاسخ HTTP به سرور تقلبی محلی
ما یک ابزار داریم که برای متقلب کردن درخواستهای API استفاده میکنیم و که بهبودی دریافت کرده است تا بتواند پاسخهای HTML را نیز پشتیبانی کند. این باعث افزایش دامنه تست و اطمینانحاصل میشود که توالی پاسخهای HTML صحیح کار کند.
استفاده از دستورات انتظار صریح
در هنگام اجرای چندین تست، مشکلات زمانی ناگزیر است و باعث میشوند تستها بطور گاهوبیشتر عبور یا شکست بیفتند. برای کاهش این مشکل، بیشتر توسعهدهندگان ترجیح میدهند دستور sleep را اضافه کنند تا وقتی که عنصر به طور صحیح رندر میشود قبل از اعتبارسنجیاش وقت داشته باشد - اما این عمل اجرا را کند میکند. به منظور بهبود اجرای CI، پیوندی را ارائه دادیم که به ما امکان میدهد استفاده از تابع sleep را دنبال کنیم و به توسعهدهندگان پیشنهاد دهیم که در تستهای UI از waitForExistencewrapperc استفاده کنند.
ردیابی هر حالت شکست
در کدهای بزرگ، به شدت رایج است که خاموشی در UITestها مشاهده شود، به طوری که تستها گاهی به لطف تغییراتی از قبیل تغییرات در شبکه در حالت گذشته و ارزیابی شکست مواجه میشوند. این بدین معنی است که نتایج تست ممکن است ناسازگار باشند و در برخی موارد، نادرست باشد. تست نادرست میتواند خستهکننده و متفاوت باشد. این به دلیل این است که مهندسان باید ساخت برای تمامی آزمونها را بهطور کامل مجدداً راهاندازی کنند که زمان بیشتری میگیرد.
ادامه مطلب/نتیجهگیری
سفر ما برای بهبود زیرساخت iOS CI هنوز ادامه دارد، اما از این تجربه چند چیز یاد گرفتیم:
تمرکز بر ویژگی مورد آزمایش با اطمینان حاصل شده از تمام پاسخهای خارجی به عنوان تستهای مجازی. درجهی از عدم قطعیت در تست مورد انتظار است، اما شما باید گذشتههای قبلی را نظارت کنید. اگر قطعیت افزایش یابد، احتمالاً مشکلی عمیقتر در کدتان وجود دارد.به طور مداوم به مصرف منابع و عملکرد دستگاه نظارت کنید - تشخیص یک افزایش ناگهانی به معنی صرفهجویی در زمان و پول است.
- تمرکز بر ویژگی مورد آزمایش با اطمینان حاصل شده از تمام پاسخهای خارجی به عنوان تستهای مجازی.
مجله زیبایی و درمانی آذروت، بزرگترین پلتفرم سوپر اَپ در جنوب شرق آسیا است که خدمات همهروزه مهمی را برای مصرفکنندگان ارائه میدهد. بیشتر از یک اَپ سفر و سرویس ارسال غذا است، مجله زیبایی و درمانی آذروت خدمات گستردهای را در منطقه پوشش میدهد، از جمله خدمات مربوط به حرکتیت، غذا، ارسال بسته و خرید مواد غذایی، پرداختهای موبایلی و خدمات مالی در 428 شهر در هشت کشور.
با تکنولوژی تامین میشود و به وسیله عشق و علاقه، ماموریت ما این است که جنوب شرق آسیا را به جلو ببریم و توانمندیهای اقتصادی برای همه ایجاد کنیم. اگر این ماموریت با شما صحبت میکند، امروز به تیم ما بپیوندید!
به توسط تکنولوژی قدرت داده شده و با عشق سواریکنده، ماموریت ما ایجاد توانمندیهای اقتصادی برای همه باعث پیشرفت جنوب شرق آسیا است. اگر این ماموریت با شما صحبت میکند، امروز به تیم ما بپیوندید!