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

Swift XCUITest 报错:'app' 不在作用域内的问题求助

解决XCUITest中"Cannot find 'app' in scope"错误

问题根源

你遇到的错误是因为app变量的作用域问题:在父类CandySearchUITestsLaunchTests中,app是testLaunch方法内的局部变量,子类CandySearchUITests的测试方法无法访问这个局部变量,因此编译器提示找不到app。

解决方案

推荐两种可行的修复方式,优先选择第一种以符合XCUITest最佳实践:

方案1:将app定义为父类的实例属性(推荐)

把app提升为父类的实例属性,并在setUpWithError方法中统一初始化和启动App,这样所有子类的测试方法都能直接继承并使用这个变量:

修改CandySearchUITestsLaunchTests代码:

import XCTest

class CandySearchUITestsLaunchTests: XCTestCase {
    var app: XCUIApplication! // 定义为类的实例属性

    override class var runsForEachTargetApplicationUIConfiguration: Bool {
        true
    }

    override func setUpWithError() throws {
        continueAfterFailure = false
        app = XCUIApplication() // 在setUp中初始化App实例
        app.launch() // 统一启动App
    }

    func testLaunch() throws {
        // 直接使用已初始化的app变量
        let attachment = XCTAttachment(screenshot: app.screenshot())
        attachment.name = "Launch Screen"
        attachment.lifetime = .keepAlways
        add(attachment)
    }
}

修改后,子类CandySearchUITests中的原代码无需改动,app变量会自动继承自父类,作用域覆盖所有测试方法。

方案2:在子类测试方法中单独初始化app

如果不想修改父类,也可以在每个测试方法内单独创建并启动app实例,但会产生重复代码:

修改CandySearchUITests代码:

class CandySearchUITests: CandySearchUITestsLaunchTests {
    
    func testTapOnChocolateBarItem() throws {
        let app = XCUIApplication()
        app.launch() // 每个测试方法单独启动App
        
        // 后续测试逻辑保持不变
        XCTAssertTrue(app.images["candySearchLogo"].exists)
        app.tables.staticTexts["Chocolate Bar"].tap()
        let chocolateNavigationBar = app.navigationBars["navigationBar"]
        XCTAssertTrue(chocolateNavigationBar.staticTexts["Chocolate"].exists)
        XCTAssertTrue(app.staticTexts["Chocolate Bar"].exists)
        chocolateNavigationBar.buttons["Back"].tap()
        XCTAssertTrue(app.images["candySearchLogo"].exists)
    }
}

注意事项

XCUITest默认每个测试方法都是独立运行的,setUpWithError会在每个测试方法执行前调用,方案1的写法能保证每次测试都从App初始状态开始,避免测试间的状态污染。

内容的提问来源于stack exchange,提问作者Martin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:30:54