概览
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
License
SBTUITestTunnelHost可在Apache License, Version 2.0下使用。有关更多信息,请参阅LICENSE文件。