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

图片

我叫Dmitry,我是MEL Science的测试人员。 最近,我结束了Firebase测试实验室的一项相对较新的功能-即使用本机XCUITest测试框架对iOS应用程序进行了仪器测试。

在此之前,我已经尝试过Android的Firebase测试实验室,而且我真的很喜欢所有内容,因此我决定尝试将iOS项目的测试基础架构放在同一个轨道上。 我不得不在Google上搜索很多内容,但并不是所有的功能都在第一次使用时就正确了,所以我决定为仍然需要的人写一篇教程文章。

因此,如果您在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测试[XCode-> File-> New-> Target-> iOS Testing Bundle]创建一个新的Target,并为其命名为AmazingAppUITests。

图片

转到创建的目标的“构建阶段”部分,并在“编译源”-“ AmazingAppUITests.swift”中检查是否存在目标依赖项-AmazingApp。

好的做法是将各种组装选项隔离到单独的方案中。 我们为UI测试创建一个方案[XCode-> Product-> Scheme-> New Scheme],并将其命名为:AmazingAppUITests。

构建创建的方案应包括主应用程序的目标-AmazingApp和目标UI测试-AmazingAppUITests-请参见屏幕截图

图片

接下来,为UI测试创建一个新的构建配置。 在Xcode中,单击项目文件,然后转到“信息”部分。 单击“ +”并创建一个新配置,例如XCtest。 将来我们将需要此代码,以避免在代码签名时与铃鼓共舞。

图片

您的项目至少具有三个Target:主应用程序,单元测试(因为它们是对的?)以及我们创建的Target UI测试。

转到Target AmazingApp,“构建设置”选项卡,“代码签名身份”部分。 要配置XCtest,请选择iOS Developer。 在“代码签名样式”部分中,选择“手动”。 我们尚未生成Provisioning配置文件,但是稍后,我们一定会返回它。

对于Target AmazingAppUITests,我们执行相同的操作,但是在“产品捆绑包标识符”列中,输入com.company.amazingappuitests。

2.在Apple Developer Program中设置一个项目


我们转到“ Apple开发人员计划”页面,转到“证书,标识符和配置文件”部分,然后转到“标识符”项的“应用程序ID”列。 创建一个名为AmazingAppUITests和bundleID com.company.amazingappuitests的新应用程序ID。

图片

现在,我们有机会使用单独的证书对测试进行签名,但是……测试的构建过程包括构建应用程序本身和构建测试运行器。 因此,我们面临着用一个供应配置文件签署两个捆绑ID的问题。 幸运的是,有一个简单而优雅的解决方案-通配符应用程序ID。 我们重复创建新应用ID的过程,但是请选择“通配符应用ID”,而不是显式应用ID,如屏幕截图所示。

图片

至此,我们已经完成了与developer.apple.com的合作,但不会最小化浏览器窗口。 我们使用有关Fastlane的文档访问该站点,并从头到尾了解了Match实用程序。

细心的读者注意到,要使用此实用程序,我们将需要一个私有存储库和一个同时可以访问Apple Developer Program和Github的帐户。 我们创建(如果不是突然的话)形式为InfrastructureAccount@your.company.domain的帐户,提供一个功能强大的密码,在developer.apple.com中注册该帐户,并指定其为项目管理员。 接下来,给您的帐户访问公司的github存储库的权限,并使用AmazingAppMatch之类的名称创建一个新的私有存储库。

3.配置Fastlane和match实用程序


打开终端,转到项目文件夹,然后按照官方手册中的指示初始化fastlane。 输入命令后

 $ fastlane init 

系统将提示您选择可用的使用配置。 我们选择第四项-手动项目设置。

图片

项目中出现了一个新的fastlane目录,其中有两个文件-Appfile和Fastfile。 简而言之-在Appfile中,我们存储服务数据,而在Fastfile中,我们使用称为通道的Fastlane术语编写作业。 我建议阅读官方文档:

在您喜欢的文本编辑器中打开Appfile,并将其转换为以下格式:

 app_identifier "com.company.amazingapp" # Bundle ID apple_dev_portal_id "infrastructureaccount@your.company.domain" #   ,     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("infrastructureaccount@your.company.domain") # 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目标指定。

图片

仍然需要添加通道来构建测试。 我们转到用于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控制台页面 。 创建一个名为AmazingAppUITests的新项目。

重要提示:在泳道firebase_test_lab_ios_xctest中Fastfile中的上一步中,gcp_project参数必须与项目名称匹配。

图片

默认设置对我们来说很好。

我们不会关闭标签页,而是使用我们在Gcloud中注册的帐户来关闭 -这是一项必要措施,因为与Firebase的通信是使用gcloud控制台界面进行的。

Google每年提供$ 300,在进行自动测试的情况下,相当于一年免费使用该服务。 我们输入付款数据,等待$ 1的测试费用,并在帐户中获得$ 300。 一年后,该项目将自动转移到免费的资费计划中,因此您不必担心可能会损失金钱。

让我们回到Firebase项目的标签,并将其转移到Blaze关税计划-现在,如果超出限制,我们需要支付一些费用。

在gcloud界面中,选择我们的Firebase项目,选择“目录”主菜单项,然后添加Cloud Testing API和Cloud Tools Result API。

图片

然后转到菜单项“ IAM和管理”->服务帐户->创建服务帐户。 我们有权编辑该项目。

图片

创建JSON格式的API密钥

图片

稍后我们将需要下载的JSON,但是现在,我们将考虑完成Test Lab的设置。

5.配置CircleCI


一个合理的问题正在酝酿中-使用密码怎么办? 可靠地保存我们的密码和其他敏感数据将有助于我们建立机器环境变量的机制。 在CircleCI项目的设置中,选择环境变量

图片
并启动以下变量:

  • 密钥:GOOGLE_APPLICATION_CREDENTIALS
    值:gcloud服务帐户密钥文件json
  • 密钥:MATCH_PASSWORD
    值:用于使用证书解密github存储库的密码
  • 密钥:FASTLANE_PASSWORD
    值:Apple Developer Portal基础结构帐户密码

我们保存更改,创建PR,并将其发送给我们的团队负责人进行审查。

总结


通过执行这些简单的操作,我们获得了一个良好而稳定的工作台,能够在测试时将视频记录在设备的屏幕上。 在一个测试案例中,我指定了iPhone X设备型号,但是服务器场提供了多种不同型号和iOS版本的组合的选择。

第二部分将专门介绍针对Android项目的Firebase测试实验室的分步配置。

Source: https://habr.com/ru/post/zh-CN451786/


All Articles