在 Firebase 测试实验室中运行仪器测试。 第 1 部分:iOS 项目

在 Firebase 测试实验室中运行仪器测试。 第 1 部分:iOS 项目

我叫 Dmitry,在一家公司担任测试员 梅尔科学。 最近,我完成了一个相对较新的功能的处理 火力基地测试实验室 - 即,使用本机测试框架 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 测试实验室。

来源: habr.com

添加评论