在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

我叫 Dmitry,在一家公司擔任測試員 梅爾科學。 最近,我完成了一個相對較新的功能的處理 Firebase 測試實驗室 - 即,使用本機測試框架 XCUITest 對 iOS 應用程序進行儀器測試。

在此之前,我已經嘗試過適用於 Android 的 Firebase Test Lab,並且我真的很喜歡一切,因此我決定嘗試將項目的 iOS 測試基礎設施放在同一軌道上。 我必須在谷歌上進行大量搜索,但並不是所有的事情第一次都能解決,所以我決定為那些仍然需要這樣做的人寫一篇教程文章。

因此,如果您在 iOS 項目上進行了 UI 測試,那麼您現在就可以嘗試在由 Good Corporation 善意提供的真實設備上運行它們。 有興趣-歡迎下貓。

在故事中,我決定構建一些源數據 - GitHub 上的私有存儲庫和 CircleCI 構建系統。 應用程序名稱為 AmazingApp,bundleID 為 com.company.amazingapp。 我立即引用這些數據,以減少後續的混亂。

如果您在項目中以不同的方式實施了某些解決方案,請在評論中分享您的經驗。

1. 測試本身

為 UI 測試創建一個新的項目分支:

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

讓我們在 XCode 中打開該項目,並創建一個包含 UI 測試的新 Target [XCode -> File -> New -> Target -> iOS Testing Bundle],為其指定名稱 AmazingAppUITests。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

轉到創建的目標的構建階段部分,並在編譯源 - AmazingAppUITests.swift 中檢查目標依賴項 - AmazingApp。

將各種構建選項分成單獨的方案是一種很好的做法。 我們為 UI 測試創建一個方案 [XCode -> 產品 -> 方案 -> 新方案] 並為其指定相同的名稱:AmazingAppUITests。

創建的方案的構建應包括主應用程序的目標 - AmazingApp 和 Target UI 測試 - AmazingAppUITests - 請參閱屏幕截圖

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

接下來,我們為 UI 測試創建一個新的構建配置。 在 Xcode 中,單擊項目文件,轉到“信息”部分。 單擊“+”並創建一個新配置,例如 XCtest。 我們將來會需要這個,以避免在代碼簽名時手鼓跳舞。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

您的項目至少有三個目標:主應用程序、單元測試(有一些,對吧?)以及我們創建的測試的目標 UI。

轉到 Target AmazingApp、“構建設置”選項卡、“代碼簽名身份”部分。 對於 XCtest 配置,選擇 iOS Developer。 在“代碼簽名樣式”部分中,選擇“手動”。 我們尚未生成配置文件,但稍後我們肯定會返回它。

對於目標 AmazingAppUITests,我們執行相同的操作,但在“產品包標識符”列中輸入 com.company.amazingappuitests。

2. 在 Apple Developer Program 中設置項目

我們轉到 Apple Developer Program 頁面,轉到“Certificates, Identifiers & Profiles”部分,然後轉到“Identifiers”項的“App IDs”列。 創建一個名為 AmazingAppUITests 的新 App ID,bundleID 為 com.company.amazingappuitests。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

現在我們有機會使用單獨的證書籤署我們的測試,但是......測試的構建過程涉及構建應用程序本身和構建測試運行程序。 因此,我們面臨著使用一個配置文件簽署兩個捆綁 ID 的問題。 幸運的是,有一個簡單而優雅的解決方案——Wildcard App ID。 我們重複創建新應用程序 ID 的過程,但不選擇顯式應用程序 ID,而是選擇通配符應用程序 ID,如屏幕截圖所示。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

至此,我們已經完成了developer.apple.com,但我們不會最小化瀏覽器窗口。 讓我們去 包含 Fastlane 文檔的網站 並從頭到尾閱讀 Match 實用程序。

細心的讀者已經註意到,為了使用這個實用程序,我們需要一個私有存儲庫和一個可以訪問 Apple Developer Program 和 Github 的帳戶。 我們創建(如果突然沒有這樣的東西)表單的帳戶 [電子郵件保護],設置一個強密碼,在developer.apple.com 上註冊,並指定其為項目管理員。 接下來,為您的帳戶授予對公司 github 存儲庫的訪問權限,並創建一個名為 AmazingAppMatch 之類的新私有存儲庫。

3. 設置 Fastlane 和匹配實用程序

打開終端,轉到包含項目的文件夾並初始化 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

接下來,輸入請求的數據 - 存儲庫、帳戶、密碼等。

重要事項: 第一次運行匹配實用程序時,它會要求您輸入密碼來解密存儲庫。 保存這個密碼非常重要,我們在設置 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,我們就以這種方式填寫。

但是,正如我們所記得的,我們創建了一個特殊的通配符 ID 來簽署測試版本。 因此,打開 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.* 類型所需的配置文件,必須在 AmazingApp 和 AmazingAppUITests 目標的配置配置文件部分中指定該配置文件。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

仍然需要添加通道來構建測試。 讓我們去 存儲庫 fastlane 插件項目可以輕鬆設置導出到 Firebase 測試實驗室並按照說明進行操作。

從原始示例中復制粘貼,以便我們的車道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

有關在 CircleCI 中設置 fastlane 的完整信息,我建議閱讀官方文檔 時間 .

不要忘記向我們的 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。 絕對沒有根本的區別,因為為了測試的需要,我們可以創建一個單獨的項目並免費使用一年(很酷,是吧?)

我們登錄到我們的基礎設施帳戶(或任何其他帳戶,這並不重要),然後轉到 Firebase 控制台頁面。 創建一個名為 AmazingAppUITests 的新項目。

重要事項: 在上一步中,在通道 firebase_test_lab_ios_xctest 的 Fastfile 中,gcp_project 參數必須與項目名稱匹配。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

默認設置就很適合我們。

我們不關閉選項卡,我們在同一帳戶下註冊 云云 這是一項必要措施,因為與 Firebase 的通信是使用 gcloud 控制台界面進行的。

Google 每年贈送 300 美元,在執行自動測試的情況下相當於免費使用該服務一年。 我們輸入付款數據,等待 1 美元的測試沖銷,然後將 300 美元存入帳戶。 一年後,該項目將自動轉為免關稅計劃,因此您不必擔心可能出現的資金損失。

讓我們返回到 Firebase 項目選項卡並將其轉移到 Blaze 關稅計劃 - 現在,如果超出限制,我們需要支付一些費用。

在 gcloud 界面中,選擇我們的 Firebase 項目,選擇“Catalogue”主菜單項並添加 Cloud Test API 和 Cloud Tools Result API。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

然後轉到菜單項“IAM 和管理”-> 服務帳戶-> 創建服務帳戶。 授予編輯項目的權限。

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

創建 JSON 格式的 API 密鑰

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目

稍後我們將需要下載的 JSON,但現在我們將認為測試實驗室設置已完成。

5. 設置CircleCI

一個合理的問題正在醞釀之中——如何處理密碼? 為了安全地保護我們的密碼和其他敏感數據,構建機器的環境變量機制將幫助我們。 在 CircleCI 項目設置中,選擇環境變量

在 Firebase 測試實驗室中運行儀器測試。 第 1 部分:iOS 項目
並設置以下變量:

  • 鍵:GOOGLE_APPLICATION_CREDENTIALS
    value:gcloud 服務帳號密鑰 json 文件的內容
  • 鍵:MATCH_PASSWORD
    value:使用證書解密 github 存儲庫的密碼
  • 鍵:FASTLANE_PASSWORD
    value:Apple Developer Portal 基礎設施帳戶密碼

我們保存更改,創建 PR 並將其發送給我們的團隊負責人進行審核。

結果

通過這些簡單的操作,我們獲得了一個良好、穩定的工作支架,並且能夠在測試時在設備屏幕上錄製視頻。 在測試用例中,我指定了 iPhone X 設備型號,但農場提供了不同型號和 iOS 版本組合的豐富選擇。

第二部分將致力於逐步為 Android 項目建立 Firebase 測試實驗室。

來源: www.habr.com

添加評論