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

如何让XCTestCase中appSettings仅初始化一次(规避单例弊端)

问题描述

在以下代码中,appSettings变量会在每个测试用例中初始化一次。如何实现让它在整个测试类中仅初始化一次?如果使用单例,当多个测试类同时运行时会出现问题,因为它会在所有测试类中仅初始化一次。

final class TestsmthTests: XCTestCase {
        
        var appSettings = AppSettings()
    
        override func setUpWithError() throws {
    
        }
    
        func testExample() throws {
            
        }
        
        func testMore() throws {
            
        }
    }
解决方案

你可以借助XCTest的类级别初始化方法,配合静态变量实现需求。静态变量属于测试类本身,每个测试类的静态变量相互独立,既保证单个测试类内只初始化一次,又不会影响其他测试类。

方案一:类级别的setUp方法

重写测试类的setUp类方法,在整个测试类运行前执行一次初始化操作:

final class TestsmthTests: XCTestCase {
    // 静态变量,属于当前测试类
    static var appSettings: AppSettings!

    // 类级别的setUp,测试类所有用例执行前仅调用一次
    override class func setUp() {
        super.setUp()
        appSettings = AppSettings()
    }

    // 可选:类级别的tearDown,测试类所有用例执行完毕后清理资源
    override class func tearDown() {
        appSettings = nil
        super.tearDown()
    }

    func testExample() throws {
        // 通过类名访问静态变量
        let settings = TestsmthTests.appSettings
        // 测试逻辑...
    }
    
    func testMore() throws {
        let settings = TestsmthTests.appSettings
        // 测试逻辑...
    }
}

如果初始化过程可能抛出错误,iOS 13+、macOS 10.15+版本可以用类级别的setUpWithError:

override class func setUpWithError() throws {
    try super.setUpWithError()
    appSettings = try AppSettings() // 处理初始化可能的错误
}

方案二:静态常量直接初始化

利用Swift静态属性的延迟初始化特性,直接声明静态常量,它会在第一次被访问时初始化,且整个测试类生命周期内仅初始化一次:

final class TestsmthTests: XCTestCase {
    // 静态常量,自动延迟初始化,单个测试类内仅初始化一次
    static let appSettings = AppSettings()

    func testExample() throws {
        let settings = TestsmthTests.appSettings
        // 测试逻辑...
    }
    
    func testMore() throws {
        let settings = TestsmthTests.appSettings
        // 测试逻辑...
    }
}

这种方式更简洁,无需重写类初始化方法,且不同测试类的静态常量相互独立,不会出现跨类干扰的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:45:56