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
相关产品推荐
相关产品推荐

