You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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调用:

  1. 编写脚本文件(比如pre-test-script.sh):
#!/bin/bash
say "Pre build scripts running."
# 其他脚本逻辑
  1. 给脚本添加可执行权限:
chmod +x /path/to/pre-test-script.sh
  1. 在测试类的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:58:14