SBTUITestTunnelHost 2.1.0

SBTUITestTunnelHost 2.1.0

测试已测试
Lang语言 Obj-CObjective C
许可证 NOASSERTION
发布最后发布2023年1月

Tomas CaminTomas Camin 维护。



  • Tomas Camin

Version License Platform

概览

Apple 的 UI 测试框架是一个非常强大的工具,可以用来编写应用的 UI 测试。然而,有些边缘情况可能会使得测试变得困难甚至不可能编写。我们一直在开发这个工具,以覆盖我们在 UI 测试工作流程中不同的(一开始看似无关的)需求。

SBTUITestTunnelHost 包含一个 Mac 应用(服务器)以及一组用于在 UI 测试目标中使用的类,这使您能够:

  • 在 Mac 主机上从测试目标中启动 shell 命令。如果您的后端环境中有与后端交互的 shell 脚本(例如创建用户、删除用户、更改内容等),这可能会很有用。
  • 执行鼠标操作。我们使用此功能来与正在测试的应用进行非常快速的交互(例如非常快速且连续的滑动),这是使用 XCTest 的能力所不可能的。
  • 提供服务静态内容文件。当需要提供简单的静态内容时,无需安装完整的网页服务器。

CocoaPods 安装

我们强烈建议使用 cocoapods,它是将库嵌入项目中最容易的方法。您只需将 SBTUITestTunnelHost 添加到您的 UI 测试目标中。

手动安装

SBTUITestTunnelHost 中的文件添加到 UI 测试目标中。

使用方法

Mac 服务器应用程序

通过运行 brew install xcodegen 来安装 XcodeGen,然后启动 build_server.sh 脚本,该脚本将生成 SBTUITunnelHostServer.app 可执行文件。

SBTUITunnelHostServer.app 是一个 Mac 应用程序,它将在本地计算机的 8667 端口上启动服务器。服务器的当前状态将显示在 macOS 菜单栏中。

鼠标操作

要使 SBTUITestTunnelServer 能够与机器鼠标交互,您需要在系统偏好设置中 '安全性与隐私' > '隐私' 下显式 授权辅助功能权限。如果 SBTUITestTunnelServer 已经列出但鼠标交互不工作,请尝试删除条目并重新启动应用程序。设备边框应禁用 以正确工作该功能。

安全警告🔥🔥🔥

该工具仅用于测试环境,由于它允许访问和执行主机的命令,因此使用时请谨慎。请确保主机只能被可信任的客户端访问。

为了提高安全性,默认情况下应用程序将服务器绑定到 localhost。这意味着它将只接收运行工具的同一台机器上的请求,这在大多数情况下应该是没有问题的。

为了获得额外的安全性,使用具有 特定访问权限 的系统用户启动工具。

用户界面测试

在您的代码中,只需导入 SBTUITestTunnelHost。这将向 XCTest 类添加一个 host 属性,该属性是一个 SBTUITestTunnelHost 实例。

示例项目包含多个 Swift 和 Objective-C 测试,展示了不同的用法。

启动外壳命令

要远程执行命令,请调用 host.executeCommand(cmd),这将同步执行命令并返回 stdout 输出。

鼠标操作:单击

通过传递要点击的 XCUIElement 和指定点击后等待的时间(秒),创建一个 SBTUITunneledHostMouseClick 实例。这对于需要创建 [SBTUITunneledHostMouseClick] 序列的情况很有用。

这将执行元素 btn 上连续 3 次鼠标单击,之间有 50ms 的暂停。

let mouseClick = SBTUITunneledHostMouseClick(element: btn, completionPause: 0.05)
let mouseCliks = Array(repeating: mouseClick, count: 3)
host.execute(mouseCliks)

鼠标操作:拖动

通过传递要拖动的 XCUIElement 和拖动起止点的规范化坐标(值在 0.0 和 1.0 之间),创建一个 SBTUITunneledHostMouseDrag 实例。与单击类似,您还需要指定拖动后等待的时间(秒)。

这将执行元素 table 上连续 3 次鼠标拖动(向上滑动),每次拖动持续 100ms,之间有 50ms 的暂停。

let mouseDrag = SBTUITunneledHostMouseDrag(element: table,
                                           startNormalizedPoint: CGPoint(x: 0.5, y: 0.9),
                                           stopNormalizedPoint: CGPoint(x: 0.5, y: 0.1),
                                           dragDuration: 0.1,
                                           completionPause: 0.05)
let mouseDrags = Array(repeating: mouseDrag, count: 3)
host.execute(mouseDrags)

结果将是一个更快的滚动,如下面的演示所示。

serving files

直接向https://:8667/catfile?content-type=application/json&path=/tmp/tunnel-test发起GET请求。

Additional resources

如果您需要在UI测试中模拟或注入数据,请尝试SBTUITestTunnel

Contributions

欢迎贡献力量!如果您有bug报告,请通过开启新的issue或发送pull request来帮忙。

Authors

Tomas Camin (@tomascamin)

License

SBTUITestTunnelHost可在Apache License, Version 2.0下使用。有关更多信息,请参阅LICENSE文件。