并行测试 UI 测试 Xcode

Parallel testing with UI Testing Xcode

我可以在同一个 mac 上打开多个模拟器,以便使用来自 Xcode 的 UI 测试进行并行测试吗?

2018 年 5 月更新:

Bluepill 允许将测试拆分到多个模拟器并支持 XCUITests:

we recently added support for Xcode UI Testing bundles. Thanks to the inspiration from FBSimulatorControl. Bluepill now supports Xcode unit test bundle and UI test bundles.


原回答:

目前似乎没有可行的解决方案。然而,有前途的工具正在到位。有一个名为 FBSimulatorControl and it's cli tool called fbsimctl 的框架,它允许您一次启动多个模拟器,并安装 & 运行 个应用程序。

使用 fbsimctl 您可以构建目标应用程序并将其安装在每个模拟器上。我坚持的部分是如何构建和安装配套的 XCTestUI 运行ner 应用程序。

xcodebuild 似乎不允许在不调用测试操作的情况下构建 XCTestUI 运行ner 应用程序(导致多个模拟器打开的警报)。如果 xcodebuild 可以只为 运行ner 应用构建 .app/.ipa,那么看起来 fbsimctl 可以处理其余的。

facebook/xctool 上还有一个未解决的问题正在尝试解决此问题。

如果您在 mac 和某种持续集成系统上使用多个用户,则可以进行并行 UI 测试。如果操作正确,您可以同时在各种设备模拟器上 运行 您的 UI 测试套件。换句话说,您将能够 运行 针对许多设备进行所有 UI 测试,所花费的时间是 运行 在一台设备上进行这些测试所花费的时间 - 这就是我认为的试图在这里完成。以下是有关我如何获得并行 UI 测试和 运行 gitlab-ci-multi-runner 的说明。这些说明假设您从未使用过任何工具,但不是关于如何编写 UI 测试的说明:

  1. 通过 mac 应用商店安装 Xcode。
    • 打开 mac 应用商店。
    • 在搜索字段中输入 "Xcode"
    • 导航至 Xcode 安装页面并单击 "Install"
    • 注意:我在撰写本文时使用 Xcode 8.2。
  2. 安装Xcode 命令行工具。
    • 打开终端并输入以下命令xcode-select --install
    • 注意:您将需要 Xcodebuild,所以这一步很关键。
  3. 在您的 mac 上创建一些新的 "test" 用户。
    • 打开系统偏好设置并点击 "Users & Groups"。
    • 单击 window 左下角的锁定图标进行更改。
    • 输入"User Name"和"Password"然后点击"Unlock"。
    • 单击 mac 用户列表底部的“+”添加按钮。
    • Select "Administrator" 在 "New Account" 下拉菜单中。
    • 在 "Full Name" 文本字段中为您的用户命名(即测试用户一)
    • 单击 "Account Name" 文本字段并允许其自动填充。
    • 在 "Password" 文本字段中输入您选择的密码。
    • Re-enter 将密码输入 "Verify" 文本字段。
    • 可选择在 "Password Hint" 文本字段中输入密码提示。
    • 点击"Create User"。
    • 重复步骤二几次。注意:您创建的用户数量将决定一次 运行 通过您的 UI 测试套件的设备数量。在此解决方案中,我们将讨论 运行 在单个 mac.
    • 上同时针对多个不同设备进行测试。
  4. 在 gitlab.com 上创建一个帐户。
  5. 在gitlab上新建一个项目。
    • 这里有一个关于 how to do that 的教程。
    • 按照新项目详细信息页面上的 "Command line instructions" 将您的 Xcode 项目移动到 gitlab 存储库中。
  6. 为每个测试用户创建 SSH 密钥:
    • 登录您刚刚创建的每个 "test" 用户帐户。注意:重要的是每个用户都必须登录,这样 gitlab-ci 系统才能 运行 测试该用户。如果不是,测试将失败。
    • 再次打开终端并输入ssh-keygen -t rsa
    • 按照 this tutorial 完成此过程。
    • 导航到您的 gitlab "Profile Settings" 页面,然后转到 "SSH Keys" 选项卡。
    • 在终端中使用 pbcopy < ~/.ssh/id_rsa.pub 在每个 'test' 用户帐户中获取生成的 SSH 密钥,然后使用 cmd+v 将每个 SSH 密钥粘贴到 "Key" 文本字段中gitlab 中的 "SSH Keys" 选项卡。
    • 注意:每个 'test' 用户都可以在 gitlab 中访问您的项目代码,因此不要为任何测试用户跳过此步骤。
    • 注意:我个人喜欢通过在登录每个 "test" 用户时执行 git clone 来测试每个用户是否可以访问存储库。
  7. 创建测试 "runners" on/for 您的每个 "test" 用户在您的 mac 上。
    • 在 gitlab.com 上打开你的 gitlab 项目页面。
    • 单击项目设置图标。
    • 点击 "Runners" link.
    • 此页面上的重要信息是 URL 和页面 "How to setup a specific Runner for a new project" 部分下以红色突出显示的注册令牌。
    • 打开终端并输入 sudo curl --output /usr/local/bin/gitlab-ci-multi-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-darwin-amd64 然后点击 return。
    • 键入 sudo chmod +x /usr/local/bin/gitlab-ci-multi-runner 然后点击 return。
    • 键入 gitlab-ci-multi-runner install 然后点击 return。
    • 输入 gitlab-ci-multi-runner start 然后 return.
    • 键入 gitlab-ci-multi-runner status 然后点击 return 以确保服务是 运行ning。
    • 键入 gitlab-ci-multi-runner register 并点击 return。
    • 将上述 gitlab 页面中的 URL 复制并粘贴到终端中,然后点击 return。
    • 将上述 gitlab 页面中的令牌复制并粘贴到终端中,然后点击 return。
    • 为此 "test" 用户 运行 输入描述并点击 return。
    • 输入此特定 "test" 用户独有的标签并点击 return。
    • 键入 Shell 并点击 return。
    • 确认 运行ner 已经添加并且在你的 gitlab 运行ners 页面上有一个绿点网。
    • 注意:对于此解决方案来说,为您在 mac 到 运行 测试中设置的每个 "test" 用户设置单独的 运行ners 至关重要在不同的设备上并行。同样重要的是,你给你的每个人都赋予了不同的标签。"test" 用户 运行 用户,因此 gitlab 可以告诉每个 "test" 用户 运行 你的 UI 测试。
    • 打开终端并输入 nano /Users/{test user name}/.gitlab-runner/config.toml 并回车。
    • 在第一行中,将数字 "concurrent = 1" 替换为您创建的 "test" 用户数。然后按 shift+x、y,然后按 return 保存更改。
    • 注意:确保对每个用户都完成,以确保并行性。
  8. 为您的 Xcode 项目创建一个 UI 测试方案。
    • 单击要select哪个设备运行项目所在位置附近的方案下拉菜单。
    • Select "New Scheme".
    • 在 "Target" 下拉菜单 select 选项中,标题中包含 "UITests"。然后点击"OK"
    • 单击与上述相同的方案下拉菜单,然后单击 select "Manage Schemes"。
    • 确保复选框被选中以使 "UITests" 方案 "Shared"。
    • 点击关闭。
    • 在终端中键入 git add . 并点击 return 以确保包含方案文件。
    • 键入 git commit -am "Added ui test scheme" 并点击 return。
    • 键入 git push 并点击 return。
  9. 为您的项目创建一个 gitlab-ci.yml 文件。
    • 使用您选择的文本编辑器在项目的根文件夹中创建一个 gitlab-ci.yml 文件。
    • 这是我创建的示例项目的示例 yml 文件:

before_script:
  - carthage update
stages:
  - test
iphone_4s_tests:
  stage: test
  script:
    - xcodebuild test -configuration Debug -project parallel.xcodeproj -scheme parallelUITests -destination 'platform=iOS Simulator,name=iPhone 4s' | xcpretty --simple
  tags:
    - iphone_4s
iphone_5s_tests:
  stage: test
  script:
    - xcodebuild test -configuration Debug -project parallel.xcodeproj -scheme parallelUITests -destination 'platform=iOS Simulator,name=iPhone 5s' | xcpretty --simple
  tags:
    - iphone_5s
iphone_6_tests:
  stage: test
  script:
    - xcodebuild test -configuration Debug -project parallel.xcodeproj -scheme parallelUITests -destination 'platform=iOS Simulator,name=iPhone 6' | xcpretty --simple
  tags:
    - iphone_6

  • 重要说明:每个标签都应与安装在 "test" 用户上的每个 运行ners 上的标签相对应。这里的关键是您的测试套件将 运行 在单个设备
  • 在您的项目目录中,在终端中输入 git add .gitlab-ci.yml 并按回车键。
  • 输入 git commit -am "Added the .gitlab-ci.yml file to the project.",然后输入 return。
  • 输入 git push,然后输入 return。

砰!如果您已正确完成所有操作,那么您的 UI 与许多 iOS 设备并行测试的最疯狂的梦想终于实现了。您会注意到,当您导航到您的 gitlab 项目页面,然后导航到 "Piplines" 选项卡时,您的 UI 测试现在 运行 正在并行进行。 IMO 这是完成所有 UI 测试的最便宜和最有效的方法。在您的测试套件在一台设备上完成一轮的时间里,理论上您可以为您希望测试的所有设备完成 UI 测试。这种解决方案比尝试购买多台设备并让它们同时进行测试要便宜得多。一般来说,根据规格,单个 mac 可以 运行 一次 10 - 15 个设备,如果没有其他东西对 CPU 征税的话。

对于 运行 并行使用多个模拟器的 UITest,请查看 LinkedIn 提供的这个惊人的开源库 > https://github.com/linkedin/bluepill

查看 plu/pxctest 并行执行测试的工具 ios 模拟器。与 blue pill 相比,它更容易与项目集成。

https://github.com/plu/pxctest

使用 XCODE 9,您现在可以同时启动多个模拟器,还可以 运行 在多个设备上进行并行测试。

Please see this link for reference.

大家好,WWDC18 测试环节有什么新变化

https://developer.apple.com/videos/play/wwdc2018/403/

Hear about exciting improvements to code coverage, including how you can build your own automation on top of Xcode's coverage reports. Learn how to dramatically speed up the execution of your tests by leveraging distributed parallel testing, new in Xcode 10.