Xcode Scheme预操作脚本仅在首个测试前触发问题咨询
Xcode UI测试Pre-action脚本仅在首个用例执行前触发的解决办法
问题说明
在Xcode 14.3.1中配置了UI测试方案的Pre-action脚本,期望每个测试用例运行前执行,但实际仅在第一个测试用例启动前触发,可通过say "Pre build scripts running."命令验证此现象。
原因分析
Xcode的测试方案Pre-action属于整个测试任务的前置构建动作,只会在测试宿主App首次启动、测试任务初始化时执行一次,而非每个测试用例单独触发。
解决办法
方法1:重写测试用例的setUp方法
在UI测试类中重写setUp()方法,将前置逻辑放入其中,Xcode会在每个测试用例执行前自动调用该方法。
示例代码(Swift):
import XCTest class YourUITests: XCTestCase { let app = XCUIApplication() override func setUp() { super.setUp() // 执行前置脚本逻辑,比如调用say命令 let task = Process() task.launchPath = "/usr/bin/say" task.arguments = ["Pre build scripts running."] task.launch() task.waitUntilExit() // 测试通用配置 continueAfterFailure = false app.launch() // 若需要每个用例重启App,可放在此处 } // 测试用例示例 func testExample1() { // 测试逻辑 } func testExample2() { // 测试逻辑 } }
方法2:封装Shell脚本并在setUp中调用
如果必须使用独立的Shell脚本文件,可将脚本封装后,在setUp中通过Process调用:
- 编写脚本文件(比如
pre-test-script.sh):
#!/bin/bash say "Pre build scripts running." # 其他脚本逻辑
- 给脚本添加可执行权限:
chmod +x /path/to/pre-test-script.sh
- 在测试类的
setUp中调用:
override func setUp() { super.setUp() let task = Process() task.launchPath = "/path/to/pre-test-script.sh" // 若需要传递环境变量,可设置task.environment task.launch() task.waitUntilExit() app.launch() }
注意事项
- 若需要每个测试用例都重启App,确保
app.launch()放在setUp中,而非setUpWithError或全局初始化处。 - 脚本执行耗时过长可能导致测试超时,需控制脚本逻辑的执行时间。
内容的提问来源于stack exchange,提问作者Zhou Haibo
相关产品推荐
相关产品推荐

