Chromium Chronicle #2: مبارزه با پوسته پوسته شدن تست

قسمت 2: توسط Vasilii در مونیخ (مه، 2019)
قسمت های قبلی

تست های پوسته پوسته شدن یک مشکل رایج در کروم است. آنها بر بهره وری توسعه دهندگان دیگر تأثیر می گذارند و به مرور زمان غیرفعال می شوند. تست های غیرفعال به معنای کاهش پوشش آزمون است.

مرحله تریاژ

صاحبان دایرکتوری ها مسئول رفع تست های پوسته پوسته آنها هستند. اگر اشکالی در مورد یک آزمایش پوسته پوسته دریافت کردید، چند دقیقه وقت بگذارید و در مورد مشکلی که روی باگ رخ داده است نظر دهید . اگر یک تست پوسته پوسته قدیمی دارید و مشخص نیست چه مشکلی رخ داده است، سعی کنید به سادگی تست را دوباره فعال کنید . اگر مشخصاً در مؤلفه دیگری مشکل دارد ، اشکال را در اسرع وقت مجدداً اختصاص دهید . صاحبان آن جزء باید قضاوت بهتری در مورد شکست داشته باشند،

مرحله اشکال زدایی

تعدادی از پرچم های خط فرمان برای رفع تست های پوسته پوسته مفید هستند. به عنوان مثال، --enable-pixel-output-in-tests رابط کاربری واقعی مرورگر را نمایش می دهد.

اگر دیباگر باعث از بین رفتن پوسته پوسته می شود ، ابزارهای بازگشتی داشته باشید . این امکان وجود دارد که تحت دیباگر، تست هرگز پوسته پوسته نشود. در آن صورت، عبارات log یا base::debug::StackTrace می تواند مفید باشد.

نکن

دلایل رایج شکست EXPECT__* علاوه بر اشکالات کد تولید را به خاطر داشته باشید:

  • انتظارات نادرست (مثلاً صفحه امن به معنای HTTPS است؛ به جای آن می تواند یک میزبان محلی باشد).
  • شرایط مسابقه به دلیل عدم انتظار آزمایش برای رویداد مناسب.

[پیاده سازی [نه پیاده سازی] بلکه رفتار را آزمایش نکنید.

// It takes 2 round trips between the UI and the background thread to complete.
SyncWithTheStore();
SyncWithTheStore();
CheckTheStore();

این دو رفت و برگشت ممکن است در آینده به سه مورد تغییر کند و باعث شود که آزمون پوسته پوسته شود. با این حال، فقط وضعیت فروشگاه مربوط است. در عوض، از یک ناظر برای فروشگاه استفاده کنید.

نکن

مراقب الگوهای رایج مانند موارد زیر باشید:

Submit TestPasswordForm();
// Wait until things settle down.
RunLoop().RunUntilIdle();
CheckCredentialPromptVisible();

قطعه ای مانند نمونه بالا از آزمایش مرورگر تقریباً مطمئناً نادرست است. رویدادهای زیادی وجود دارد که باید در فرآیندها و رشته‌های مختلف قبل از ظاهر شدن برخی از UI اتفاق بیفتد.

انجام دهید

موارد زیر یک اصلاح صحیح است:

SubmitTestPasswordForm();
WaitUntilCredentialPromptVisible();

با این فرض که WaitUntilCredentialPromptVisible() واقعا رابط کاربری را بررسی نمی کند، اصلاح بالا درست است. آزمایش‌های مرورگر نباید به رویدادهای رابط کاربری خارجی مانند «فوکوس از دست رفت» یا «پنجره پیش‌زمینه شد» بستگی داشته باشد . پیاده سازی را تصور کنید که در آن اعلان فقط زمانی ظاهر می شود که پنجره مرورگر فعال است. چنین اجرایی صحیح خواهد بود. با این حال، بررسی پنجره واقعی باعث می شود که تست پوسته پوسته شود.

مرحله پس از اصلاح

هنگامی که تست ثابت شد، آن را صدها بار به صورت محلی اجرا کنید. مراقب پورتال Flakiness باشید.