ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

نام من دیمیتری است، من به عنوان تستر در شرکت کار می کنم علوم MEL. اخیراً کار با یک ویژگی نسبتاً اخیر را به پایان رساندم آزمایشگاه تست Firebase - یعنی با آزمایش ابزاری برنامه های iOS با استفاده از چارچوب تست بومی XCUITest.

قبل از این، من قبلاً Firebase Test Lab را برای اندروید امتحان کرده بودم و واقعاً همه چیز را دوست داشتم، بنابراین تصمیم گرفتم سعی کنم زیرساخت آزمایش iOS پروژه را در همین راستا قرار دهم. من مجبور شدم خیلی در گوگل جستجو کنم و بار اول همه چیز درست نشد، بنابراین تصمیم گرفتم یک مقاله آموزشی برای کسانی که هنوز درگیر هستند بنویسم.

بنابراین، اگر آزمایش‌های رابط کاربری روی پروژه‌های iOS دارید، می‌توانید همین امروز آن‌ها را روی دستگاه‌های واقعی اجرا کنید، با مهربانی توسط Good Corporation ارائه شده است. برای علاقه مندان، به گربه خوش آمدید.

در داستان، تصمیم گرفتم بر روی برخی از داده های اولیه ایجاد کنم - یک مخزن خصوصی در GitHub و سیستم ساخت CircleCI. نام برنامه AmazingApp است، bundleID com.company.amazingapp است. من این داده ها را بلافاصله ارائه می کنم تا سردرگمی بعدی را کاهش دهم.

اگر راه حل های خاصی را در پروژه خود به طور متفاوت اجرا کردید، تجربه خود را در نظرات به اشتراک بگذارید.

1. خود آزمون ها

یک شاخه پروژه جدید برای تست های UI ایجاد کنید:

$ git checkout develop
$ git pull
$ git checkout -b “feature/add-ui-tests”

بیایید پروژه را در XCode باز کنیم و با تست های رابط کاربری [XCode -> File -> New -> Target -> iOS Testing Bundle] یک Target جدید ایجاد کنیم و نام واضح AmazingAppUITests را به آن بدهیم.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

به بخش Build Phases در Target ایجاد شده بروید و وجود Target Dependencies - AmazingApp را در Compile Sources - AmazingAppUITests.swift بررسی کنید.

یک تمرین خوب این است که گزینه های ساخت مختلف را به Schemes جداگانه جدا کنید. ما یک طرح برای تست‌های UI خود [XCode -> Product -> Scheme -> New Scheme] ایجاد می‌کنیم و به آن نام یکسان می‌دهیم: AmazingAppUITests.

ساخت طرح ایجاد شده باید شامل هدف برنامه اصلی باشد - AmazingApp و تست های رابط کاربر هدف - AmazingAppUITests - به اسکرین شات مراجعه کنید

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

در مرحله بعد، یک پیکربندی ساخت جدید برای تست های UI ایجاد می کنیم. در XCode روی فایل پروژه کلیک کنید و به قسمت Info بروید. روی "+" کلیک کنید و یک پیکربندی جدید، به عنوان مثال XCtest ایجاد کنید. ما در آینده به این نیاز خواهیم داشت تا از رقصیدن با تنبور در هنگام امضای کد جلوگیری کنیم.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

حداقل سه هدف در پروژه شما وجود دارد: برنامه اصلی، تست های واحد (در نهایت وجود دارند، درست است؟) و تست های Target UI که ما ایجاد کردیم.

به Target AmazingApp، تب تنظیمات ساخت، بخش Code Signing Identity بروید. برای پیکربندی XCtest، iOS Developer را انتخاب کنید. در قسمت Code Signing Style گزینه Manual را انتخاب کنید. ما هنوز یک نمایه تدارکاتی ایجاد نکرده ایم، اما مطمئناً کمی بعد به آن باز خواهیم گشت.

برای Target AmazingAppUITests ما همین کار را انجام می دهیم، اما در ستون Product Bundle Identifier وارد com.company.amazingappuitests می شویم.

2. راه اندازی یک پروژه در برنامه توسعه دهنده اپل

به صفحه برنامه برنامه‌نویس اپل می‌رویم، به بخش Certificates, Identifiers & Profiles و سپس به ستون App IDs آیتم Identifiers می‌رویم. یک شناسه برنامه جدید به نام AmazingAppUITests و bundleID com.company.amazingappuitests ایجاد کنید.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

اکنون ما این فرصت را داریم که تست های خود را با یک گواهی جداگانه امضا کنیم، اما ... روال مونتاژ یک بیلد برای آزمایش شامل مونتاژ خود برنامه و مونتاژ تست رانر است. بر این اساس، با مشکل امضای دو شناسه باندل با یک پروفایل تأمین مواجه هستیم. خوشبختانه، یک راه حل ساده و زیبا وجود دارد - Wildcard App ID. ما روند ایجاد یک App ID جدید را تکرار می کنیم، اما به جای Explicit App ID، Wildcard App ID را مانند تصویر انتخاب کنید.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

در این مرحله، کار با developer.apple.com تمام شده است، اما پنجره مرورگر را کوچک نمی کنیم. برویم به سایت مستندات Fastlane و در مورد ابزار Match از جلد تا جلد بخوانید.

یک خواننده با دقت متوجه شد که برای استفاده از این ابزار به یک مخزن خصوصی و یک حساب کاربری با دسترسی به برنامه توسعه دهنده اپل و Github نیاز داریم. ما یک حساب کاربری از فرم ایجاد می کنیم (اگر به طور ناگهانی چنین چیزی وجود نداشته باشد). [ایمیل محافظت شده]، یک رمز عبور قوی پیدا کنید، آن را در developer.apple.com ثبت کنید و آن را به عنوان مدیر پروژه منصوب کنید. در مرحله بعد، ما به حساب کاربری اجازه دسترسی به مخزن github شرکت شما را می دهیم و یک مخزن خصوصی جدید با نامی مانند AmazingAppMatch ایجاد می کنیم.

3. راه اندازی Fastlane و ابزار match

یک ترمینال را باز کنید، به پوشه پروژه بروید و fastlane را همانطور که در آن نشان داده شده است مقداردهی اولیه کنید دفترچه راهنمای رسمی. پس از وارد کردن دستور

$ fastlane init

از شما خواسته می شود که تنظیمات استفاده موجود را انتخاب کنید. گزینه چهارم - تنظیم دستی پروژه را انتخاب کنید.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

این پروژه دارای یک دایرکتوری جدید fastlane است که شامل دو فایل Appfile و Fastfile است. به طور خلاصه، ما داده های سرویس را در Appfile ذخیره می کنیم و کارهایی را در Fastfile می نویسیم که در اصطلاح Fastlane خطوط نامیده می شود. توصیه می کنم اسناد رسمی را بخوانید: زمان, два.

Appfile را در ویرایشگر متن دلخواه خود باز کرده و به فرم زیر بیاورید:

app_identifier "com.company.amazingapp"       # Bundle ID
apple_dev_portal_id "[email protected]"  # Созданный инфраструктурный аккаунт, имеющий право на редактирование iOS проекта в Apple Developer Program.
team_id "LSDY3IFJAY9" # Your Developer Portal Team ID

ما به ترمینال برمی گردیم و طبق دفترچه راهنمای رسمی شروع به پیکربندی مسابقه می کنیم.

$ fastlane match init
$ fastlane match development

بعد، داده های درخواستی - مخزن، حساب، رمز عبور و غیره را وارد کنید.

مهم: هنگامی که برای اولین بار برنامه match را راه اندازی می کنید، از شما خواسته می شود یک رمز عبور برای رمزگشایی مخزن وارد کنید. ذخیره این رمز عبور بسیار مهم است؛ هنگام راه اندازی سرور CI به آن نیاز خواهیم داشت!

یک فایل جدید در پوشه fastlane - Matchfile ظاهر شده است. آن را در ویرایشگر متن مورد علاقه خود باز کنید و به صورت زیر نمایش دهید:

git_url("https://github.com/YourCompany/AmazingAppMatch") #Созданный приватный репозиторий для хранения сертификатов и профайлов.
type("development") # The default type, can be: appstore, adhoc, enterprise or development
app_identifier("com.company.amazingapp")
username("[email protected]") # Your Infrastructure account Apple Developer Portal username

اگر بخواهیم در آینده از match برای امضای بیلدها برای نمایش در Crashlytics و/یا AppStore استفاده کنیم، دقیقاً به این صورت پر می کنیم، یعنی برای امضای ID بسته برنامه شما.

اما، همانطور که به یاد داریم، یک شناسه Wildcard ویژه برای امضای ساخت آزمایشی ایجاد کردیم. بنابراین، Fastfile را باز کنید و یک خط جدید وارد کنید:

lane :testing_build_for_firebase do

    match(
      type: "development",
      readonly: true,
      app_identifier: "com.company.*",
      git_branch: "uitests"  # создаем отдельный бранч для development сертификата для подписи тестовой сборки.
    )

end

ذخیره کنید و وارد ترمینال شوید

fastlane testing_build_for_firebase

و ما می بینیم که چگونه fastlane یک گواهی جدید ایجاد کرد و آن را در مخزن قرار داد. عالی!

XCode را باز کنید. اکنون مشخصات تدارکات لازم از فرم Match Development com.company.* را داریم که باید در قسمت Provisioning profile برای اهداف AmazingApp و AmazingAppUITests مشخص شود.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

باقی مانده است که برای آزمایشات مونتاژ خط اضافه شود. برویم به مخزن یک پروژه پلاگین برای fastlane که راه‌اندازی صادرات به Firebase Test Lab و پیروی از دستورالعمل‌ها را آسان‌تر می‌کند.

بیایید از نمونه اصلی کپی پیست کنیم تا lane testing_build_for_firebase ما به این شکل ختم شود:


 lane :testing_build_for_firebase do

    match(
      type: "development",
      readonly: true,
      app_identifier: "com.company.*",
      git_branch: "uitests"
    )

    scan(
      scheme: 'AmazingAppUITests',      # UI Test scheme
      clean: true,                        # Recommended: This would ensure the build would not include unnecessary files
      skip_detect_devices: true,          # Required
      build_for_testing: true,            # Required
      sdk: 'iphoneos',                    # Required
      should_zip_build_products: true,     # Must be true to set the correct format for Firebase Test Lab
    )

    firebase_test_lab_ios_xctest(
      gcp_project: 'AmazingAppUITests', # Your Google Cloud project name (к этой строчке вернемся позже)
      devices: [                          # Device(s) to run tests on
        {
          ios_model_id: 'iphonex',        # Device model ID, see gcloud command above
          ios_version_id: '12.0',         # iOS version ID, see gcloud command above
          locale: 'en_US',                # Optional: default to en_US if not set
          orientation: 'portrait'         # Optional: default to portrait if not set
        }
      ]
    )

  end

برای اطلاعات کامل در مورد راه اندازی fastlane در CircleCI، توصیه می کنم اسناد رسمی را مطالعه کنید بارها два.

فراموش نکنید که یک کار جدید به config.yml خود اضافه کنید:

build-for-firebase-test-lab:
   macos:
     xcode: "10.1.0"   
   working_directory: ~/project
   shell: /bin/bash --login -o pipefail
   steps:
     - checkout
     - attach_workspace:
         at: ~/project
     - run: sudo bundle install     # обновляем зависимости
     - run:
         name: install gcloud-sdk   # на mac машину необходимо установить gcloud
         command: |
           ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null ; brew install caskroom/cask/brew-cask 2> /dev/null
           brew cask install google-cloud-sdk
     - run:
         name: build app for testing
         command: fastlane testing_build_for_firebase  # запускаем lane сборки и отправки в firebase

4. در مورد نیمکت آزمون ما چطور؟ راه اندازی Firebase

بیایید به این موضوع بپردازیم که مقاله برای چه نوشته شده است.

شاید برنامه شما از Firebase در یک طرح رایگان یا شاید اصلا استفاده نمی کند. مطلقاً هیچ تفاوت اساسی وجود ندارد، زیرا برای نیازهای آزمایشی می توانیم یک پروژه جداگانه با یک سال استفاده رایگان ایجاد کنیم (باحال، درست است؟)

ما به حساب زیرساخت خود (یا هر چیز دیگر، مهم نیست) وارد می شویم و به آن می رویم صفحه کنسول Firebase. یک پروژه جدید به نام AmazingAppUITests ایجاد کنید.

مهم: در مرحله قبل در Fastfile in lane firebase_test_lab_ios_xctest پارامتر gcp_project باید با نام پروژه مطابقت داشته باشد.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

تنظیمات پیش فرض به خوبی برای ما مناسب است.

برگه را نبندید، در همان حساب ثبت نام کنید Gcloud - این یک اقدام ضروری است، زیرا ارتباط با Firebase با استفاده از رابط کنسول gcloud انجام می شود.

گوگل برای یک سال 300 دلار می دهد که در زمینه انجام تست های خودکار معادل یک سال استفاده رایگان از این سرویس است. اطلاعات پرداخت شما را وارد می کنیم، منتظر بدهی آزمایشی 1 دلار می شویم و 300 دلار به حساب شما دریافت می کنیم. پس از گذشت یک سال، پروژه به صورت خودکار به یک طرح تعرفه رایگان منتقل می شود، بنابراین نیازی به نگرانی در مورد ضرر احتمالی نیست.

بیایید به برگه پروژه Firebase برگردیم و آن را به طرح تعرفه Blaze منتقل کنیم - اکنون در صورت تجاوز از حد مجاز چیزی برای پرداخت داریم.

در رابط gcloud، پروژه Firebase ما را انتخاب کنید، آیتم منوی اصلی "Directory" را انتخاب کنید و Cloud Testing API و Cloud Tools Result API را اضافه کنید.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

سپس به آیتم منو "IAM and Administration" -> Service Accounts -> Create Service بروید. ما حقوق ویرایش پروژه را اعطا می کنیم.

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

یک کلید API با فرمت JSON ایجاد کنید

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS

کمی دیرتر به JSON دانلود شده نیاز خواهیم داشت، اما فعلاً راه اندازی Test Lab را کامل می دانیم.

5. راه اندازی CircleCI

یک سوال منطقی مطرح می شود - با رمزهای عبور چه باید کرد؟ مکانیسم متغیر محیطی دستگاه ساخت ما به ما کمک می کند تا رمز عبور و سایر داده های حساس خود را به صورت ایمن ذخیره کنیم. در تنظیمات پروژه CircleCI، Environment Variables را انتخاب کنید

ما تست های ابزاری را در آزمایشگاه تست Firebase اجرا می کنیم. قسمت 1: پروژه iOS
و متغیرهای زیر را تنظیم کنید:

  • کلید: GOOGLE_APPLICATION_CREDENTIALS
    مقدار: محتویات فایل json کلید حساب سرویس gcloud
  • کلید: MATCH_PASSWORD
    مقدار: رمز عبور برای رمزگشایی مخزن github با گواهی
  • کلید: FASTLANE_PASSWORD
    مقدار: رمز عبور حساب زیرساخت پورتال توسعه‌دهنده اپل

ما تغییرات را ذخیره می کنیم، یک PR ایجاد می کنیم و آن را برای بررسی به سرپرست تیم خود ارسال می کنیم.

نمایش نتایج: از

در نتیجه این دستکاری های ساده، یک پایه کار خوب و پایدار با قابلیت ضبط ویدیو بر روی صفحه نمایش دستگاه در زمان آزمایش دریافت کردیم. در مثال آزمایشی، من مدل دستگاه آیفون X را مشخص کردم، اما مزرعه انتخابی غنی از ترکیبی از مدل‌های مختلف و نسخه‌های iOS ارائه می‌کند.

بخش دوم به راه اندازی مرحله به مرحله Firebase Test Lab برای یک پروژه اندروید اختصاص خواهد داشت.

منبع: www.habr.com

اضافه کردن نظر